当前各种主流数据库,
Oracle, MS SQL Server, MySQL, DB2, MS ACCESS, Sybase, Informix, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen等等。
连接数据库大致分如下四个步骤:
(1)初始化
在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接口程序举例 */ |
3、建表和插入数据记录
上述示例程序如要正确运行,还需以Oracle库的合法用户登录,并创建AUTHS表和插入一些数据记录。建表文件、建表命令和插入数据记录的示例命令如下所述。这里叙述的工作完成后,上节生成的可执行文件才能正确运行。
REM 以下为建表文件auths.SQL
DROP TABLE auths CASCADE CONSTRAINTS |
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 智能指针类型
第一种方法是利用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对象并连接数据库
- {
- CoInitialize(NULL);
- m_pConnection.CreateInstance(__uuidof(Connection));
- try
- {
- //设置连接时间
- m_pConnection->ConnectionTimeout = 5;
- //打开数据库连接
- HRESULT hr = m_pConnection->Open("DSN=MySqlODBC;server=localhost;database=test","root","root",adModeUnknown);
- }
- catch(_com_error &e)
- {
- MessageBox(NULL, e.Description(), _T(""), MB_OK);
- return FALSE;
- }
- return TRUE;
- }
(3)执行SQL语句
- BOOL CDBManagerSub::ExecuteSQL( _bstr_t bstrSQL )
- {
- // _variant_t RecordsAffected;
- try
- {
- // 是否已经连接数据库
- if(m_pConnection == NULL)
- {
- //重新连接数据库
- Open(m_dbType, m_strServer, m_strUserName, m_strPasswor, m_strDBName);
- }
- // Connection对象的Execute方法:(_bstr_t CommandText,
- // VARIANT * RecordsAffected, long Options )
- // 其中CommandText是命令字串,通常是SQL命令。
- // 参数RecordsAffected是操作完成后所影响的行数,
- // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
- // adCmdProc-存储过程;adCmdUnknown-未知
- _RecordsetPtr hr = m_pConnection->Execute(bstrSQL,NULL,adCmdText);
- return true;
- }
- catch(_com_error e)
- {
- MessageBox(NULL, e.Description(), _T(""), MB_OK);
- return false;
- }
- }
_bstr_t bstrSQL为输入的SQL语句,如果返回TRUE,则执行成功,返回FLASH则会报对应的错误提示。
例如:下面的创建testTable表的SQL语句:
- char* pQuery = "create table if not exists testTable( ID VARCHAR(10), Name VARCHAR(255),Descs VARCHA(255),PRIMARY KEY (ID))";
- ExecuteSQL(pQuery);
3、附上mysql数据库的操作,方便没有安装Navicat for mysql的朋友参考。
打开“开始->所有程序->MySQL->MySQL Server 5.0->MySQL Command Line Client.exe”,如果没有设置密码就直接按回车,会提示服务器启动成功。
- mysql> SHOW DATABASES;//显示所有的数据库,注意一定要 敲“;”后再按回车
- mysql> CREATE DATABASE mydb;//创建数据库
- mydbmysql> USE mydb;//选择你所创建的数据库
- mydbmysql> SHOW TABLES; //显示数据库中的表
- mysql> CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),remark VARCHAR(200),PRIMARY KEY (username));//创建一个表mytable: 用户名;访问列表,主键为username
- mysql> DESCRIBE mytable;//显示表的结构
(二)通过MySQL自己的API函数进行连接
1、使用API的方式连接,需要加载mysql的头文件和lib文件。
在VS2010的附加包含目录中添加\MySQL\MySQL Server 5.1\include。在安装MySql的目录下找。 把libmysql.dll和libmysql.lib文件拷贝到所建的工程目录下。然后在头文件里包含以下内容:
- //mysql所需的头文件和库文件
- #include "winsock.h"
- #include "mysql.h"
- #pragma comment(lib,"libmySQL.lib")
2、进行编码
(1)连接mysql数据库
头文件里定义数据源指针 MYSQL m_sqlCon;
//连接MySql数据库
- try
- {
- mysql_init(&m_sqlCon);
- // localhost:服务器 root为账号密码 test为数据库名 3306为端口
- if(!mysql_real_connect(&m_sqlCon, "localhost","root","root","test",3306,NULL,0))
- {
- AfxMessageBox(_T("数据库连接失败!"));
- return FALSE;
- }
- return TRUE;
- }
- catch (...)
- {
- return FALSE;
- }
(2)关闭数据库
- mysql_close(&m_sqlCon);
(3)创建表
- char* pQuery = "create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))"
- if(mysql_real_query(&m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)
- {
- const char* pCh = mysql_error(&m_sqlCon);
- return FALSE;
- }
附MySQL的API接口:
- mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查询影响的行数。
- mysql_close() 关闭一个服务器连接。
- mysql_connect() 连接一个MySQL服务器。该函数不推荐;使用mysql_real_connect()代替。
- mysql_change_user() 改变在一个打开的连接上的用户和数据库。
- mysql_create_db() 创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。
- mysql_data_seek() 在一个查询结果集合中搜寻一任意行。
- mysql_debug() 用给定字符串做一个DBUG_PUSH。
- mysql_drop_db() 抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。
- mysql_dump_debug_info() 让服务器将调试信息写入日志文件。
- mysql_eof() 确定是否已经读到一个结果集合的最后一行。这功能被反对; mysql_errno()或mysql_error()可以相反被使用。
- mysql_errno() 返回最近被调用的MySQL函数的出错编号。
- mysql_error() 返回最近被调用的MySQL函数的出错消息。
- mysql_escape_string() 用在SQL语句中的字符串的转义特殊字符。
- mysql_fetch_field() 返回下一个表字段的类型。
- mysql_fetch_field_direct () 返回一个表字段的类型,给出一个字段编号。
- mysql_fetch_fields() 返回一个所有字段结构的数组。
- mysql_fetch_lengths() 返回当前行中所有列的长度。
- mysql_fetch_row() 从结果集合中取得下一行。
- mysql_field_seek() 把列光标放在一个指定的列上。
- mysql_field_count() 返回最近查询的结果列的数量。
- mysql_field_tell() 返回用于最后一个mysql_fetch_field()的字段光标的位置。
- mysql_free_result() 释放一个结果集合使用的内存。
- mysql_get_client_info() 返回客户版本信息。
- mysql_get_host_info() 返回一个描述连接的字符串。
- mysql_get_proto_info() 返回连接使用的协议版本。
- mysql_get_server_info() 返回服务器版本号。
- mysql_info() 返回关于最近执行得查询的信息。
- mysql_init() 获得或初始化一个MYSQL结构。
- mysql_insert_id() 返回有前一个查询为一个AUTO_INCREMENT列生成的ID。
- mysql_kill() 杀死一个给定的线程。
- mysql_list_dbs() 返回匹配一个简单的正则表达式的数据库名。
- mysql_list_fields() 返回匹配一个简单的正则表达式的列名。
- mysql_list_processes() 返回当前服务器线程的一张表。
- mysql_list_tables() 返回匹配一个简单的正则表达式的表名。
- mysql_num_fields() 返回一个结果集合重的列的数量。
- mysql_num_rows() 返回一个结果集合中的行的数量。
- mysql_options() 设置对mysql_connect()的连接选项。
- mysql_ping() 检查对服务器的连接是否正在工作,必要时重新连接。
- mysql_query() 执行指定为一个空结尾的字符串的SQL查询。
- mysql_real_connect() 连接一个MySQL服务器。
- mysql_real_query() 执行指定为带计数的字符串的SQL查询。
- mysql_reload() 告诉服务器重装授权表。
- mysql_row_seek() 搜索在结果集合中的行,使用从mysql_row_tell()返回的值。
- mysql_row_tell() 返回行光标位置。
- mysql_select_db() 连接一个数据库。
- mysql_shutdown() 关掉数据库服务器。
- mysql_stat() 返回作为字符串的服务器状态。
- mysql_store_result() 检索一个完整的结果集合给客户。
- mysql_thread_id() 返回当前线程的ID。
- mysql_use_result() 初始化一个一行一行地结果集合的检索。
通过本文的介绍,希望你对C++连接mysql数据库的两种方法有所了解,供参考。