要做上位了,今天尝试下用VC6.0在后台链接SQL 数据库,参考了《Visual C++数据库通用模块开发与系统移植》的第一章内容,下面简单说下步骤:
1.新建一个MFC基于对话框的程序,工程名为data.
2.打开SQL SERVER,新建一个data1的数据库。
3.在stdafx.h文件中最后输入:#import "c:\program files\common files\system\ado\msadO15.dll" no_namespace rename("EOF","adoEOF")
注意不要有分号
4.在自动生成的CdataApp类源文件中,即在data.cpp源文件的前面,定义两个全局变量:
#endif _ConnectionPtr m_pConnection; //添加在此处,记住啊 _RecordsetPtr m_pRecordset;
书上说的是在生成的应用程序的头文件中定义,可是我试过,在data.h中定义的时候,在CdataDlg类访问这两个变量时会出错,所以我就改在data.cpp的前面定义了,然后在CdataDlg.cpp 源文件的前面 用extern声明下就可以了使用了。
5.在data.cpp的初始化函数中添加COM初始化代码:
BOOL CDataApp::InitInstance() { if(!AfxOleInit()) { AfxMessageBox("OLE初始化出错!"); return FALSE; } AfxEnableControlContainer(); //初始化COM对象 CoInitialize(NULL);
......
之后接着上面,添加如下代码,试着创建一个名为学生信息的表:
try { m_pConnection.CreateInstance("ADODB.Connection");//"ADODB.Connection" _uuidof(Connection) m_pRecordset.CreateInstance("ADODB.Recordset"); //定义数据库连接字符串, m_pConnection->Open("driver={SQL Server};Server=(local);DATABASE=data1","","",adModeUnknown);//!!!!!!!!!
}
//COM错误取得,当执行COM功能的时候,如果出错,则可以扑捉到_com_error的异常 catch(_com_error &e) { ::CoUninitialize(); ::AfxMessageBox(e.ErrorMessage()); return FALSE; }
在注释为!!!!!!!的地方一定要注意,如果你安装 SQL的时候没有设密码,这里要把UID 和 PWD取消掉,如果有密码,则按下面方式,我之前用的是下面的方式,调试时一直出现idispatch #3149,后来把那两个去掉就没事了。
m_pConnection->Open("driver={SQL Server};Server=(local);DATABASE=data1;UID=sa;PWD=000","","",adModeUnknown);
6.在资源列表中的对话框中,添加一个按钮,并添加相应函数,在这个函数中添加如下代码,实现创建一个表并添加一个记录和返回记录个数的功能:
void CDataDlg::OnBtnTable() { // TODO: Add your control notification handler code here _variant_t ra; m_pConnection->Execute("CREATE TABLE 学生信息(学号 INTEGER,姓名 TEXT,年龄 INTEGER,生日 DATETIME)",&ra,adCmdText); //往表格里添加记录, m_pConnection->Execute("INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES(200202,'周华',22,'1978-08-16')",&ra,adCmdText); //执行SQL统计命令 m_pRecordset=m_pConnection->Execute("SELECT COUNT(*) FROM 学生信息",&ra,adCmdText); _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)(0)); m_pRecordset->Close(); CString message; message.Format("共有%d条记录",vCount.lVal); AfxMessageBox(message); }
编辑运行就可以看到数据库data1有一个学生信息的表了,并且里面有一条记录。
我刚才又试了一下,其实没必要在data.cpp中定义下面两个变量:
_ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset;可以直接在dataDlg.cpp的前面直接定义,将初始化COM对象的那段移到dataDlg.cpp的初始化函数中,一样可以实现。大家可以多试下,我也只是个新手,不足的地方请多指教。总结:多思考,多动手,多尝试,不要完全相信书上的内容,多试几遍,其实没你想的那么难。