C#如何用ADO连接SQL SERVER数据库
- 提问者网友:謫仙
- 2021-02-20 12:10
- 五星知识达人网友:舊物识亽
- 2021-02-20 13:19
连接语句:
SqlConnection con=new SqlConnection("server=.;database=数据库名称";uid=用户名;pwd=密码);
- 1楼网友:掌灯师
- 2021-02-20 17:11
- 2楼网友:一秋
- 2021-02-20 15:47
- 3楼网友:躲不过心动
- 2021-02-20 14:57
#import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename("eof" adoeof")
这行语句声明在工程中使用ado,但不使用ado的名字空间,并且为了避免常数冲突,将常数eof改名为adoeof。现在不需添加另外的头文件,就可以使用ado接口了。 2、初始化ole/com库环境 必须注意的是,ado库是一组com动态库,这意味应用程序在调用ado前,必须初始化ole/com库环境。在mfc应用程序里,一个比较好的方法是在应用程序主类的initinstance成员函数里初始化ole/com库环境。bool cmyadotestapp::initinstance() { if(!afxoleinit())//这就是初始化com库 { afxmessagebox(“ole初始化出错!”); return false; } …… }
3、ado接口简介 ado库包含三个基本接口:_connectionptr接口、_commandptr接口和_recordsetptr接口。 _connectionptr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的sql语句,如一个存储过程。 使用_connectionptr接口返回一个记录集不是一个好的使用方法。对于要返回记录的操作通常用_recordserptr来实现。而用 _connectionptr操作时要想得到记录条数得遍历所有记录,而用_recordserptr时不需要。 _commandptr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和sql语句。在使用_commandptr接口时,你可 以利用全局_connectionptr接口,也可以在_commandptr接口里直接使用连接串。如果你只执行一次或几次数据访问操作,后者是比较好 的选择。但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_connectionptr接口创建一个数据连接,然后使用 _commandptr接口执行存储过程和sql语句。 _recordsetptr是一个记录集对象。与以上两种对象相比,它对记 录集提供了更多的控制功能,如记录锁定,游标控制等。同_commandptr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连 接指针赋给_recordsetptr的connection成员变量,让它自己创建数据连接。如果你要使用多个记录集,最好的方法是同command对 象一样使用已经创建了数据连接的全局_connectionptr接口 ,然后使用_recordsetptr执行存储过程和sql语句。 4、使用_connectionptr接口 _connectionptr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个odbc dsn。_connectionptr pconn; if (failed(pconn.createinstance("adodb.connection"))) { afxmessagebox("create instance failed!"); return; } cstring strsrc; strsrc="driver=sql server;server="; strsrc+="suppersoft"; strsrc+=";database="; strsrc+="mydb"; strsrc+=";uid=sa;pwd="; cstring strsql = "insert into student(no,name,sex,address) values(3,'aaa','male','beijing')"; _variant_t varsrc(strsrc); _variant_t varsql(strsql); _bstr_t bstrsrc(strsrc); if (failed(pconn->open(bstrsrc,"","",-1))) { afxmessagebox("can not open database!"); pconn.release(); return; } colevariant vtoptional((long)disp_e_paramnotfound,vt_error); pconn->execute(_bstr_t(strsql),&vtoptional,-1); pconn.release(); afxmessagebox("ok!");
5、使用_recordsetptr接口(以连接sql server为例)_recordsetptr pptr; if (failed(pptr.createinstance("adodb.recordset"))) { afxmessagebox("create instance failed!"); return false; } cstring strsrc; strsrc="driver=sql server;server="; strsrc+="210.46.141.145"; strsrc+=";database="; strsrc+="mydb"; strsrc+=";uid=sa;pwd="; strsrc+="sa"; cstring strsql = "select id,name,gender,address from personal"; _variant_t varsrc(strsrc); _variant_t varsql(strsql); if(failed(pptr->open(varsql,varsrc,adopenstatic,adlockoptimistic,adcmdtext))) { afxmessagebox("open table failed!"); pptr.release(); return false; } while(!pptr->getadoeof()) { _variant_t varno; _variant_t varname; _variant_t varsex; _variant_t varaddress; varno = pptr->getcollect ("id"); varname = pptr->getcollect ("name"); varsex = pptr->getcollect ("gender"); varaddress = pptr->getcollect ("address"); cstring strno =(char *)_bstr_t(varno); cstring strname =(char *)_bstr_t(varname); cstring strsex =(char *)_bstr_t(varsex); cstring straddress =(char *)_bstr_t(varaddress); strno.trimright(); strname.trimright(); strsex.trimright(); straddress.trimright(); int ncount = m_list.getitemcount(); int nitem = m_list.insertitem (ncount,_t("")); m_list.setitemtext (nitem,0,strno); m_list.setitemtext (nitem,1,strname); m_list.setitemtext (nitem,2,strsex); m_list.setitemtext (nitem,3,straddress); pptr->movenext(); } pptr->close(); pptr.release();
6、使用_commandptr接口 _commandptr接口返回一个recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_commandptr接口的方法: 代码:使用_commandptr接口获取数据_commandptr pcommand; _recordsetptr prs; pcommand.createinstance(__uuidof(command)); pcommand->activeconnection=pconn; pcommand->commandtext="select * from student"; pcommand->commandtype=adcmdtext; pcommand->parameters->refresh(); prs=pcommand->execute(null,null,adcmdunknown); _variant_t varvalue = prs->getcollect("name"); cstring strvalue=(char*)_bstr_t(varvalue);
7、 关于数据类型转换由于com对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此cstring 类和com对象是不兼容的,我们需要一组api来转换com对象和c++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了 通用的方法转换com对象和c++类型的数据。