初学ADO,写一段连接SQL2000的代码,试了各种写法,都会出错,出错信息是:无效指针。我在网上搜了一下,好像是有些机器上会这样,却没有找到解决的办法。我想是不是差什么文件或者SQL2000版本问题啊。我的机器是XP系统的。
解决方案 »
- 实际编程中遇到的问题-结构体的sizeof
- CreateDIBSection()的第一个参数设置为 NULL代表什么意思
- 为什么BSTR向LPCTSTR转换的过程中出现问题?请高手帮我检查一下代码!
- 有一个VC程序,有原程序,在VC中也可以通过,如何给它加上个参数再重新编译?以调用它的部分功能
- 大侠们进来看看,发了好多帖子都没有解答的问题,谢谢了!!!
- 请问怎样读取当前字体的大小(字号)?
- 菜鸟,WIN32 Application的工程中如何使用MFC?
- 请问怎样在刷新时间的同时部刷新窗口中的其他视图
- 如何检测一台计算机上是否装有MODEM,用什么函数??
- 紧急求救:VC程序员请进....
- WaitForSingleObject后,事件为什么自己变成了非激发态?
- 跪求如何用 MFC写一个 程序下载FTP上的一个文件夹 急死了
或者
CoInitialize(NULL)
加了吗在app的InitInstance中刚才有个哥们就是这个问题
if ( !AfxOleInit() )
{
AfxMessageBox( " OLE fail! ");
return false;
}
//连接数据库
if ( S_OK == CoInitialize( NULL ) )
{
try
{
m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
m_pConnection->Open("DataSource=DATABASE;UID=sa;PWD=;","","",adModeUnknown);
} catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
return FALSE;
}
}
else
{
AfxMessageBox( "CoInitialize() fail!" );
return false;
}就这个样子,几乎照着例子写的。
快来看看,腾迅为庆祝腾讯QQ八周年,现在开放六位 QQ 号码免费申请,数量有限,送完即止,加油吧
//连接字符串有问题啊,SQL SERVER至少要指定数据库和数据服务器
#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