MFC利用ADO连接连接SQL SERVER 2008时,出现的问题

辉哥聊职场聊家庭 2014-06-30 06:26:33
1.在MFC应用程序中,我先用ADO连接了ACCESS数据库,可以正常连接~~ACCESS数据库名为test1,里面有一张数据表,名为user1表里有三列, 分别是 id、name、age

2.我想试一下程序与SQL SERVER 2008的连接,于是,我在sql server里建立了一个数据库,名为test1,在库里添加了一张表user1id和age设为int类型,name设为nchar(10)类型~~

3.在连接部分,我把原来连接ACCESS的字符串改了,变成下面的语句:
hr = m_pConnection->Open("Provider=SQLOLEDB; Server=RICHARDLEE;Database=D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test1.mdf; uid=sa; pwd=sa;","","",adModeUnknown);

其中,RICHARDLEE是我本地服务器的名称,D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\test1.mdf是我建立的数据库的详细文件名,数据库没有用户名和密码(设置为windows默认的),当我运行程序时,提示连接错误,我想知道是什么原因,(PS:我只是改了一下连接字符串而已,其他的地方都未改动) 另外,提示的错误信息是 IDispatch error #3149
...全文
201 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 GANSUYZHY 的回复:
我之前做项目总结的MFCADO链接数据库
ADO操作SQL
Visual C++提供了多种多样的数据库访问技术——ODBC API、MFC ODBC、DAO、OLE DB、ADO等。
其中ADO技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且,ADO对OLE DB的接口作了封装,定义了ADO对象,使程序开发得到简化,ADO技术属于数据库访问的高层接口。
1.导入相关库文件(一般在StdAfx.h中导入)													        
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename("EOF","adoEOF")
在#ifdef _UNICODE前面
2.初始化COM库(一般在InitInstance()中初始化)
BOOL CadoconnectionApp::InitInstance()
{
	CWinApp::InitInstance();
AfxOleInit();//初始化COM库
	AfxEnableControlContainer();
}
3 接口简介
ADO库包含三个基本接口:
__ConnectionPtr接口	创建数据库连接
__CommandPtr接口	执行SQL命令
__RecordsetPtr接口	返回结果集
 
__ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。用__ConnectionPtr接口返回一个记录集不是一个好的使用方法。
 
__CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用__CommandPtr接口时,可以利用全局__ConnectionPtr接口,也可以在__CommandPtr接口里直接使用连接串。如果只执行一次或几次数据访问操作,后者是比较好的选择。但如果要频繁访问数据库,并要返回很多记录集,那么,应该使用全局__ConnectionPtr接口创建一个数据连接,然后使用__CommandPtr接口执行存储过程和SQL语句。
 
__RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同__CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给__RecordsetPtr的connection成员变量,让它自己创建数据连接。如果要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局—ConnectionPtr接口,然后使用__RecordsetPtr执行存储过程和SQL语句。
4.连接数据库
在对话框
public:
	_RecordsetPtr m_pRecordset;
	_ConnectionPtr m_pConnection;
	_CommandPtr m_pCommand;
在类的构造函数中创建:
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCommand.CreateInstance(__uuidof(Command));

BOOL CADODlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// TODO: Add extra initialization here
	try
	{
		m_pConnection->ConnectionTimeout=10;
		m_pConnection ->Open("Provider=SQLOLEDB;Data Source= PC-20140312ZLBA;Initial Catalog=CNCDB","dbaccess","dbaccess",adModeUnknown);
		///连接数据库
		MessageBox( L"连接数据库成功");
	}
	catch(_com_error e)
	{
		AfxMessageBox(_T("连接数据库失败!"));
		return TRUE;
	}
	return TRUE;  // return TRUE  unless you set the focus to a control
}
5.数据库操作
m_pConnection ->Execute("delete from TBL_CONNECTLOGS",NULL,adCmdText);

6.关闭连接
void XXXX::OnDestroy()
{	
	if(m_pConnection ->State)
	{
		m_pConnection ->Close();
	}
	m_pConnection =NULL;
}


补充:连接字符串的模式
一般模式
"Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;uid=SQL用户名;pwd=SQL密码;"

信任模式
"Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;Integrated Security=SSPI;" 

网络模式
"Provider=SQLOLEDB;Data Source=IP地址,端口;Network Library=DBMSSOCN;Initial Catalog=数据库;UserID=用户名;Password=密码;" 

注意看下面这两种写法,其实是一个意思:
m_pConnect->Open("Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;","sa","123456",-1);
m_pConnect->Open("Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;uid=sa;pwd=123456;","","",-1);

如果是本地服务器,服务器名就是电脑的用户名吗? 数据库包不包含全部路径??还有数据库的后缀名要不要写?是否为*.mdf
fishion 2014-07-01
  • 打赏
  • 举报
回复
你可以创建一下txt文件,然后改文件后缀为.udl,再进行连接,连接成功后可以用文本打开的方式查年连接符
pingshell 2014-07-01
  • 打赏
  • 举报
回复
看错误是COM组件报的错。
HUSTYZHY 2014-07-01
  • 打赏
  • 举报
回复
我之前做项目总结的MFCADO链接数据库
ADO操作SQL
Visual C++提供了多种多样的数据库访问技术——ODBC API、MFC ODBC、DAO、OLE DB、ADO等。
其中ADO技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且,ADO对OLE DB的接口作了封装,定义了ADO对象,使程序开发得到简化,ADO技术属于数据库访问的高层接口。
1.导入相关库文件(一般在StdAfx.h中导入)													        
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename("EOF","adoEOF")
在#ifdef _UNICODE前面
2.初始化COM库(一般在InitInstance()中初始化)
BOOL CadoconnectionApp::InitInstance()
{
	CWinApp::InitInstance();
AfxOleInit();//初始化COM库
	AfxEnableControlContainer();
}
3 接口简介
ADO库包含三个基本接口:
__ConnectionPtr接口	创建数据库连接
__CommandPtr接口	执行SQL命令
__RecordsetPtr接口	返回结果集
 
__ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。用__ConnectionPtr接口返回一个记录集不是一个好的使用方法。
 
__CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用__CommandPtr接口时,可以利用全局__ConnectionPtr接口,也可以在__CommandPtr接口里直接使用连接串。如果只执行一次或几次数据访问操作,后者是比较好的选择。但如果要频繁访问数据库,并要返回很多记录集,那么,应该使用全局__ConnectionPtr接口创建一个数据连接,然后使用__CommandPtr接口执行存储过程和SQL语句。
 
__RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。同__CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给__RecordsetPtr的connection成员变量,让它自己创建数据连接。如果要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局—ConnectionPtr接口,然后使用__RecordsetPtr执行存储过程和SQL语句。
4.连接数据库
在对话框
public:
	_RecordsetPtr m_pRecordset;
	_ConnectionPtr m_pConnection;
	_CommandPtr m_pCommand;
在类的构造函数中创建:
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCommand.CreateInstance(__uuidof(Command));

BOOL CADODlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// TODO: Add extra initialization here
	try
	{
		m_pConnection->ConnectionTimeout=10;
		m_pConnection ->Open("Provider=SQLOLEDB;Data Source= PC-20140312ZLBA;Initial Catalog=CNCDB","dbaccess","dbaccess",adModeUnknown);
		///连接数据库
		MessageBox( L"连接数据库成功");
	}
	catch(_com_error e)
	{
		AfxMessageBox(_T("连接数据库失败!"));
		return TRUE;
	}
	return TRUE;  // return TRUE  unless you set the focus to a control
}
5.数据库操作
m_pConnection ->Execute("delete from TBL_CONNECTLOGS",NULL,adCmdText);

6.关闭连接
void XXXX::OnDestroy()
{	
	if(m_pConnection ->State)
	{
		m_pConnection ->Close();
	}
	m_pConnection =NULL;
}


补充:连接字符串的模式
一般模式
"Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;uid=SQL用户名;pwd=SQL密码;"

信任模式
"Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;Integrated Security=SSPI;" 

网络模式
"Provider=SQLOLEDB;Data Source=IP地址,端口;Network Library=DBMSSOCN;Initial Catalog=数据库;UserID=用户名;Password=密码;" 

注意看下面这两种写法,其实是一个意思:
m_pConnect->Open("Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;","sa","123456",-1);
m_pConnect->Open("Provider=SQLOLEDB;Data Source=服务器;Initial Catalog=数据库;uid=sa;pwd=123456;","","",-1);

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧