C++ 连接数据库

主流数据库

        当前各种主流数据库,

        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。如下图:

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

上图中的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;  

(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;  

附MySQL的API接口:

 
  1. mysql_affected_rows() 返回被最新的UPDATEDELETEINSERT查询影响的行数。  
  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++连接...


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

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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页