关于MFC单文档中ADO连接数据库的使用。

asdfghjrsfv 2014-03-30 09:00:47
我是新手,想做一个MFC通过ADO连接SQL SERVER的软件。我按网上的方法在stdafx.h中添加
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
但运行后出错
1>ViewTree.obj : error LNK2011: 未链接预编译对象;映像可能不能运行
1>E:\运河杯(奖学金管理系统)\最终成果\Scholarship\Debug\Scholarship.exe : fatal error LNK1120: 1 个无法解析的外部命令
请问如何才能正确连接ADO(我在向导里选的是无数据库支持)?
...全文
826 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
风居住de街道 2016-08-30
  • 打赏
  • 举报
回复
问问 你是 怎么解决的 我出现了 同样的错误
guoweilk 2016-03-14
  • 打赏
  • 举报
回复
问问 你是 怎么解决的 我出现了 同样的错误
Geek青松 2014-05-05
  • 打赏
  • 举报
回复
改用rebuild即可;也就是生成->重新生成解决方案
天之说星之语 2014-04-16
  • 打赏
  • 举报
回复
引用 6 楼 u014268582 的回复:
这个问题怎么解决得啊?能解释一下吗,最开始的那个问题?
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
worldy 2014-03-30
  • 打赏
  • 举报
回复
那就奇怪了,我一直都这样用,好好的 话说,你把那句放在什么地方?
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
那你改用下面试试,这个肯定是可以的: #import "C:\Program Files\Common Files\System\ado\msado28.tlb" \ no_namespace \ rename("EOF","adoEOF")
你好,我试了下你的语句还是同样的错误提示。但如果把这条语句去掉的话可以正常运行。
worldy 2014-03-30
  • 打赏
  • 举报
回复
那你改用下面试试,这个肯定是可以的: #import "C:\Program Files\Common Files\System\ado\msado28.tlb" \ no_namespace \ rename("EOF","adoEOF")
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile") 没什么问题,lz得检查什么符号无法连接,符合在哪定义的,是自己定义的,还是include进来的,然后再寻求对策
我的都是按向导生成的,只加了这一条语句
worldy 2014-03-30
  • 打赏
  • 举报
回复
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile") 没什么问题,lz得检查什么符号无法连接,符合在哪定义的,是自己定义的,还是include进来的,然后再寻求对策
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 14 楼 worldy 的回复:
菜单-项目-常规-字符集---->改为未指定
已成,谢谢。
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复

引用 14 楼 worldy 的回复:
菜单-项目-常规-字符集---->改为未指定

修改后前两点没有问题了,第三点还是不行,前面说用CString过渡,怎么写?
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 14 楼 worldy 的回复:
菜单-项目-常规-字符集---->改为未指定

在哪儿,项目下面没有看到
worldy 2014-03-30
  • 打赏
  • 举报
回复
菜单-项目-常规-字符集---->改为未指定
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 12 楼 worldy 的回复:
你这是让我猜啊,我哪知道你参数是怎么定义的 我估计你这几条命令出错应该是参数类型不正确,但第三条应该没有问题吧,如果3真有问题,弄个CString过度一下

#if !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)
#define AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class ADOConn : public CObject
{
public:
//添加一个指向Connection对象的指针:
_ConnectionPtr m_pConnection;
//添加一个指向Recordset对象的指针:
_RecordsetPtr m_pRecordset;
char error[1024];
public:
_ConnectionPtr& GetConnPtr()    {return m_pConnection;}
_RecordsetPtr& GetRecoPtr()     {return m_pRecordset;}
public:
//事务回滚
BOOL RollbackTrans();
//递交 事务
BOOL CommitTrans();
//事务开始
BOOL BeginTrans();
BOOL adoBOF();//头
BOOL adoEOF();//尾
BOOL MoveNext();//下一个
BOOL CloseTable();//关闭表
BOOL CloseADOConnection();//关闭连接
BOOL GetCollect(LPCTSTR Name,CString &lpDest);//获取某个字段的值
//执行SQL语句 包含update delete insert
BOOL ExecuteSQL(LPCTSTR lpszSQL);
//初始化连接数据库
BOOL OnInitADOConn(LPCTSTR ConnStr);
// 执行select语句 获取记录集
_RecordsetPtr& GetRecordSet(LPCTSTR lpszSQL);
ADOConn();
virtual ~ADOConn();

};

#endif // !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)

class CADOException : public CException
{
public:
// Constructor
CADOException(char* pchMessage);

public:
~CADOException() {}
CString m_strMessage;
virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
   PUINT pnHelpContext = NULL);
private:
int m_nError;

};
这个是ADOConn.h的头文件,cpp上面已经给出了,我看了下这几个错误提示都是参数类型之间不兼容。类型在代码里都有了,还请麻烦告诉下该怎么改?是不是因为我用unicode不能直接拿来用?
worldy 2014-03-30
  • 打赏
  • 举报
回复
你这是让我猜啊,我哪知道你参数是怎么定义的 我估计你这几条命令出错应该是参数类型不正确,但第三条应该没有问题吧,如果3真有问题,弄个CString过度一下
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "ADOConn.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ADOConn::ADOConn()
{
memset(error,0,1024);

}

ADOConn::~ADOConn()
{

}

//////////////////////////////////////////////////////////////////////
// CADOException Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CADOException::CADOException(char* pchMessage)
{
m_strMessage = pchMessage;
m_nError = GetLastError();
}
BOOL CADOException::GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,PUINT pnHelpContext /*= NULL*/)
{

char text[200];
if(m_nError == 0)
{
   wsprintf(text, "%s error", (const char*) m_strMessage);
}
else
{
   wsprintf(text, "%s error #%d", (const char*) m_strMessage, m_nError);
}
strncpy(lpstrError, text, nMaxError - 1);
return TRUE;
}

BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{
::CoInitialize(NULL);

try
{
   // 创建Connection对象
   m_pConnection.CreateInstance("ADODB.Connection");
   // 设置连接字符串,必须是BSTR型或者_bstr_t类型
   _bstr_t strConnect = _bstr_t(ConnStr);//"Provider=SQLOLEDB; Server=127.0.0.1;Database=EventLogg; uid=event; pwd=event;";
   m_pConnection->Open(strConnect,"","",adModeUnknown);
   return TRUE;
}
// 捕捉异常
catch(_com_error e)
{
   // 显示错误信息
   TRACE(e.Description());
//   sprintf(error,"连接数据库失败 请检查连接字符串\r\n当前连接字符串为:%s",ConnStr);
//   throw new CADOException(error);
   throw new CADOException("连接数据库失败");
}

}

//执行SQL语句 包含update delete insert
BOOL ADOConn::ExecuteSQL(LPCTSTR lpszSQL)
{
// _variant_t RecordsAffected;
try
{
   // Connection对象的Execute方法:(_bstr_t CommandText,
   // VARIANT * RecordsAffected, long Options )
   // 其中CommandText是命令字串,通常是SQL命令。
   // 参数RecordsAffected是操作完成后所影响的行数,
   // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
   // adCmdProc-存储过程;adCmdUnknown-未知
   m_pConnection->Execute(_bstr_t(lpszSQL),NULL,adCmdText);
   return true;
}
catch(_com_error e)
{
   TRACE(e.Description());
//   sprintf(error,"\t执行SQL语句失败\r\n SQL语句为:%s",lpszSQL);
//   throw new CADOException(error);
   throw new CADOException("执行SQL语句失败");
}

}
//执行SELECT语句,获得结果集,结果集放在m_pRecordset中
_RecordsetPtr& ADOConn::GetRecordSet(LPCTSTR lpszSQL)
{
try
{
   // 创建记录集对象
   m_pRecordset.CreateInstance(__uuidof(Recordset));
   // 取得表中的记录
   m_pRecordset->Open(_bstr_t(lpszSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
   // 显示错误信息
   TRACE(e.Description());
//   sprintf(error,"\t执行SELECT语句失败\r\nSELECT语句为:%s",lpszSQL);
//   throw new CADOException(error);
   throw new CADOException("执行SELECT语句失败");
}
// 返回记录集
return m_pRecordset;
}

//获取某个字段的值
BOOL ADOConn::GetCollect(LPCTSTR Name,CString &lpDest)
{
VARIANT vt;
try
{
   vt = m_pRecordset->GetCollect(Name);
/* _bstr_t bstr = (_bstr_t)vt;
   if(lpDest != "")
   {
    strcpy(lpDest,bstr);
   }*/
   if(vt.vt!=VT_NULL)
    lpDest=(LPCSTR)_bstr_t(vt);
   else
    lpDest="";
  

}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,"获取字段:%s值失败",Name);
   throw new CADOException(error);
}
return TRUE;
}
//关闭数据库
BOOL ADOConn::CloseADOConnection()
{
try
{
   m_pConnection->Close();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("关闭数据库失败");
}
return TRUE;
}
//关表
BOOL ADOConn::CloseTable()
{
try
{
   m_pRecordset->Close();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("关闭表失败");
}
return TRUE;
}
//下一个
BOOL ADOConn::MoveNext()
{
try
{
   m_pRecordset->MoveNext();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("结果集移向下一个失败");
}
return TRUE;
}
//尾
BOOL ADOConn::adoEOF()
{
return m_pRecordset->adoEOF;
}
//头
BOOL ADOConn::adoBOF()
{
	return m_pRecordset->adoBOF;//->BOF
}
//事务开始
BOOL ADOConn::BeginTrans()
{
try
{
   m_pConnection->BeginTrans();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("事务开始失败");
}
return TRUE;
}
//递交事务
BOOL ADOConn::CommitTrans()
{
try
{
   m_pConnection->CommitTrans();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("递交事务失败");
}
return TRUE;
}
//事务回滚
BOOL ADOConn::RollbackTrans()
{
try
{
   m_pConnection->RollbackTrans();
}
catch (_com_error e)
{
   TRACE(e.Description());
   sprintf(error,e.Description());
   throw new CADOException("回滚事务失败");
}
return TRUE;
}
原代码
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
生成菜单,清理解决方案,重新生成试试
最后问下: ① wsprintf(text, "%s error", (const char*) m_strMessage); ②strncpy(lpstrError, text, nMaxError - 1); ③ TRACE(e.Description()); 这几条语句出错了,是不是Unicode中有问题?应该怎么改?
worldy 2014-03-30
  • 打赏
  • 举报
回复
生成菜单,清理解决方案,重新生成试试
asdfghjrsfv 2014-03-30
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
那就奇怪了,我一直都这样用,好好的

话说,你把那句放在什么地方?

那个问题解决了,但_RecordsetPtr显示未定义的标示符,怎么破?
加载更多回复(1)

4,011

社区成员

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

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