用ADO方式连接SQL SEVER的几个简单步骤

来源:互联网 发布:淘宝众筹是什么意思 编辑:程序博客网 时间:2024/05/16 15:44

   特别注意:在程序中如果m_pConnection->Execute 执行的SQL语句语法不正确或者 在数据库中这个SQL语句执行后无返回结果而又在程序中想获得它的返回结果。程序会出错

  其步骤一般分为:
(1)     引入ADO动态库文件
(2)     初始化COM环境
(3)     连接数据库操作数据

1、引入ADO库文件,一般是在stdAfx.h文件中添加(在你需要添加的头文件中添加)

#import "E:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")

上面所包含的路径已实际路径为准,我的是E盘下的,rename("OldName,""NewName"): rename属性用于解决名称冲突的问题。若该属性被指定,编译器将在类型库中的OldName的所有出现的地方用结果头文件中用户提供的NewName替换。此属性用于类型库中的一个名称和系统头文件中的宏定义重合时。

这条语句会在工程所在目录生成msado15.tlh和msado15.tli两个文件。


2、初始化Com环境

::CoInitialize(NULL);   //初始化COM环境,在需要连接数据库的.cpp中添加 

::CoUninitialize();   //释放COM环境,在断开数据库连接后添加


3、连接数据库操作数据

声明智能指针,通过这些指针可以很容易的创建和删除ADO对象

_ConnectionPtr  m_pConnection; 
_RecordsetPtr    m_pRecordset;  
_CommandPtr    m_pCommand; 

下面在”连接函数“代码中说明如何用

BOOL OnInitADOConn(){::CoInitialize(NULL);//初始化COM环境try{m_pConnection.CreateInstance("ADODB.Connection");//创建连接对象实例_bstr_t strConnect = "Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=book;Data Source=."; //关于数据库连接的各项信息m_pConnection->Open(strConnect, "", "", adModeUnknown);//使用Open方法连接数据库}catch (_com_error e){MessageBox(NULL, "数据库连接失败", "提示", MB_ICONINFORMATION);return FALSE;}return TRUE;}

//注意,我这里写的连接字符串strConnect是通过以下步骤的得到的:

//1、新建一个文件,名字任意取,后缀名必须为udl(如何hello.udl)

//2、双击hello.udl文件,进入数据连接属性面板,

       


//3、测试连接成功后,再以记事本方式打开,第三行的数据就是连接字符。

下面的代码是”断开连接“的函数

void AdoSql::ExitConnect(){if (m_pRecordset != NULL)m_pRecordset->Close();m_pConnection->Close();::CoUninitialize();}


下面是示例代码:

#import "E:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")  //导入库文件int main(){   OnInitADOConn();//初始化和连接数据库    bstrSQL = "SELECT UserName FROM YongHu";   m_pRecordset =m_pConnection->Execute(bstrSQL, &RecordsAffected, adCmdText);   _variant_t varName;   varName = m_pRecordset->GetCollect("UserName");//获取表YongHu中的列UserName的第一个值   m_pRecordset->MoveNext();   varName = m_pRecordset->GetCollect("UserName");//获取表YongHu中的列UserName的第二个值   ........   ExitConnect();//断开连接   return 0;}






常用操作:

1、打开记录集

m_pRecordset=m_pConnection->Execute(CommandText,RecordsAffected,Options)
说明如下:
 CommandText:包含要执行的SQL语句,表名、存储过程名或特定提供者的文本;
 RecordsAffected:可选,长整型,提供者返回操作的影响的记录数目;
 Options:常量,可选,长整型,具体如下:
  adCmdText:指示提供者应将CommandText赋值为命令的文本定义
  adCmdTable:返回CommandText命名的表中的所有行
  adCmdTableDirect:与上类同,返回表的所有行
  adCmdStoredProc:应将CommandText赋值为存储过程
  adCmdUnknown:CommandText参数中的命令类型未知
  adExecuteAsync:命令应异步执行
  adFetchAsync:指示CacheSize属性指定的初始数量之后的行应异步提取。
 例:m_pRecordset=m_pConnection->Execute(L"select * from p_users",NULL,adCmdText


2、使用记录集

A、读取数据
  _variant_t varValue;
  varValue=m_pRecordset->GetFields()->GetItem((long)i)->Value;//读取当前记录的第i+1个字段的值
  varValue=m_pRecordset->GetFields()->GetItem((long)i)->Name;//读取当前记录的第i+1个字段的名字
  也可根据字段名来访问该字段的值:
  varValue=m_pRecordset->GetCollect(L"字段名"); //读取当前记录的第i+1个字值的值

     读取这个字段的下一个值只需要将指针向下移动一次即可

      m_pRecordset->MoveNext()

     varValue=m_pRecordset->GetCollect(L"字段名")//第i+2个字值的值


B、更新数据
  _bstr_t bstrValue="新数据";
  m_pRecordset->GetFields()->GetItem((long)i)->Value=bstrValue; //更新当前记录第i+1个字段的值
  m_pRecordset->Update();
C、添加数据
  if (m_pRecordset->Support(adAddNew)&&m_pRecordset->Support(adUpdate))
  {
    m_pRecordset->AddNew();//插入一条新记录
    m_pRecordset->GetFields()->GetItem((long)0)->Value=L"YP00100"; //为每个字段赋值
    m_pRecordset->GetFields()->GetItem((long)1)->Value=L"速效感冒胶囊";
    m_pRecordset->GetFields()->GetItem((long)2)->Value=L"SXGMJN";
    m_pRecordset->Update();//更新记录集
  }
D、删除数据
  m_pRecordset->Delete(adAffectCurrent);//默认,仅删除当前记录
  m_pRecordset->Delete(adAffectGroup);//删除满足当前Filter属性设置的记录。

 以上操作相对麻烦,采用Connection对象的Execute方法,可能更简单些,举例如下:
 添加数据:
  CString sSql,sName,sXingBie,sStipend,sID;
  sName="张三";
  sXingBie="男";
  sStipend="2200";
  sID="5";
  sSql.Format("insert into 员工信息表 Value(%s,%s,%s,%s)",sName,sXingBie,sStipend,sID);
  m_pRecordset=m_pConnection->Execute((_bstr_t)sSql,NULL,adCmdText);
  
  其它操作类同。

记得一定要用try和catch,否则ADO调用错误有可能使你的程序崩溃,一定要随时记得捕捉_com_error例外以及其它错误。

我尽可能的使代码简单,所以省略了很多细节,尤其是忽略了很多好的编程习惯(比如检查大多数COM方法都返回的HRESULT值)。



0 0
原创粉丝点击