主流数据库

    当前各种主流数据库,

        Oracle, MS SQL Server, MySQL, DB2, MS ACCESS, Sybase, Informix, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen等等。


连接数据库过程

       连接数据库大致分如下四个步骤:


        (1)初始化

        (2)用Connection对象连接数据库

        (3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。

        (4)使用完毕后关闭连接释放对象。


C++连接Oracle


在VisualC++下开发Oracle库接口主要有两种方法。一种方法是利用VisualC++提供的多种数据库访问技术,如开放数据库连接ODBC、数据存取对象DAO、对象连接和嵌入数据库OLEDB和ActiveX数据对象ADO等。另一种方法是在VisualC++中嵌入SQL语句,这就是所指的Pro*C/C++(本文简称PROC)。前一种方法由于有MFC强大的类库支持,熟悉VC编程时则实现方便,且可移植性强;但是,与PROC相比,应用程序需要经过两层才能和数据库通信接口建立联系,编程相对复杂,执行效率相对较低。PROC支持嵌入式PL/SQL块等直接调用Oracle 库,将过程化语言和非过程化语言相结合,形成一种更强的开发工具,可开发出满足各种复杂要求的优化应用程序,执行效率高。适合熟悉Oracle技术的人员应用。但是用PROC开发出的应用程序无法向异构数据库平台移植。

  本文详细描述实际利用PROC在VisualC++环境下开发Oracle数据库接口程序的方法和具体操作步骤,并给出了编程实例。叙述以VisualC++ 6.0版和Oracle8i版为例,其他版本可根据实际情况变更。

  几个特殊文件

  PROC在VC下开发Oracle库接口时,需要用到几个特殊文件。

  1、PROC的可执行文件PROCUI.EXE

  用Oracle_HOME代表Oracle安装后的根目录,当其以缺省方式安装在计算机的D盘时,则Oracle_HOME位置是D:\ Oracle。这时PROC的可执行文件在Oracle_HOME\ Ora81 \ BIN \ PROCUI. EXE,对缺省安装即在D: \ Oracle\ Ora81 \ BIN \ PROCUI. EXE。

  2、Oracle支持SQL在VC环境的库文件OraSQL8.LIB

  根据以上约定,OraSQL8. LIB文件在Oracle_HOME\ Ora81 \ divCOMP \ LIB \ MSVC \ OraSQL8.LIB,对缺省安装即在D:\ Oracle \ Ora81 \ divCOMP \ LIB \ MSVC \ OraSQL8.LIB。

  3、Oracle支持SQL在VC环境的头文件

   根据以上约定,头文件*.h在Oracle_HOME \ Ora81 \ divCOMP \ PUBLIC \ *.h,对缺省安装即在D:\ Oracle \ Ora81 \ divCOMP \ PUBLIC \ *.h。

  *.h 是头文件的总称,通常有十多个,具体内容可在指定路径下查到。

 

将PROC集成到VC环境中
  为了方便完成用PROC在VC下开发Oracle库接口,通常将PROC集成到VisualC++ 6.0 环境中,直接在C / C++环境中使用PROC预编译器来预编译应用程序,然后进行编译和链接,最终生成可执行程序。将PROC集成到VC环境中应完成如下工作。

  1、增加PROC到Tools菜单列表

  a) 运行Microsoft Visual C++ 6.0;

  b) 从菜单项Tools中选择Customize项。为表述简单起见,书写成如下格式:菜单Tools/Customize 项。以下采用类似的表达方法。此时出现Customize对话框;

  c) 单击Tools选项卡(或属性页),用鼠标移动“Menucontents”框滚动条到底部区域;

  d) 双击点划线矩形区域,在空白区域上输入“PROC”,然后按回车键;

  e) 在“Command”框中,输入PROC的可执行文件名。根据2.1节的说明,对缺省安装即输入D:\ Oracle \ Ora81 \ BIN \ PROCUI. EXE;

  f) 在“Arguments”框中输入“$(TargetName)”。其作用在从菜单Tools中选择PROC项时,VC会将当前项目名传递给PROC,尔后PROC会直接打开该项目文件目录下扩展名为.div的同名文件;

  g) 在“Initial directory”框中输入“$(WkspDir)”/ 单击“Close”按钮,完成将PROC集成到VC环境中的工作。

  2、指定头文件路径

  为了确保VC顺利完成编译链接,需要将Oracle提供的头文件增加到VC环境中。指定头文件路径的具体步骤如下。

  a) 菜单Tools / Options项,出现“Options”对话框;

  b) 单击“Directories”选项卡,从“Showdirectories for:”列表框中选择“Includefiles”;

  c) 移动“Directories”框的滚动条到底部区域;

  d) 双击点划线矩形区域,在空白区域上输入包含Oracle支持SQL在VC环境头文件的子目录,根据2.3节的说明,对缺省安装即输入D:\ Oracle \ Ora81 \ divCOMP \ PUBLIC。

 

 

编程举例
  1、程序内容

  一般SQL嵌入式程序主要有说明、包含头文件、子程序声明、主程序和子程序等部分组成,在主程序中调用有关子程序。必备的子程序通常有连接到数据库子程序、断开数据库子程序、错误处理子程序和完成某项具体事务(如查询、插入、修改、删除等)的工作子程序。

  2、程序举例

  下面是一完整的可通过预编译、编译链接和运行的示例程序。


/* exam01.pc 开发Oracle接口程序举例 */
 /* 说明:本程序介绍用PROC开发Oracle库接口的编程特点。通过向AUTHS
 * 表输入作家代码,查询作家姓名及工资。运行前应建表、插入数据并提交。*/
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 /* 包含SQL通讯区,它用于处理错误。*/
 #include <sqlca.h>
 void connect(); /* 连接到Oracle Server */
 void disconnect(); /* 断开到Oracle Server的连接 */
 void sql_error(char *); /* 处理错误句柄 */
 void select(); /* 查询子程序 */
 extern sqlglm(char *,int *,int *);
 /* 主程序 */
 void main()
 {
  /* 安装错误处理句柄 */
  EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle错误--\n");
  /* 连接到数据库 */
  connect();
  /* 执行查询 */
  select();
  /* 断开数据库连接 */
  disconnect();
 }
 /* 子程序 */
 /* 连接子程序 connect() */
 void connect()
 {
  EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR username[10], password[10], server[10];
  EXEC SQL END DECLARE SECTION;
  /* 输入用户名、口令以及服务器名 */
  printf("\n输入用户名:");
  gets(username.arr);
  username.len=(unsigned short)strlen((char *)username.arr);
  printf("\n输入口令:");
  gets(password.arr);
  password.len=(unsigned short)strlen((char *)password.arr);
  printf("\n输入服务器名:");
  gets(server.arr);
  server.len=(unsigned short)strlen((char *)server.arr);
  /* 连接到Oracle服务器上 */
  EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
  printf("\n以用户%s成功地连接到了服务器%s上!\n", username.arr, server.arr);
 }
 /* 断开连接子程序 disconnect() */
 void disconnect()
 {
  char temp;
  printf("\n是否在断开连接前提交所有事务? (Y/N)");
  scanf("%c", &temp);
  fflush(stdin);
  if(temp !='Y' && temp != 'y')
  {
   /* 回退事务,断开连接。 */
   EXEC SQL ROLLBACK WORK RELEASE;
   printf("\n回退事务,断开连接,退出程序!\n\n");
  }
  else
  {
   /* 提交事务,断开连接。 */
   EXEC SQL COMMIT WORK RELEASE;
   printf("\n提交事务,断开连接,退出程序!\n\n");
   exit(1);
  }
 }
 /* 查询子程序 select()
 * 首先输入作家代码,然后查询作家姓名和工资。*/
 void select()
 {
  EXEC SQL BEGIN DECLARE SECTION;
  char author_code[8], name[10];
  float salary;
  short salary_ind;
  EXEC SQL END DECLARE SECTION;
  printf("\n输入作家代码: ");
  gets(author_code);
  /* 查询作家姓名和工资 */
  EXEC SQL SELECT name, salary INTO :name, :salary:salary_ind
  FROM auths
  WHERE author_code = :author_code;
  /* 根据指示变量的值来确定该作家的工资是否为空。*/
  if (salary_ind ==0)
  {
   printf("\n作家代码\t作家姓名\t作家工资\n");
   printf("--------\t--------\t--------\n");
   printf("%8s\t%8s\t%8.2f\n", author_code, name, salary);
  }
  else
  {
   printf("作家%s的工资未录入,为空值!\n", name);
  }
 }
 /* 错误处理子程序 sql_error() */
 void sql_error(char *msg)
 {
  char err_msg[128];
  size_t buf_len, msg_len;
  /* 出现SQL错误,继续往下执行。 */
  EXEC SQL WHENEVER SQLERROR CONTINUE;
  printf("\n%s\n", msg);
  buf_len=sizeof(err_msg);
  /* 调用函数sqlglm()获得错误消息。 */
  sqlglm(err_msg, &buf_len, &msg_len);
  printf("%.*s\n", msg_len, err_msg);
  /* 回退事务,断开连接,退出程序。 */
  EXEC SQL ROLLBACK RELEASE;
  exit(EXIT_FAILURE);
 }


  3、建表和插入数据记录

  上述示例程序如要正确运行,还需以Oracle库的合法用户登录,并创建AUTHS表和插入一些数据记录。建表文件、建表命令和插入数据记录的示例命令如下所述。这里叙述的工作完成后,上节生成的可执行文件才能正确运行。

  REM 以下为建表文件auths.SQL


DROP TABLE auths CASCADE CONSTRAINTS
 /
 CREATE TABLE auths(
 AUTHOR_CODE VARCHAR2(8) NOT NULL,
 NAME VARCHAR2(10),
 BIRTHDATE DATE,
 ENTRY_DATE_TIME DATE,
 SALARY NUMBER(7,2),
 remark VARCHAR2(255))
 /
 REM 下一行为在PL/SQL环境中运行建表文件的命令
 REM @ E: \ PROCW \ Exam01 \ auths.sql
 REM 下一行为在PL/SQL环境中向auths表插入数据的命令,插入后应提交(COMMIT)!
 REM INSERT INTO auths(author_code,name,salary) VALUES('A00001','王达琳',1200);



 



C++连接MS SQL Server

C++连接SQL数据库分步骤进行


我们在进行C++连接SQL数据库的操作时,首先应该进行相应的系统配置,然后初始化C++与SQL连接,然后再进行数据连接的操作,然后应用SQL执行语言来具体操作。






C++连接SQL数据库第一步 系统配置


1.设置SQLSERVER服务器为SQL登录方式,并且系统安全性中的sa用户要设置登录功能为“启用”,还有必须要有密码。


2.需要在ODBC中进行数据源配置,数据源选\”SQL SERVER”,登录方式使用“使用输入用户登录ID和密码的SQL SERVER验证”,并填写登录名(sa)和密码,注意一点,密码不能为空,这就意味着你的sa用户必须得有密码。否则无法通过系统本身的安全策略。测试通过就完成了配置。


C++连接SQL数据库第二步 C++与SQL连接初始化


1.在你所建立的C++项目中的stdafx.h头文件中引入ADO


具体代码如下


#import “c:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(”EOF”, “adoEOF”) rename(”BOF”, “adoBOF”) 2.定义_ConnectionPtr变量后调用Connection对象的Open方法建立与服务器的连接。



数据类型_ConnectionPtr实际上是由类模板_com_ptr_t得到的一个具体的实例类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针及其一些必要的操作。可以通过这个指针操纵Connection对象。


例如连接SQLServer数据库,代码如下:

//连接到MS SQL Server  
 //初始化指针  
 _ConnectionPtr pMyConnect = NULL;  
 HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection));  
 if (FAILED(hr))  
 return;
   
 //初始化链接参数  
 _bstr_t strConnect = “Provider=SQLOLEDB; 
 Server=hch; 
 Database=mytest; 
 uid=sa; 
 pwd=sa;”; //Database指你系统中的数据库  


 //执行连接  
 try  
 {  
 // Open方法连接字串必须四BSTR或者_bstr_t类型  
 pMyConnect->Open(strConnect, “”, “”, NULL);  
 }  
 catch(_com_error &e)  
 {  
 MessageBox(e.Description(), “警告”, MB_OK|MB_ICONINFORMATION);  
 }//发生链接错误 










 C++连接SQL数据库第三步 简单的数据连接


 //定义_RecordsetPtr变量,调用它Recordset对象的Open,即可打开一个数据集  
 //初始化过程 以下是个实例  
 _RecordsetPtr pRecordset;  
 if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))  
 {  
 return;  
 }  


 //执行操作  
 try  
 {  
 pRecordset->Open(_variant_t(”userinfo”),
  _variant_t((IDispatch*)pMyConnect),  adOpenKeyset, adLockOptimistic, adCmdTable);  
 }  
 catch (_com_error &e)  
 {  
 MessageBox(”无法打开userinfo表\”, “系统提示”, MB_OK|MB_ICONINFORMATION);  
 }






C++连接SQL数据库第四步 执行SQL语句


这里是关键,我认为只要你懂点SQL语句那么一切都会方便许多比用上面的方法简单,更有效率点。


首先


m_pConnection.CreateInstance(_uuidof(Connection)); 
 //初始化Connection指针  
 m_pRecordset.CreateInstance(__uuidof(Recordset));
 //初始化Recordset指针  
 CString strSql=”select * from tb_goods”;//具体执行的SQL语句  m_pRecordset=m_pConnection->Execute(_bstr_t(strSql), NULL, adCmdText);//将查询数据导入m_pRecordset数据容器





至此 你的SQL语句已经执行完成了m_pRecordset内的数据就是你执行的结果。


取得记录:


while(!m_pRecordset->adoEOF)//遍历并读取name列的记录并输出  
 {  
 CString temp = (TCHAR *)(_bstr_t)m_pRecordset->GetFields()->GetItem  (”name”)->Value;  AfxMessageBox(temp);  
 pRecordset->MoveNext();  
 }





插入记录:


//记得初始化指针再执行以下操作  
 CString strsql;  
 strsql.Format(”insert into tb_goods(no,name, price) values(’%d’,'%s’, %d)”,m_intNo,m_strName,m_intPrice);  
 m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);







修改记录:


CString strsql;  
 strsql.Format(”update tb_goods set name=’%s’ , price=%d where no=%d “,m_strName,m_intPrice,m_intNo);   
 m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);





删除记录:


CString strsql;  
 strsql.Format(”delete from tb_goodswhere no= ‘%d’ “,m_intNo);  m_pRecordset=m_pConnection->Execute(_bstr_t(strsql),NULL,adCmdText);





以上是几个常用的SQL语句和执行方法。效率可能不是很高,不过很容易理解。如果你对SQL语句很熟悉那么可以更有效的执行查询直接获得需要的记录。C++连接SQL数据库的相关方法就为大家介绍到这里。





*******************************************************************************************




(楼上两位说的很对,我给你粘一篇文章吧 初学者 看看有好处。
需要的话 你可以留下邮箱 我这有一些初学者的文档可以发给你很不错,希望继续努力。面试,到时候一切都是是浮云。。。哈哈)


基本流程 
万事开头难,任何一种新技术对于初学者来说最重要的还是“入门”,掌握其要点。让我们来看看ADO数据库开发的基本流程吧! 
(1)初始化COM库,引入ADO库定义文件 
(2)用Connection对象连接数据库 
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。 
(4)使用完毕后关闭连接释放对象。 


准备工作: 
为了大家都能测试本文提供的例子,我们采用Access数据库,您也可以直接在我们提供的示例代码中找到这个test.mdb。 
下面我们将详细介绍上述步骤并给出相关代码。 
【1】COM库的初始化 
我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码: 



BOOL CADOTest1App::InitInstance() 
 { 
 AfxOleInit(); 
 ......




【2】用#import指令引入ADO类型库 
我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在FileView中的Header Files里找到) 


#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。 


几点说明: 
(1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改 
(2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。 
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned 


【3】创建Connection对象并连接数据库 
首先我们需要添加一个指向Connection对象的指针: 
_ConnectionPtr m_pConnection; 
下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉。 


BOOL CADOTest1Dlg::OnInitDialog() 
 { 
 CDialog::OnInitDialog(); 
 HRESULT hr; 
 try 
 { 
 hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象 
 if(SUCCEEDED(hr)) 
 { 
 hr = m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb","","",adModeUnknown);///连接数据库 
 ///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51; 
 } 
 } 
 catch(_com_error e)///捕捉异常 
 { 
 CString errormessage; 
 errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage()); 
 AfxMessageBox(errormessage);///显示错误信息 
 }




在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型 

HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) 
 ConnectionString为连接字串,UserID是用户名, Password是登陆密码,Options是连接选项,用于指定Connection对象对数据的更新许可权, 
 Options可以是如下几个常量: 
 adModeUnknown:缺省。当前的许可权未设置 
 adModeRead:只读 
 adModeWrite:只写 
 adModeReadWrite:可以读写 
 adModeShareDenyRead:阻止其它Connection对象以读权限打开连接 
 adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接 
 adModeShareExclusive:阻止其它Connection对象以读写权限打开连接 
 adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接



我们给出一些常用的连接方式供大家参考: 
(1)通过JET数据库引擎对ACCESS2000数据库的连接 

m_pConnection- >Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb","","",adModeUnknown);



(2)通过DSN数据源对任何支持ODBC的数据库进行连接: 


m_pConnection- >Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);



(3)不通过DSN对SQL SERVER数据库进行连接: 

m_pConnection- >Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown);



其中Server是SQL服务器的名称,DATABASE是库的名称 


Connection对象除Open方法外还有许多方法,我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State 
ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如: 

m_pConnection- >ConnectionTimeout = 5;///设置超时时间为5秒 
 m_pConnection- >Open("Data Source=adotest;","","",adModeUnknown);




State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如: 

if(m_pConnection- >State) 
 m_pConnection- >Close(); ///如果已经打开了连接则关闭它



------------------------------------------------------------------------------------ 
呵呵,是啊,我以前不做VC的,所以这次老板有个项目要做,没办法啊!!以后多请教啊!! 
------------------------------------------------------------------------------------ 
你现在不少基础的不会,上来就连接数据库有点难 
------------------------------------------------------------------------------------ 
要是你用vc6,就右健点击要添加变量的控件,选择classwizard,选择member variables选项卡,它会自动指到你想要添加变量的控件,你直接点选择add variable,起个名字就可以了 
------------------------------------------------------------------------------------ 
我关键是不知道怎么给控件添加与之相对应的变量!!请明示啊!! 
------------------------------------------------------------------------------------ 
CBaseEditBox是什么东西?你不要这样定义。应该先把控件放在对话框窗体上,再给这个控件添加与之相对应的变量,这样,VC就自动把控件和变量联系起来了 
------------------------------------------------------------------------------------ 
刚弄,不怎么会,请明示!!! 


我想把从数据库中读出来的记录放在一个文本框中! 


然后在界面上放置了一个edit box 


我在类C***Dlg中添加了变量 
public: 
CBaseEditBox m_list 


接下来我在一个按钮的onOK事件里连接数据库并想把得到的记录放到m_list里 


// 读入库中各字段并加入列表框中 
 while(!m_pRecordset- >adoEOF) 
 { 
 var = m_pRecordset- >GetCollect("UserName"); 
 if(var.vt != VT_NULL) 
 strName = (LPCSTR)_bstr_t(var); 
 var = m_pRecordset- >GetCollect("Password"); 
 if(var.vt != VT_NULL) 
 strAge = (LPCSTR)_bstr_t(var); 


 m_list.AddString( strName + " -- > "+strAge ); 


 m_pRecordset- >MoveNext(); 
 } 


 // 默认列表指向第一项,同时移动记录指针并显示 
 m_list.SetCurSel(0);




然后一大堆错误: 

d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2146: syntax error : missing "; " before identifier "m_list " 
 d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "CBaseEditBox " : missing storage-class or type specifiers 
 d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "m_list " : missing storage-class or type specifiers 
 TestADODlg.cpp 
 d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2146: syntax error : missing "; " before identifier "m_list " 
 d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "CBaseEditBox " : missing storage-class or type specifiers 
 d:\microsoft visual studio\myprojects\testado\testadodlg.h(18) : error C2501: "m_list " : missing storage-class or type specifiers 
 D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(195) : error C2065: "m_list " : undeclared identifier 
 D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(195) : error C2228: left of ".AddString " must have class/struct/union type 
 D:\Microsoft Visual Studio\MyProjects\TestADO\TestADODlg.cpp(201) : error C2228: left of ".SetCurSel " must have class/struct/union type 
 Generating Code... 
 Error executing cl.exe.




请问什么原因那? 


------------------------------------------------------------------------------------ 
http://www.vckbase.com/document/viewdoc/?id=496 

把文章中连接Access的语句换成: 
连接SQL数据库: 
m_pConnection- >Open("Provider=SQLOLEDB.1;Server=192.168.1.6;DATABASE=mysql;UID=sa;PWD=;","","",adModeUnknown); 


其中Server是SQL服务器的名称,DATABASE是库的名称





******************************************************************************8


数据库名字:TEST,表名为student
数据库的用户名和密码为sa , 123
首先需在 stdafx.h 导入
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
 


添加按钮事件:

void CADODlg::OnSearch() 
 {
CoInitialize(NULL);    //初始化COM
_ConnectionPtr pConn(__uuidof(Connection));
_RecordsetPtr pRst(__uuidof(Recordset));
     CString strSQL="select *from student";
     _bstr_t bstrSRC(strSQL);
 pConn->ConnectionString="Provider=MSDASQL;driver={SQL Server};Server=127.0.0.1;DATABASE=test;UID=sa;PWD=123"; 
 pConn->Open("","","",-1); /*-1可用adConnectUnspecified代替,表示同步连接.adConnectAsync,表示异步。  如果是使用第二种连接字则应用 pConn->Open("","","642145",-1); */
pRst=pConn->Execute(bstrSRC,NULL,adCmdText);


while(!pRst->rsEOF)
{
m_result.AddString((_bstr_t)pRst->GetCollect("SName"));   /*m_result是我关联的一个list空间变量*/
         pRst->MoveNext();
}
pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();


CoUninitialize();
 }









上面是用连接对象来执行sql语句的,我们也可以用command对象来实现,
首先添加command智能指针:

_CommandPtr pCmd(__uuidof(Command));
 设置活动连接:
 pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
 设置命令文本:
 pCmd->CommandText="select * from Student";
 返回记录集:
 pRst=pCmd->Execute(NULL,NULL,adCmdText);






***********************************************************************************8




1.首先,你的机器上要保证有sql server,并能正确进入并创建数据库,表等。


2.建议把那个SA的密码自己重新设定一下,设定方法:打开sql server 2005 SQL Server Management Studio,进去后在那个安全性--登录名--右键点击SA属性,设置密码,状态里面改成,授予 启用。


3.将ADO代码库引入到工程中,需要在stdafx.h或TEST.h(这个MFC项目的头文件)中添加如下代码,注意不同的操作系统在安装时这个路径可能不一样,所以必须先在系统中找到msado15.dll文件的路径:


加入代码:


#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")





(通过以上代码就可以将ADO代码库引入到当前工程中)





4.在TEST工程中的TEST.h中加入如下代码:(蓝色为所加入的)

class CSQL_TESTApp : public CWinApp
 {
 public:


 ?
  ?_ConnectionPtr m_pAppConn;?//连接对象指针
 CString m_AppConnString;?//连接字符串的声明
 bool m_bConnected; //连接标志
 public:
 CSQL_TESTApp();


 // Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CSQL_TESTApp)
 public:
 virtual BOOL InitInstance();
 。。。。


 };






5.在TEST工程的TEST.CPP文件中加入如下代码:(蓝色为所加入的)

BOOL CSQL_TESTApp::InitInstance()
 {
 AfxEnableControlContainer();
  ?
 HRESULT hRes;
 try
 {
 hRes=m_pAppConn.CreateInstance(_T("ADODB.Connection"));
 m_pAppConn->Open(_bstr_t((LPCTSTR) m_AppConnString) , _T("") , _T("") , adModeUnknown);
 if(SUCCEEDED(hRes))
 {
 m_bConnected = TRUE; //连接成功设置标志位
 }
 }
 catch(_com_error e)
 {
 CString errormessage;
 errormessage.FormatMessage(_T("连接数据库失败 %s"),e.ErrorMessage());
 AfxMessageBox(errormessage); //显示错误信息
 return FALSE;


 ?}
 // Standard initialization
 // If you are not using these features and wish to reduce the size
 // of your final executable, you should remove from the following
 // the specific initialization routines you do not need.







*****************************************************************************




Visual C++用ADO连接SQL Server数据库语句 


1.ADO连接SQL Server数据库Connection语句:"Provider=SQLOLEDB.1;Data Source=serverName;Initial Catalog=databaseName;User ID=user;Password=userPassWord;"
其中serverName:SQL Server的名字,本地的默认为(local),注意:local两边是有“(”,“)”的;
databaseName:要连接的SQL Server数据库的名字,如abc;
user:为用 SQL Server 的用户名称,默认为sa;
userPassWord: SQL Server用户密码,默认为空(但是不提倡)
2.例如:

try //try{...}catch(...){...}是用于异常捕捉的,以便出错提示               
 { 
    // 打开本地SQL库XSCJ;                              //下面有"\",用于换行操作
    m_pConnection->Open("Provider=SQLOLEDB.1;Data Source=(local);\
                    Initial Catalog=XSCJ;User ID=sa;Password=223;"\
         ,"","",adModeUnknown); 
         /*adModeUnknown为Options是连接选项,
         用于指定Connection对象对数据的更新许可权,
         Options可以是如下几个常量:
         adModeUnknown:缺省。当前的许可权未设置
         adModeRead:只读
         adModeWrite:只写
         adModeReadWrite:可以读写
         adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
         adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
         adModeShareExclusive:阻止其它Connection对象打开连接
                              adModeShareDenyNone:允许其它程序或对象以任何权限建立连接*/
 }
 catch(_com_error e)   /*捕捉异常*/
 {
    AfxMessageBox("数据库连接失败,确认SQL servers数据库是否已经开启!");
    return FALSE;
 } 
 // AfxMessageBox("成功连接SQL数据库!!");
 其中上语句 连接本地SQL Server(local);数据库xscl;用户为sa;密码为223;
       m_pConnection为 _ConnectionPtr 智能指针类型



C++连接My SQL

第一种方法是利用ADO连接,

第二种方法是利用mysql自己的api函数进行连接。

第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库。暂时只连接了mysql,sqlserver,oracle,access。对于access,因为它创建表的SQL语句不太兼容标准SQL语句,需要做一些处理,这里暂时不说。第二种方法只能针对于mysql数据库的连接,不过用这种方法不用安装MyODBC服务器程序。

不管用哪种方法,首先需要安装Mysql数据库,安装方法请看“mysql安装及一些注意点”。最好安装一个Navicat for mysql,方便操作mysql数据库。下面分别说下这两种方法:

(一)通过ADO连接MySql数据库

1、通过ADO连接MySql数据库,首先得安装MyODBC服务器程序。

MyODBC版本要和MySql的版本对应上,否则会连接不上数据库。我用的版本分别是mysql-5.1.48-win32.msi和mysql-connector-odbc-5.1.5-win32.msi。

安装好后,点击开始菜单->设置->控制面板->管理工具->数据源(ODBC)->用户DSN->添加->选择MySQL ODBC 5.1 Driver。如下图:

dev如何连接mysql数据库 dev c++怎么连接数据库_Mysql

然后双击MySQL ODBC 5.1 Driver进行配置。配置好可以点Test进行下测试(如下图),如果能连上会弹出connection successful对话框。

dev如何连接mysql数据库 dev c++怎么连接数据库_MySQL_02

上图中的Data Source Name:中的内容就是代码里DSN所对应的值。

例如:"DSN=MySqlODBC;server=localhost;database=test"。

2、配置好后,就可以开始编码了。

(1)首先导入ADO类型库。#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")。您的环境中msado15.dll不一定在这个目录下,请按实际情况修改。或者把msado15.dll这个文件拷贝到你的工程目录下,直接#import "msado15.dll" \ no_namespace \rename ("EOF", "adoEOF")包含进来。

(2 )创建Connection对象并连接数据库

1. {   
2. CoInitialize(NULL);   
3. m_pConnection.CreateInstance(__uuidof(Connection));   
4. try 
5. {  
6. //设置连接时间  
7. m_pConnection->ConnectionTimeout = 5;  
8. //打开数据库连接  
9. HRESULT hr = m_pConnection->Open("DSN=MySqlODBC;server=localhost;database=test","root","root",adModeUnknown);  
10. }  
11. catch(_com_error &e)  
12. {  
13. MessageBox(NULL, e.Description(), _T(""), MB_OK);  
14. return FALSE;  
15. }   
16. return TRUE;  
17. }


(3)执行SQL语句


    1. BOOL CDBManagerSub::ExecuteSQL( _bstr_t bstrSQL )  
    2. {  
    3. // _variant_t RecordsAffected;  
    4. try 
    5. {  
    6. // 是否已经连接数据库  
    7. if(m_pConnection == NULL)  
    8. {  
    9. //重新连接数据库  
    10. Open(m_dbType, m_strServer, m_strUserName, m_strPasswor, m_strDBName);  
    11. }  
    12. // Connection对象的Execute方法:(_bstr_t CommandText,   
    13. // VARIANT * RecordsAffected, long Options )   
    14. // 其中CommandText是命令字串,通常是SQL命令。  
    15. // 参数RecordsAffected是操作完成后所影响的行数,   
    16. // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名  
    17. // adCmdProc-存储过程;adCmdUnknown-未知  
    18. _RecordsetPtr hr = m_pConnection->Execute(bstrSQL,NULL,adCmdText);  
    19. return true;  
    20. }  
    21. catch(_com_error e)  
    22. {  
    23. MessageBox(NULL, e.Description(), _T(""), MB_OK);  
    24. return false;  
    25. }  
    26. }


    _bstr_t bstrSQL为输入的SQL语句,如果返回TRUE,则执行成功,返回FLASH则会报对应的错误提示。

    例如:下面的创建testTable表的SQL语句:

    1. char* pQuery = "create table if not exists testTable( ID VARCHAR(10), Name VARCHAR(255),Descs VARCHA(255),PRIMARY KEY (ID))";  
    2. ExecuteSQL(pQuery);

     3、附上mysql数据库的操作,方便没有安装Navicat for mysql的朋友参考。

    打开“开始->所有程序->MySQL->MySQL Server 5.0->MySQL Command Line Client.exe”,如果没有设置密码就直接按回车,会提示服务器启动成功。



    1. mysql> SHOW DATABASES;//显示所有的数据库,注意一定要 敲“;”后再按回车  
    2. mysql> CREATE DATABASE mydb;//创建数据库  
    3. mydbmysql> USE mydb;//选择你所创建的数据库  
    4. mydbmysql> SHOW TABLES; //显示数据库中的表  
    5. mysql> CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),remark VARCHAR(200),PRIMARY KEY (username));//创建一个表mytable: 用户名;访问列表,主键为username  
    6. mysql> DESCRIBE mytable;//显示表的结构


    (二)通过MySQL自己的API函数进行连接

    1、使用API的方式连接,需要加载mysql的头文件和lib文件。

    在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\include。在安装MySql的目录下找。 把libmysql.dll和libmysql.lib文件拷贝到所建的工程目录下。然后在头文件里包含以下内容:


      1. //mysql所需的头文件和库文件  
      2. #include "winsock.h" 
      3. #include "mysql.h" 
      4. #pragma comment(lib,"libmySQL.lib")


      2、进行编码

      (1)连接mysql数据库

      头文件里定义数据源指针 MYSQL m_sqlCon;

      //连接MySql数据库


        1. try 
        2. {  
        3. mysql_init(&m_sqlCon);  
        4. // localhost:服务器 root为账号密码 test为数据库名 3306为端口  
        5. if(!mysql_real_connect(&m_sqlCon, "localhost","root","root","test",3306,NULL,0))  
        6. {  
        7. AfxMessageBox(_T("数据库连接失败!"));  
        8. return FALSE;  
        9. }   
        10. return TRUE;  
        11. }  
        12. catch (...)  
        13. {  
        14. return FALSE;  
        15. }


        (2)关闭数据库


          1. mysql_close(&m_sqlCon);


          (3)创建表

          1. char* pQuery = "create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))"   
          2. if(mysql_real_query(&m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)  
          3. {   
          4. const char* pCh = mysql_error(&m_sqlCon);  
          5. return FALSE;  
          6. }

          附MySQL的API接口:


          1. mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。  
          2. mysql_close() 关闭一个服务器连接。  
          3. mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。  
          4. mysql_change_user() 改变在一个打开的连接上的用户和数据库。  
          5. mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。  
          6. mysql_data_seek() 在一个查询结果集合中搜寻一任意行。  
          7. mysql_debug() 用给定字符串做一个DBUG_PUSH。  
          8. mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。  
          9. mysql_dump_debug_info() 让服务器将调试信息写入日志文件。  
          10. mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。  
          11. mysql_errno() 返回最近被调用的MySQL函数的出错编号。  
          12. mysql_error() 返回最近被调用的MySQL函数的出错消息。  
          13. mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。  
          14. mysql_fetch_field() 返回下一个表字段的类型。  
          15. mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。  
          16. mysql_fetch_fields() 返回一个所有字段结构的数组。  
          17. mysql_fetch_lengths() 返回当前行中所有列的长度。  
          18. mysql_fetch_row() 从结果集合中取得下一行。  
          19. mysql_field_seek() 把列光标放在一个指定的列上。  
          20. mysql_field_count() 返回最近查询的结果列的数量。  
          21. mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。  
          22. mysql_free_result() 释放一个结果集合使用的内存。  
          23. mysql_get_client_info() 返回客户版本信息。  
          24. mysql_get_host_info() 返回一个描述连接的字符串。  
          25. mysql_get_proto_info() 返回连接使用的协议版本。  
          26. mysql_get_server_info() 返回服务器版本号。  
          27. mysql_info() 返回关于最近执行得查询的信息。  
          28. mysql_init() 获得或初始化一个MYSQL结构。  
          29. mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。  
          30. mysql_kill() 杀死一个给定的线程。  
          31. mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。  
          32. mysql_list_fields() 返回匹配一个简单的正则表达式的列名。  
          33. mysql_list_processes() 返回当前服务器线程的一张表。  
          34. mysql_list_tables() 返回匹配一个简单的正则表达式的表名。  
          35. mysql_num_fields() 返回一个结果集合重的列的数量。  
          36. mysql_num_rows() 返回一个结果集合中的行的数量。  
          37. mysql_options() 设置对mysql_connect()的连接选项。  
          38. mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。  
          39. mysql_query() 执行指定为一个空结尾的字符串的SQL查询。  
          40. mysql_real_connect() 连接一个MySQL服务器。  
          41. mysql_real_query() 执行指定为带计数的字符串的SQL查询。  
          42. mysql_reload() 告诉服务器重装授权表。  
          43. mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。  
          44. mysql_row_tell() 返回行光标位置。  
          45. mysql_select_db() 连接一个数据库。  
          46. mysql_shutdown() 关掉数据库服务器。  
          47. mysql_stat() 返回作为字符串的服务器状态。  
          48. mysql_store_result() 检索一个完整的结果集合给客户。  
          49. mysql_thread_id() 返回当前线程的ID。  
          50. mysql_use_result() 初始化一个一行一行地结果集合的检索。


          通过本文的介绍,希望你对C++连接mysql数据库的两种方法有所了解,供参考。



          C++连接...




          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



          以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
          本节笔记到这里就结束了。

          潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
          游戏开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
          如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
          最后,谢谢你们一直的支持~~~