终于解决了

从昨天晚上搞到今天下午,于搞定了。什么问题呢,其实很菜的一个问题,就是用ADO来连接SQL Server数据库的问题。

起初是按照很多书上和网上,貌似MSDN上也是如此都是用 

_bstr_t strConnect = " Provider=SQLOLEDB; Server=server_name; "" Database=database_name; uid=user_name; pwd=password; "

 

的连接字符串进行连接,起初是发现在_pRecordsetd的open的时候发现错误,后来跟踪到了_ConnectionPtr发现这个连接智能指针进行open的时候就已经出问题了,后来就一直在这个连接字符串上打转转,试了不下N种方法,还是出错,然后再试,都快崩溃了,准备放弃。所以怀疑是不是因为SQL Server也有试试是不是也要设置一个ODBC的数据源(汗!自己对ADO不了解才会如此),后来看了一下网上的文章,发现这种是直接通过OLE DB Provider建立连接,所以无须建立数据源。

于是我想先试试用ODBC数据源的方式来试试,于是有

_bstr_t strConnect = " DSN=test1; Database=pubs; uid=sa; pwd=********; " ;

 

然后就是按照套路走_RecordsetPtr的open方法中传递进_ConnectionPtr智能指针对象,并执行select* from authors进行查询,然后将查询的结果保存成XML的格式,发现真的成功了,于是很高兴。

但是发现一个问题:
  希望有高手能告知,就是当建立数据源之后,我把本机上的sql serverd的服务器关掉之后,还是可以连接成功,而且记录集可以正常的执行查询,并将查询结果保存为一个XML文件,这是很让我费解的事情!

我估计的可能:

  从连接字符串的区别可以看出来,数据源方式的连接字串,没有Server=server_name这一项,也就是说连接的时候不经过sql server服务器,而只是连接到数据源(通过数据源驱动程序)找到指定的数据库,只要密码和帐号正确就可以访问。因为不牵扯到sql server服务器,所以即使服务器关掉之后,也可以通过如下的方式访问数据源中的数据库:

(client端程序->ODBC驱动程序管理器->ODBC驱动程序->关系数据库(pubs) )

接着把strConnect换成Provider的那种形式,发现还是无法连接上,后来想知道错误究竟处在什么地方?当然想到了tyy catch

,其实原先也有try catch但是只是我用来表示是否出错的一个摆设,只是在catch中输出一句话而已表示出错了。后来在理清思路之后感觉是有必要明确到底问题出在什么地方,于是想起来了那个成摆设的_com_error& e,因该能从对象e中获取到一定信息吧,于是尝试着输出e的成员函数,这些函数有几个返回的好像是const char*,而且从函数名称就可以看出来是输出出错信息的。主要是e.ErrorMessage()和e.Description(),其中e.ErrorMessage返回的错误的号码如0016c868但是查了一下不得要领,然后试着输出e.Description(),才得到如下提示:连接字符串属性无效,于是上网上搜了一下,最后在百度知道中找到答案,原话是“这个问题一天都回答了N遍了,不要用ovider,直接用Driver ”,然后我就把

_bstr_t strConnect( " provider=SQLOLEDB;DataSource=**; InitialCatalog=Pubs;  UserId=sa;Password=*******; " );

 

改成了

_bstr_t   strConnect( " driver={sql server}; server=**; UID=sa; PWD=******; Database=pubs "  )

 

后来发现还可以改成如下的(根据孙鑫VC视频中的代码)

_bstr_t   strConnect="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=******;Initial Catalog=pubs";

pConn->Open("","","",adConnectUnspecified);

 

然后就OK了,终于OK了不然就疯掉了。看来try catch还是很重要的,通过这次的经验发现try catch还是很重要的。

后面通过m_pRecordset->Save("D:\\pubs.xml",adPersistXML);然后就看到了下面的文件

终于解决了_第1张图片

大功告成了!

你可能感兴趣的:(终于解决了)