永发信息网

C#如何用ADO连接SQL SERVER数据库

答案:4  悬赏:70  手机版
解决时间 2021-02-20 17:45
C#如何用ADO连接SQL SERVER数据库
最佳答案
在C#中不再使用ADO,而是更强大的ADO.NET
连接语句:
SqlConnection con=new SqlConnection("server=.;database=数据库名称";uid=用户名;pwd=密码);
全部回答
来C#吧找找
SqlConnection myConnection = new SqlConnection("sqlserver=.;database=;uid=sa;pwd=;");
一、ado概述   ado是microsoft为最新和最强大的数据访问范例 ole db 而设计的,是一个便于使用的应用程序层接口。ado 使您能够编写应用程序以通过 ole. db 提供者访问和操作数据库服务器中的数据。ado 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ado 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ado,是用了一个比较熟悉的暗喻,ole 自动化接口。   ole db是一组”组件对象模型”(com) 接口,是新的数据库低层接口,它封装了odbc的功能,并以统一的方式访问存储在不同信息源中的数据。ole db是microsoft uda(universal data access)策略的技术基础。ole db 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,ole db 并不局限于 isam、jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 microsoft exchange 中的数据。但是,ole db 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。您需要的api 应该是一座连接应用程序和ole db 的桥梁,这就是 activex data objects (ado)。 二、在vc中使用ado(开发步骤如下:) 1、引入ado库文件   使用ado前必须在工程的stdafx.h头文件里用直接引入符号#import引入ado库文件,以使编译器能正确编译。代码如下所示: 用#import引入ado库文件

#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++类型的数据。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
平安保险福享安康与新华保险健康无忧c哪个更
在种葡萄的土中埋一些动物内脏,不久这些内脏
公司取名字大全
柯帝斯酒店地址在哪,我要去那里办事
大众汽车服务中心在哪里啊,我有事要去这个地
右图为人体两种重要有机物B、E的组成及相互关
建德市近30年人均GDP变化(最好是有图表的)
我老是在夜晚或半夜里睡不着觉是不是缺什么啊
厦门气候特点
微信结婚请柬怎么做
爱心文化传媒公司地址有知道的么?有点事想过
一个男生说我笑得灿烂是什么意思
弘历通讯在什么地方啊,我要过去处理事情
珠江入海的八大口门是哪些?
北京海淀区在哪 属于几环呢? 有哪些著名的东
推荐资讯
彩票开奖是真是假?<大奖>你觉得呢?
哪里有修气保焊机的
很久没玩dnf,现在想玩了,推荐个职业,刷图
【铝酸钠】偏铝酸钠和铝酸钠一样吗?为什么会
给的的英语单词怎么写
猜字谜,一只黑狗在一个白墙上,猜一个字,是
奥迪a6l方向机油老是少是怎么回事
有没什么调显示器亮度,对比度之类的软件
洛克王国如何交易宠物
罗马假日2栋地址有知道的么?有点事想过去
属龙的 88年10月29日生 最近超级倒霉 怎么才
油房街农贸市场地址在哪,我要去那里办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?