CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  数据库

哪里有vc连接数据库的示范代码?

楼主csdnmi(悦纳)2005-04-29 08:37:25 在 VC/MFC / 数据库 提问

哪里有vc连接数据库的示范代码?在VC中书写SQL语句的示范代码在那里能够找到?希望能够下载下来.急等! 问题点数:20、回复次数:14Top

1 楼wangjia184(我就是传说中的。。。。。。SB)回复于 2005-04-29 08:53:11 得分 10

VC++下使用ADO编写数据库程序  
   
  准备:  
  (1)、引入ADO类    
   
  #import   "c:\program   files\common   files\system\ado\msado15.dll"   \  
  no_namespace   \  
  rename   ("EOF",   "adoEOF")  
  (2)、初始化COM  
   
  在MFC中可以用AfxOleInit();非MFC环境中用:    
  CoInitialize(NULL);  
  CoUnInitialize();  
   
  (3)#import   包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr  
   
  1.连接和关闭数据库   (1)连接    
   
  例子:连接Access数据库  
  AfxOleInit();//初始化  
  HRESULT   hr;  
  try  
  {  
  hr   =   m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象  
  if(SUCCEEDED(hr))  
  {  
  m_pConnection->ConnectionTimeout   =   0;  
  hr   =   m_pConnection->Open(   "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=db.mdb",   "",   "",   adModeUnknown);  
  //m_pConnection->PutDefaultDatabase   ((_bstr_t)"DB");//设置默认数据库  
   
  m_pCommand.CreateInstance(__uuidof(Command));  
  m_pCommand->CommandTimeout   =   5;  
  m_pCommand->ActiveConnection   =   m_pConnection;  
  }  
  }  
  catch(_com_error   e)///捕捉异常  
  {  
  CString   errormessage;  
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());  
  AfxMessageBox(errormessage);///显示错误信息  
  }  
   
   
  (2)、关闭    
   
  //如果数据库连接有效  
  if(   m_pConnection->State   )  
              m_pConnection->Close();  
  m_pConnection   =   NULL;      
   
  (3)、设置连接时间   //设置连接时间-----------------------------------    
  pConnection->put_ConnectionTimeout(long(5));  
  2.打开一个结果集  
   
  (1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果  
  _RecordsetPtr m_pRecordset;  
  m_pRecordset.CreateInstance(__uuidof(Recordset));  
   
  //   在ADO操作中建议语句中要常用try...catch()来捕获错误信息,  
  //   因为它有时会经常出现一些意想不到的错误。jingzhou   xu  
  try  
  {  
  m_pRecordset->Open("SELECT   *   FROM   DemoTable",//   查询DemoTable表中所有字段  
  m_pConnection.GetInterfacePtr(),     //   获取库接库的IDispatch指针  
  adOpenDynamic,  
  adLockOptimistic,  
  adCmdText);  
  }  
  catch(_com_error   *e)  
  {  
  AfxMessageBox(e->ErrorMessage());  
  }  
   
  (2)关闭结果集   m_pRecordset->Close();  
   
  3.操作一个结果集  
   
  (1)、遍历(读取)  
  a)、用pRecordset->adoEOF来判断数据库指针是否已经移到结果集的末尾了;m_pRecordset->BOF判断是否   在第一条记录前面:   while(!m_pRecordset->adoEOF)  
  {  
  var   =   m_pRecordset->GetCollect("Name");  
  if(var.vt   !=   VT_NULL)  
  strName   =   (LPCSTR)_bstr_t(var);  
  var   =   m_pRecordset->GetCollect("Age");  
  if(var.vt   !=   VT_NULL)  
  strAge   =   (LPCSTR)_bstr_t(var);  
  m_AccessList.AddString(   strName   +   "   -->   "+strAge   );  
  m_pRecordset->MoveNext();  
  }  
   
  b)、取得一个字段的值的办法有两种办法  
   
  一是  
   
  //表示取得第0个字段的值   m_pRecordset->GetCollect("Name");  
   
  或者   m_pRecordset->GetCollect(_variant_t(long(0));  
   
  二是  
  pRecordset->get_Collect("COLUMN_NAME");  
   
  或者   pRecordset->get_Collect(long(index));  
   
  (2)、添加  
   
  a)、调用m_pRecordset->AddNew();  
  b)、调用m_pRecordset->PutCollect();给每个字段赋值  
  c)、调用m_pRecordset->Update();确认  
   
  (3)、修改  
  (4)、删除  
  a)、把记录指针移动到要删除的记录上,然后调用Delete(adAffectCurrent)   try  
  {  
  //   假设删除第二条记录  
  m_pRecordset->MoveFirst();  
  m_pRecordset->Move(1);                  
  //   从0开始  
  m_pRecordset->Delete(adAffectCurrent);      
  //   参数adAffectCurrent为删除当前记录  
  m_pRecordset->Update();  
  }  
  catch(_com_error   *e)  
  {  
  AfxMessageBox(e->ErrorMessage());  
  }  
   
  4.直接执行SQL语句,除了要用到结果集其余的大部分功能都可以直接用SQL语言实现  
   
  (1)、用_CommandPtr和_RecordsetPtr配合  
  _CommandPtr m_pCommand;  
  m_pCommand.CreateInstance(__uuidof(Command));  
  //   将库连接赋于它  
  m_pCommand->ActiveConnection   =   m_pConnection;      
  //   SQL语句  
  m_pCommand->CommandText   =   "SELECT   *   FROM   DemoTable";      
  //   执行SQL语句,返回记录集  
  m_pRecordset   =   m_pCommand->Execute(NULL,   NULL,adCmdText);    
  (2)、直接用_ConnectionPtr执行SQL语句  
  _RecordsetPtr   Connection15::Execute   (   _bstr_t   CommandText,    
                                                                              VARIANT   *   RecordsAffected,    
                                                                              long   Options   )    
   
  其中CommandText是命令字串,通常是SQL命令。    
  参数RecordsAffected是操作完成后所影响的行数,    
  参数Options表示CommandText中内容的类型,Options可以取如下值之一:    
  adCmdText:表明CommandText是文本命令    
  adCmdTable:表明CommandText是一个表名    
  adCmdProc:表明CommandText是一个存储过程    
  adCmdUnknown:未知  
   
  例子:  
  _variant_t   RecordsAffected;  
  m_pConnection->Execute("UPDATE   users   SET   old   =   old+1",&RecordsAffected,adCmdText);    
  5.调用存储过程  
  (1)、利用_CommandPtr  
  _CommandPtr m_pCommand;  
  m_pCommand.CreateInstance(__uuidof(Command));  
  m_pCommand->ActiveConnection   =   m_pConnection;     //   将库连接赋于它  
  m_pCommand->CommandText   =   "Demo";      
  m_pCommand->Execute(NULL,NULL,   adCmdStoredProc);      
  (2)、直接用_ConnectionPtr直接调用(见4.(2))  
   
  6.遍历数据库中的所有表名   _ConnectionPtr   m_pConnect;    
  _RecordsetPtr   pSet;    
  HRESULT   hr;    
  try    
  {      
  hr   =   m_pConnect.CreateInstance("ADODB.Connection");          
  if(SUCCEEDED(hr))      
  {        
  CString   dd;        
  dd.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=%s",file);        
  hr   =   m_pConnect->Open((_bstr_t)dd,"","",adModeUnknown);        
  pSet   =   m_pConnect->OpenSchema(adSchemaTables);              
  while(!(pSet->adoEOF))        
  {                    
  //获取表格          
  _bstr_t   table_name   =   pSet->Fields->GetItem("TABLE_NAME")->Value;  
   
  //获取表格类型                  
  _bstr_t   table_type   =   pSet->Fields->GetItem("TABLE_TYPE")->Value;  
   
  //过滤一下,只输出表格名称,其他的省略  
  if   (   strcmp(((LPCSTR)table_type),"TABLE")==0){  
  CString   tt;  
  tt.Format("%s",(LPCSTR)table_name);            
  AfxMessageBox(tt);                  
  }                
  pSet->MoveNext();          
  }        
  pSet->Close();      
  }      
  m_pConnect->Close();      
  }catch(_com_error   e)///捕捉异常    
  {      
  CString   errormessage;      
  errormessage.Format("连接数据库失败!rn错误信息:%s",e.ErrorMessage());  
   
  AfxMessageBox(errormessage);  
  return   -1;  
  }  
  7.遍历一个表中的所有字段  
  Field   *       field   =   NULL;  
  HRESULT       hr;  
  Fields   *     fields   =   NULL;  
  hr   =   m_pRecordset->get_Fields   (&fields); //得到记录集的字段集和  
     
  if(SUCCEEDED(hr))    
          fields->get_Count(&ColCount);  
   
  //得到记录集的字段集合中的字段的总个数  
  for(i=0;iItem[i]->get_Name(&bstrColName); //得到记录集//中的字段名  
  strColName=bstrColName;  
  nameField   =   strColName;  
  m_FieldsList.AddString(nameField);  
  }  
  if(SUCCEEDED(hr))  
  fields->Release();//释放指针  
   
  附:  
  1、_variant_t  
  (1)、一般传给这3个指针的值都不是MFC直接支持的数据类型,而要用_variant_t转换一下  
  _variant_t(XX)可以把大多数类型的变量转换成适合的类型传入:  
  (2)、_variant_t   var;_variant_t   ->   long:   (long)var;  
  _variant_t   ->   CString:   CString   strValue   =   (LPCSTR)_bstr_t(var);  
  CString   ->   _variant_t:   _variant_t(strSql);  
  2、BSTR宽字符串与CString相互转换  
   
  BSTR   bstr;  
  CString   strSql;  
  CString   ->   BSTR:   bstr   =   strSql.AllocSysString();  
  BSTR   ->   CString:   strSql   =   (LPCSTR)bstr;  
  3、_bstr_t与CString相互转换  
   
  _bstr_t   bstr;  
  CString   strSql;  
  CString   ->   _bstr_t:   bstr   =   (_bstr_t)strSql;  
  _bstr_t   ->   CString:   strSql   =   (LPCSTR)bstr;  
  4、关于时间  
  Access:表示时间的字符串#2004-4-5#  
  Sql:表示时间的字符串''2004-4-5''  
  DateField(时间字段)   select   *   from   my_table   where   DateField   >   #2004-4-10#  
   
   
   
  try  
  {  
  m_pCommand->CommandText   =   "INSERT   INTO   tTest(age)   VALUES('23f2')   ";  
  m_pRecordset   =   m_pCommand->Execute(NULL,NULL,   adCmdText);      
  }  
  catch(_com_error   e)///捕捉异常  
  {  
  CString   errormessage;  
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());  
  AfxMessageBox(errormessage);///显示错误信息  
  }  
  Top

2 楼wangjia184(我就是传说中的。。。。。。SB)回复于 2005-04-29 08:53:28 得分 0

ODBC链接  
   
  适合数据库类型   链接方式    
  access   "Driver={microsoft   access   driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"    
  dBase     "Driver={microsoft   dbase   driver(*.dbf)};driverid=277;dbq=------------;"    
  Oracle     "Driver={microsoft   odbc   for   oracle};server=oraclesever.world;uid=admin;pwd=pass;"    
  MSSQL   server   "Driver={sql   server};server=servername;database=dbname;uid=sa;pwd=pass;"    
  MS   text     "Driver={microsoft   text   driver(*.txt;   *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist   SecurityInfo=false;"    
  Visual   Foxpro   "Driver={microsoft   Visual   Foxpro   driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"    
  MySQL   "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"    
   
   
  OLEDB链接  
   
  适合的数据库类型   链接方式    
  access   "Provider=microsoft.jet.oledb.4.0;data   source=your_database_path;user   id=admin;password=pass;"    
  Oracle   "Provider=OraOLEDB.Oracle;data   source=dbname;user   id=admin;password=pass;"    
  MS   SQL   Server   "Provider=SQLOLEDB;data   source=machinename;initial   catalog=dbname;userid=sa;password=pass;"    
  MS   text     "Provider=microsof.jet.oledb.4.0;data   source=your_path;Extended   Properties'text;FMT=Delimited'"    
  Top

3 楼commandconque(马江王)回复于 2005-04-29 17:01:54 得分 10

楼上转载的比较全面,标记下备查Top

4 楼commandconque(马江王)回复于 2005-04-29 17:05:38 得分 0

ODBC   Driver   for   dBASE  
   
  strConnection   =   _T("Driver={Microsoft   dBASE   Driver   (*.dbf)};DriverID=277;"  
                                        "Dbq=c:\\DatabasePath;");  
  ....................................  
  ODBC   Driver   for   Excel  
   
  strConnection   =   _T("Driver={Microsoft   Excel   Driver   (*.xls)};DriverId=790;"  
          bq=C:\\DatabasePath\\DBSpreadSheet.xls;DefaultDir=c:\\databasepath;");    
  ...............................  
  ODBC   Driver   for   Sql   Server  
  strConnection   =   _T("Driver={SQL   Server};Server=MyServerName;"  
                  "Trusted_Connection=no;"  
                  "Database=MyDatabaseName;Uid=MyUserName;Pwd=MyPassword;");  
  -----------------------------  
   
  ODBC   Driver   for   Text  
   
  strConnection   =   _T("Driver={Microsoft   Text   Driver   (*.txt;   *.csv)};"  
                  "Dbq=C:\\DatabasePath\\;Extensions=asc,csv,tab,txt;");  
  ......................................  
  Visual   FoxPro  
  strConnection   =   _T("Driver={Microsoft   Visual   Foxpro   Driver};UID=;"  
          ourceType=DBC;SourceDB=C:\\DatabasePath\\MyDatabase.dbc;Exclusive=No");  
  ...................................  
  ODBC   Driver   for   Access  
   
  strConnection   =   _T("Driver={Microsoft   Access   Driver   (*.mdb)};"  
                  "Dbq=c:\\DatabasePath\\dbaccess.mdb;Uid=;Pwd=;");                              
  ........................  
   
  ODBC   Driver   for   Oracle    
  strConnect   =   _T("Driver={Microsoft   ODBC   for   Oracle};Server=OracleServer.world;"  
                  "Uid=MyUsername;Pwd=MyPassword;");  
  ---------------  
  等等,想要还有太多了  
   
   
  Top

5 楼csdnmi(悦纳)回复于 2005-04-30 16:30:45 得分 0

能不能提供一个连接SQLSERVER数据库的例子。最好步骤详细具体一些。最好写上代码在那里添加。Top

6 楼Peter_Chow(小块头)回复于 2005-04-30 16:51:48 得分 0

可能以后会用,关注Ing!Top

7 楼gerry2000(just do it~)回复于 2005-05-05 10:44:33 得分 0

markTop

8 楼yifanlxj(微观工作室)回复于 2005-05-05 11:55:02 得分 0

dingTop

9 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-05-05 14:22:15 得分 0

http://www.xiaozhou.net/cooldog/blogview.asp?logID=68Top

10 楼km3(北落师门)回复于 2005-05-06 07:41:37 得分 0

markTop

11 楼sdudying(sdudying)回复于 2005-05-06 21:51:26 得分 0

markTop

12 楼csdnmi(悦纳)回复于 2005-05-12 10:58:27 得分 0

谢谢各位的指点,暂时不结帖,我正在做毕业设计,如果有不会的地方再来问大家。Top

13 楼csdnmi(悦纳)回复于 2005-05-13 19:07:56 得分 0

VC++下使用ADO编写数据库程序  
   
  准备:  
  (1)、引入ADO类    
   
  #import   "c:\program   files\common   files\system\ado\msado15.dll"   \  
  no_namespace   \  
  rename   ("EOF",   "adoEOF")  
  (2)、初始化COM  
   
  在MFC中可以用AfxOleInit();非MFC环境中用:    
  CoInitialize(NULL);  
  CoUnInitialize();  
   
  (3)#import   包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr  
   
  1.连接和关闭数据库   (1)连接    
   
  例子:连接Access数据库  
  AfxOleInit();//初始化  
  HRESULT   hr;  
  try  
  {  
  hr   =   m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象  
  if(SUCCEEDED(hr))  
  {  
  m_pConnection->ConnectionTimeout   =   0;  
  hr   =   m_pConnection->Open(   "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source=db.mdb",   "",   "",   adModeUnknown);  
  //m_pConnection->PutDefaultDatabase   ((_bstr_t)"DB");//设置默认数据库  
   
  m_pCommand.CreateInstance(__uuidof(Command));  
  m_pCommand->CommandTimeout   =   5;  
  m_pCommand->ActiveConnection   =   m_pConnection;  
  }  
  }  
  catch(_com_error   e)///捕捉异常  
  {  
  CString   errormessage;  
  errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());  
  AfxMessageBox(errormessage);///显示错误信息  
  }  
   
  我用这一段代码连接数据库是怎么连接不上,现在有以下问题需要提问:  
  1   要是想使用这三个指针(_ConnectionPtr、_RecordsetPtr和_CommandPtr),是不是需要在哪个文件的头部包含上一个头文件?仅仅引入#import   "c:\program   files\common   files\system\ado\msado15.dll"   \  
  no_namespace   \是不是不够?  
  2   AfxOleInit()这个函数放在哪里?是应该放到CMainFrame0中吗?  
   
  3   在使用m_pConnection之前是不是该声明一下它?是这样声吗:_ConnectionPtr   m_pConnection;  
  4   从哪里能看出这段程序是在连接access数据库,如果我要是想连接sql_server数据库呢,该怎么改?  
  5   ADODB是什么?  
  6_com_error可以直接使用吗?是不是该加上定义它的头文件?  
  Top

14 楼csdnmi(悦纳)回复于 2005-05-14 09:40:42 得分 0

怎么也没人回答?急等?我周一就要给老师看了?Top

相关问题

  • who有vc读取foxpro数据库的程序代码。。。
  • vc怎么写数据库查询的代码?新人请教
  • vc&数据库
  • 在VB中,如何连接远程数据库(internet上的数据库服务器)?请给示范代码。我只有这么多分。
  • struts如何实现级联选择[数据库读的]啊,最好能有代码示范下。
  • 谁有vc与数据库接口的源代码?c_plusplus@163.com急急急!!!!
  • vc使用sql2000数据库,请问:代码绑定datagrid控件如何实现?
  • vc使用sql2000数据库,请问:代码绑定datagrid控件如何实现?
  • 代码创建数据库
  • VC与数据库--

关键词

  • vc++
  • 数据库
  • 连接
  • 字段
  • 代码
  • hr
  • 指针
  • mfc
  • ado
  • precordset

得分解答快速导航

  • 帖主:csdnmi
  • wangjia184
  • commandconque

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo