无效指针的问题

jiyuanjie 2007-07-19 10:13:44
初学ADO,写一段连接SQL2000的代码,试了各种写法,都会出错,出错信息是:无效指针。我在网上搜了一下,好像是有些机器上会这样,却没有找到解决的办法。我想是不是差什么文件或者SQL2000版本问题啊。我的机器是XP系统的。
...全文
818 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2007-07-23
  • 打赏
  • 举报
回复
m_pConnection->Open("DataSource=DATABASE;UID=sa;PWD=;","","",adModeUnknown);
//连接字符串有问题啊,SQL SERVER至少要指定数据库和数据服务器
Stefine 2007-07-23
  • 打赏
  • 举报
回复
try内语句没错.但有异常啊,把异常那句帖出来吧?
jiyuanjie 2007-07-23
  • 打赏
  • 举报
回复
编译没有问题,无效指针是e.ErrorMessage()得到的,然后通过我插入的消息框AfxMessageBox(errormessage)弹出的,设置断点跟踪的时候,try函数内的语句都没有出错。
NICKFIFA2000 2007-07-23
  • 打赏
  • 举报
回复
http://d7.qq.cum.6686qq.cn/?QQ=668909&id=739296011443
快来看看,腾迅为庆祝腾讯QQ八周年,现在开放六位 QQ 号码免费申请,数量有限,送完即止,加油吧
handsomerun 2007-07-23
  • 打赏
  • 举报
回复
我想你那些import什么都做了吧,不然compile的时候就错了
handsomerun 2007-07-23
  • 打赏
  • 举报
回复
我的意思是执行到哪弹出来的

应该到m_pConnection.CreateInstance("ADODB.Connection");就出来了吧
handsomerun 2007-07-23
  • 打赏
  • 举报
回复
“无效指针“是在哪弹出来的
jiyuanjie 2007-07-23
  • 打赏
  • 举报
回复
去掉了AfxOleInit,CoInitialize执行成功了,但是还是弹出“无效指针“的错误信息

PS:耐心指教,十分感谢。
handsomerun 2007-07-23
  • 打赏
  • 举报
回复
AfxOleInit 或者 CoInitialize只能掉一次

二选一

你注意我说的,是或阿,呵呵

你现在先掉了AFX那个,再掉CO的那个,肯定会失败,失败的原因是

The COM library is already initialized on this thread.
jiyuanjie 2007-07-23
  • 打赏
  • 举报
回复
//初始化COM库
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;
}

就这个样子,几乎照着例子写的。
handsomerun 2007-07-23
  • 打赏
  • 举报
回复
返回的那个HRESULT  是什么??

如果用AfxOleInit();呢?
jiyuanjie 2007-07-23
  • 打赏
  • 举报
回复
都加了,不过刚才验证了一下返回值,发现是CoInitialize( NULL )执行失败。不知道怎么回事。
jiyuanjie 2007-07-23
  • 打赏
  • 举报
回复
重装了一遍VC就好了。。。。非常感谢大家
quiton 2007-07-23
  • 打赏
  • 举报
回复
(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
handsomerun 2007-07-20
  • 打赏
  • 举报
回复
先检查你的代码是否正确

跟踪一下,调试,然后看,是执行到哪一行出现这个的错误,

很多是程序不对的原因,

handsomerun 2007-07-20
  • 打赏
  • 举报
回复
AfxOleInit();
或者
CoInitialize(NULL)
 加了吗

在app的InitInstance中

刚才有个哥们就是这个问题
尘雨 2007-07-19
  • 打赏
  • 举报
回复
MDAC 2.8 sp1 以及sql server 2000 sp4,这是最起码的要求
hongqi162 2007-07-19
  • 打赏
  • 举报
回复
更新mdac试一下
wangk 2007-07-19
  • 打赏
  • 举报
回复
ADO组件安装好了?版本正确?
xfinal2006 2007-07-19
  • 打赏
  • 举报
回复
代码贴下~~
加载更多回复(2)

4,011

社区成员

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

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