VC中使用ADO连接SQL数据库的问题

blackxcq 2007-06-23 05:43:02
我最近参照北京交通大学出版的一本<<Visual C++程序开发案例解析>>的书,开发一个用ADO访问sql数据库的案例,我用sql server 2000创建一个数据库,首先我打开企业管理器,在sql server组下面的数据库上面右击,选择新建数据库,在数据库属性页面上的名称一栏我输入了ShopAssistant,然后点击确定创建了这个数据库,我查看这个数据库的属性,所有者是:microsof-053516\Administrator,然后我用SQL查询分析器创建了各个表。
在VC中用_ConnectionPtr pConn;用pConn打开数据库的时候发生了问题,代码如下:

_ConnectionPtr pConn;
_CommandPtr pCommand;

try
{
_bstr_t Conn="DSN="+_bstr_t(m_LoginDSN)+";";
pConn.CreateInstance(__uuidof(Connection));
hr=pConn->Open(Conn,_bstr_t(""),_bstr_t(""),adModeUnknown);
}

catch(_com_error&ex)
{
AfxMessageBox(ex.Description());
}

其中m_LoginDSN=ShopAssistant,为什么会发生异常,进入catch块中,其中就是pConn没有打开数据库,我上面应该很清楚的说明了我是如何创建这个数据库的,请大侠们帮我看看,我应该怎样连接这个数据库?(在控制面板-管理工具-数据源下我已设置了系统DNS,sql server已启动)
...全文
727 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
quiton 2007-06-26
  • 打赏
  • 举报
回复
(1).在文件stdafx.h中最后一个#endif的前一行写入
#import "C:\program files\common files\System\ado\msado15.dll" no_namespace \
rename("EOF","EndOfFile") \
rename("LockTypeEnum","newLockTypeEnum")\
rename("DataTypeEnum","newDataTypeEnum")\
rename("FieldAttributeEnum","newFieldAttributeEnum")\
rename("EditModeEnum","newEditModeEnum")\
rename("RecordStatusEnum","newRecordStatusEnum")\
rename("ParameterDirectionEnum","newParameterDirectionEnum")
如果你的系统不是安装在C盘的话就把#import 后面的C改成系统所有的盘
(2).在C***App类的
public:下加入
_RecordsetPtr m_pADOSet;
bool ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL);
在private:下加入_ConnectionPtr ADOConn;
在class C***App : public CWinApp
{
...
};之后#endif之前加入extern C***App theApp;

(3)在BOOL C***App::InitInstance()函数中Enable3dControls(); // Call this when linking to MFC statically这一行下面加入
if( FAILED(::CoInitialize(NULL)) )
{
AfxMessageBox("ADO Init failed");
return false;
}
try
{
ADOConn.CreateInstance(__uuidof(Connection));
ADOConn->Open("DSN=OBDC数据源;Provider=MSDASQL","用户","密码", adConnectUnspecified);//这一行要自已修改
}
catch(_com_error &e)
{
CString err;
err.Format("%s", (char*)(e.Description()) );
AfxMessageBox(err);
}
catch(...)
{
AfxMessageBox("Unknown Error...");
}
m_pADOSet.CreateInstance(__uuidof(Recordset));
并在文件最后加上如下代码:
bool C***App::ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL)
{
if ( ADOSet->State == adStateOpen) ADOSet->Close();
try
{
ADOSet->Open(strSQL, ADOConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdUnknown);
return true;
}
catch(_com_error &e)
{
CString err;
err.Format("ADO Error: %s",(char*)e.Description());
AfxMessageBox(err);
return false;
}
}


最后就可以在登录时执行SQL语句了,比如用户为CString strUser, 密码是CString strPwd;数据库表是user_table(user_id, user_name, user_pwd)则
_variant_t strQuery, Holder;
strQuery = "select * from user_table where user_name='"+strUser +"' and user_pwd='"+ strPwd +"'";
theApp.ADOExecute(theApp.m_pADOSet, strQuery);
int iCount = theApp.m_pADOSet->GetRecordCount();
if ( 0==iCount )
{
AfxMessageBox(_T("密码错误"), MB_ICONEXCLAMATION);
return;
}
else
{
AfxMessageBox(_T("登录成功"), MB_ICONEXCLAMATION);
}
jxufeng 2007-06-26
  • 打赏
  • 举报
回复
你要先配置好了!那个对话框里就行啊!或者用记事本打开那个文件也行啊!
blackxcq 2007-06-26
  • 打赏
  • 举报
回复
jxufeng(玉龙猪) ,请问在那里看连接字符串?
stone_oo 2007-06-25
  • 打赏
  • 举报
回复
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");
if(hr==0)
{
hr = m_pConnection->Open("Provider=SQLOLEDB;DataSource=计算机名/IP;Initial Catalog = 数据库名","用户名","密码",adModeUnknown);
if(hr==0)
AfxMessageBox("db link success");
}
}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);
}
jxufeng 2007-06-25
  • 打赏
  • 举报
回复
在桌面上建一个空的xxx.udl文件,就是用鼠标右键新建文本文件,然后改扩展名。
然后双击这个文件,就会出现对话框的,在这个对话框里配置吧,最后把生成的字符串拷贝到你的程序中,就是你所要的。
blackxcq 2007-06-25
  • 打赏
  • 举报
回复
我就是不知道服务器名称,登录名和密码啊,所以我上面详细的说明了我是怎么创建这个数据库的,请各位给我说说怎么查看用户名和密码,本地机器上的服务器应该是什么?
youngwolf 2007-06-24
  • 打赏
  • 举报
回复
试试这样:
pConn->Open(""Driver={SQL Server};Server=%s;NetWork Library=DBNMPNTW;Uid=%S;Pwd=%S;DataBase=%s"", NULL, NULL, adModeUnknown);

上面的%s需要你用直接的值去替换。
zaodt 2007-06-23
  • 打赏
  • 举报
回复

搜索以前的相关帖子。
blackxcq 2007-06-23
  • 打赏
  • 举报
回复
感谢回答,DSN是正确的,另外,先不管执行语句,光打开就出现错误,请大侠们继续关注
MeridaWarrior 2007-06-23
  • 打赏
  • 举报
回复
pConn->Open(Conn,_bstr_t(""),_bstr_t(""),adModeUnknown);只是打开数据库,没有执行任何sql命令啊。
你试一试pConn->Execute("sql command statement",。,。,。)
MeridaWarrior 2007-06-23
  • 打赏
  • 举报
回复
你的代码:_bstr_t Conn="DSN="+_bstr_t(m_LoginDSN)+";";

DNS not DSN,try this?

如果不行,去掉下面的“hr=”再试一试?
hr=pConn->Open(Conn,_bstr_t(""),_bstr_t(""),adModeUnknown);

4,017

社区成员

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

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