首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

无效指针的有关问题

2012-03-15 
无效指针的问题初学ADO,写一段连接SQL2000的代码,试了各种写法,都会出错,出错信息是:无效指针。我在网上搜

无效指针的问题
初学ADO,写一段连接SQL2000的代码,试了各种写法,都会出错,出错信息是:无效指针。我在网上搜了一下,好像是有些机器上会这样,却没有找到解决的办法。我想是不是差什么文件或者SQL2000版本问题啊。我的机器是XP系统的。

[解决办法]
代码贴下~~
[解决办法]
ADO组件安装好了?版本正确?
[解决办法]
更新mdac试一下
[解决办法]
MDAC 2.8 sp1 以及sql server 2000 sp4,这是最起码的要求

[解决办法]
你是网络连接还是单机?网络连接的话。你要查下防火墙是不拦截了。。最好把那些什么防火墙之类的东西都关掉,再测试下:单机的话。你就慢慢查下。。有可能数据没配对吧。
[解决办法]
先检查你的代码是否正确

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

很多是程序不对的原因,


[解决办法]
try内语句没错.但有异常啊,把异常那句帖出来吧?
[解决办法]
m_pConnection-> Open( "DataSource=DATABASE;UID=sa;PWD=; ", " ", " ",adModeUnknown);
//连接字符串有问题啊,SQL SERVER至少要指定数据库和数据服务器
[解决办法]
(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

热点排行