ADO对象连接SQL SERVER

本文介绍如何在 C++ 控制台应用程序中使用 ADO 对象连接 SQL Server 数据库,包括创建对象、连接数据库、执行 SQL 语句等步骤,并提供了完整的示例代码。

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

 注:以下内容转自朋友的BLOG,原文地址为 http://blog.sina.com.cn/s/blog_50391e000100d15h.html

 

 

 

前段时间一直在学习ADO对象连接SQL SERVER,在网上查找资料时发现,网上大部分相关的文章都是MFC下的连接数据库,对于像我们这样的新手来说MFC本来就不好掌握,因此写这篇在控制台下用C++使用ADO对象连接数据库的博文希望对广大新手有所帮助。小弟我也是菜鸟一个,如果有写的不对的地方请大家多多包涵。

 

(1).将ado对象所要用到的动态链接库加入工程可以使用 #impotr命令

#import "C:/Program Files/Common Files/System/ado/msado15.dll"

 

(2).创建ado的几个重要对象指针

_ConnectionPtr con;   主要负责数据库的连接

_RecordsetPtr rec;    主要负责对记录集的操作

_CommandPtr com;      主要用来保存SQL语句,使用该对象里保存的SQL语句对数据库进行操作  

 

(3).在声明完这三个对象指针后,就要为他们实例化,可以调用各个对象的实例化函数CreateInstance()

con.CreateInstance(__uuidof(Connection)); 
com.CreateInstance(__uuidof(Command));
rec.CreateInstance(__uuidof(Recordset));
 

(4).使用con对象连接数据库

con带有Open函数用以连接数据库

Open()有四个参数分别是 :

       ConnectionString 属性,包含用于建立连接数据源的信息。

       UserID,     数据库用户名

       Password,   密码

       Options     决定该方法是在连接建立之后(异步)还是连接建立之前(同步)返回

 

(5).打开数据集(其实就是打开某个表)

rec对象的Open函数用以打开表

Open()函数有五个参数分别是:

      Source,           可以是SQL 语句、表名、存储过程调用或持久 Recordset 文件名

      ActiveConnection, 有效 Connection 对象变量名;

      CursorType,       确定提供者打开 Recordset 时应该使用的游标类型

      LockType,         确定提供者打开 Recordset 时应该使用的锁定(并发)类型

      Options           长整型值,用于指示提供者如何计算 Source 参数 

如果想知道参数的更具体内容请参看ADO手册。

 

 

(6).用sql语句对记录集进行操作

利用com->ActiveConnection=con;将com对象和已经和数据库建立连接的con相关联。

com->CommandText成员可以用来保存SQL语句,例如:com->CommandText="select * from color"
使用com->Execute(NULL,NULL,adCmdText);将保存在com对象中的sql语句用于相应的表。

 

(7).利用RecordsetPtr对象对记录集进行一些操作

MoveFirst();读取第一条记录

MoveNext();读取下一条记录

AddNew(); 增加新表项

Update(); 更新表

Delete(); 删除
利用rec->Fields->GetItem("cname")->Value访问数据

Fields是Recordset对象的容器,GetItem方法返回Field对象,Value是Field对象的属性,也可以用GetValue方法

 

(8).关闭连接

调用Close()关闭连接函数

调用CoUninitialize()注销COM环境

 

 

关于一些数据类型

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

wchar_t实际上被定义为unsigned short类型,也就是无符号短整型。

 

 

具体代码如下:

 

#include <iostream>
#include <string.h>
using namespace std;
#undef EOF

#import "C:/Program Files/Common Files/System/ado/msado15.dll"
using namespace ADODB;

 

int main()
{

try
 {
     _ConnectionPtr con;   

     _RecordsetPtr rec;     
     _CommandPtr com; 
  
     CoInitialize(NULL);         //初始化COM环境

 

     con.CreateInstance(__uuidof(Connection)); //实体化三大对象
     com.CreateInstance(__uuidof(Command));
     rec.CreateInstance(__uuidof(Recordset));

 

    con->ConnectionString="provider=sqloledb; server=localhost; database=soupcty";

    con->Open(con->ConnectionString, "sa", "1234", -1);//连接数据库

 

    rec->Open("color", _variant_t((IDispatch*)con),adOpenDynamic,adLockOptimistic, adCmdTable);//打开表

 

   com->ActiveConnection=con;
  

   com->CommandText="insert into color values (11,'green','yes')";

   com->Execute(NULL,NULL,adCmdText);


  rec->MoveFirst();  //读取第一条记录


  while (rec->EOF == VARIANT_FALSE)   //检查是否到达文件尾
  {

    char buf[1024];
    int id;

    id =rec->Fields->GetItem ("cid")->Value.intVal;
   cout << id << '/t';


   wchar_t *cname;

   name = rec->Fields->GetItem("cname")->Value.bstrVal;
   WideCharToMultiByte(CP_ACP, 0, cname, -1, buf, 1024, NULL, NULL);  

   //将读取的数据放入自定义缓存,方便输出
   cout << buf << '/t';

 

   wchar_t *basecolor;

   basecolor =rec->Fields->GetItem("basecolor")->Value.bstrVal;
   WideCharToMultiByte(CP_ACP, 0, basecolor, -1, buf, 1024, NULL, NULL);
   cout << buf << '/n';


   rec->MoveNext();  //读取下一条记录


  }

  
  //增加新数据
  rec->AddNew();
  rec->PutCollect("cid",2l);
  rec->PutCollect("cname", (_variant_t)("white"));
  rec->PutCollect("basecolor", _variant_t("no"));
  rec->Update();

 //修改数据
  rec->MoveFirst();
  rec->PutCollect("cname",(_variant_t)("blue"));
  rec->Update();

  //删除数据
  rec->MoveFirst();
  rec->Move(2);
  rec->Delete(adAffectCurrent);
  rec->Update();

  rec->Close();        //关闭打开的记录集

  con->Close();        //关闭和数据库的连接


  CoUninitialize();    //注销COM环境

  return 0;

}
 catch(_com_error &e)
 {
  cout << e.ErrorMessage() << endl;
  return 1;
 }

}

 

更多详情请参考ADO手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值