SQLServer2008远程连接

本文介绍了使用ADO接口实现SQL Server远程连接的过程,包括引入ADO库文件、初始化OLE/COM环境、连接数据库以及查询数据库信息的详细步骤。通过实例演示了如何在应用程序中建立与远程数据库的连接,并展示如何获取和显示数据库中的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vc++(MFC)

实现

SQL 

Server

的远程连接(

ADO

实现)

 

 

ADO

 

       ADO

Microsoft

访

 

OLE DB 

便

使

OLE.DB 

访

ADO 

使

、速

、内

使

OLE 

 

ADO

SQL Server

 

1

ADO

      

使

ADO

stdafx.h

#import

A

 

#include <comdef.h> 

#include <icrsint.h> 

#import "C:\program files\common files\system\ado\msado15.dll" \ 

         no_namespace rename("EOF", "ADOEOF")     

使

ADO

,但

使

ADO

"ADOEOF"

使

ADO

 

2

OLE/COM

    

InitInstance()

OLE/COM

 

BOOL ****** ::InitInstance

 

      

 //

 

    

 if (!AfxOleInit())//

OLE/COM

         

   { 

        AfxMessageBox("OLE

"); 

         return FALSE; 

    }

 

      ................

 

3

 

_ConnectionPtr

_RecordsetPtr

 

_ConnectionPtr

 m_pConnection;  

 

_RecordsetPtr

 m_pRecordset; 

 

HRESULT 

hr; 

try 

   hr = m_pConnection.CreateInstance("ADODB.Connection");

 

   if (

SUCCEEDED(hr

)) 

   {  

            //connect database 

    

   

_bstr_t

 

strConnect="Provider=SQLOLEDB.1;Initial Catalog=“

”;Data Source=

IP"; 

          hr = 

m_pConnection->Open(

strConnect,"

","

",

adModeUnknown

); 

    AfxMessageBox("

"); 

   } 

   

catch

 

(_com_error e

  

CString 

errormessage; 

   errormessage.Format("

\r\n

:%s",e.ErrorMessage());

 

   AfxMessageBox(errormessage); 

   return  

4

 

listctrl

m_list 

winfo

id

name

ip

 

listctrl

 

m_list.InsertColumn(0,"ID"); 

m_list.InsertColumn(1,"Name"); 

m_list.InsertColumn(1,"IP"); 

CRect rect3; 

m_list.GetClientRect(rect3); 

m_list.SetColumnW

idth(0,rect3.W

idth()/3);

 

m_list.SetColumnW

idth(1,rect3.W

idth()/3);

 

m_list.SetColumnW

idth(2,rect3.W

idth()/3);

 

 

int intm; 

try 

   

_variant_t

 RecordsAffected;  

   m_pRecordset = 

m_pConnection->Execute

("

SELECT

 id

name

ip 

from

   winfo",&RecordsAffected,adC

   while(!m_pRecordset->ADOEOF) 

   { 

   

_variant_t

 ID, Name, IP; 

    ID= 

m_pRecordset->GetCollect

("id"); 

    Name=

m_pRecordset->GetCollect

("name"); 

    IP=

m_pRecordset->GetCollect

("ip"); 

    intm=m_list.InsertItem(0,(_bstr_t)ID);

 

    m_list.SetItem(intm,1,1,(_bstr_t)IP,NULL,0,0,0);

 

    m_list.SetItem(intm,2,1,(_bstr_t)Name,NULL,0,0,0); 

    m_pRecordset->MoveNext(); 

   } 

   m_pRecordset->Close(); 

   catch (_com_error e) 

   { 

    CString errormessage; 

    errormessage.Format("

\r\n

:%s",e.ErrorMessage());

 

    AfxMessageBox(errormessage); 

   return  

   } 

id 

name 

ip

listctr

 

5

 

 

       

COM

使

CString 

COM

COM

C++

_vatiant_t

_bstr_t

COM

 

一个使用ADO连接池的示例,演示了TADOStoredProc动态参数的使用,带重连机制 =================== unit UnitDemo; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; //数据库服务器 gDBServer: String = '127.0.0.1'; //数据库名称 gDBName: String = 'master'; //数据库用户名 gDBUser: String = 'sa'; //密码 gDBPass: String = '2001'; implementation {$R *.dfm} uses ADODB, UnitADOConnectionPool; const CreateSQL = 'create procedure TestMyPool (@type sysname) '#13#10+ 'as'#13#10+ 'select * from sysobjects where xtype=@type'#13#10+ 'return @@rowcount'; DeleteSQL = 'if Exists(select 1 from sysobjects where xtype=N''P'' and name=N''TestMyPool'')'#13#10+ ' drop procedure TestMyPool'; var gPoolMan: TADOConnPoolMan = Nil; procedure TForm2.Button1Click(Sender: TObject); var ADOObject:TADOConnPoolObject; ADOStoredProc:TADOStoredProc; Running :Integer; I: Integer; begin //取得一个存储过程资源(含一数据库有效连接) ADOObject := gPoolMan.CreateSP('TestMyPool'); if ADOObject = Nil then //取得资源失败 Exit; try ADOStoredProc := ADOObject.ExecObject as TADOStoredProc; Running := 2;//允许重试(两次)操作,以便在操作失败之后达到重连 while Running>0 do begin Dec(Running); if ADOObject.NeedRefresh then begin//判断是否有重连标志(比如数据库断开等,可能需要进行重连) if Not ADOObject.Reconnect then Exit; ADOObject.NeedRefresh := Not ADOStoredProc.Parameters.Refresh; if ADOObject.NeedRefresh then Exit; end; for I := 1(*Zero is the *Result* Parameter*) to ADOStoredProc.Parameters.Count - 1 do begin //========================= //传递参数 ADOStoredProc.Parameters.Items[I].Value := 'U'; //========================= end; if Running 0 then try //执行存储过程 ADOStoredProc.Open; //执行存储过程成功,退出循环进入后续的数据处理 break; except On E:Exception do begin //执行失败非程序级的异常通常有两种可能: //1.数据库连接断开 //2.自适合的参数传递当中可能存储过程已更新,参与不一致 //设置重连标志 ADOObject.NeedRefresh := True; //=================== //这里记录数据库操作失败日志 //=================== end; end; Exit; end; //========================== //从ADOStoredProc当中读取记录 ShowMessage(IntToStr(ADOStoredProc.Parameters.ParamByName('Result').Value)); //========================== //关闭存储对象的资源 ADOStoredProc.Close; finally //调用结束,释放资源 ADOObject.Free; end; end; procedure TForm2.FormCreate(Sender: TObject); var ADOConn:TADOConnection; begin (****************BEGIN*******************) (*注:仅为测试准备 *) //初始化测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); ADOConn.Execute(CreateSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) //初始化连接池 gPoolMan := TADOConnPoolMan.Create(gDBServer,gDBUser,gDBPass,gDBName,true); end; procedure TForm2.FormDestroy(Sender: TObject); var ADOConn:TADOConnection; begin //释放连接池 if Assigned(gPoolMan) then gPoolMan.Free; (****************BEGIN*******************) (*注:仅为测试准备 *) //清理测试环境 ADOConn := Nil; if Not TADOConnPoolMan.ConnectADO( gDBServer,gDBUser,gDBPass,gDBName,true,ADOConn) then Exit; try ADOConn.Execute(DeleteSQL); finally try ADOConn.Close; except end; ADOConn.Free; end; (*****************END********************) end; end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值