现在的位置: 首页 > 综合 > 正文

visual c++与sql server 2000数据库进行ADO后台链接的操作

2012年01月12日 ⁄ 综合 ⁄ 共 2182字 ⁄ 字号 评论关闭
要做上位了,今天尝试下用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的初始化函数中,一样可以实现。大家可以多试下,我也只是个新手,不足的地方请多指教。

总结:多思考,多动手,多尝试,不要完全相信书上的内容,多试几遍,其实没你想的那么难。


抱歉!评论已关闭.