VC如何访问数据库,

ggggcccc 2004-09-09 12:29:30
我要写一个DLL文件,DLL的功能如下:
1.用来判断用户登录时密码是否正确,假如用户信息表为t_user(FUserID,FPassWord)
2.登录正确后,写登录日志,假如表的信息为t_log(FUserID,FDate,IP),同时想获取客户端的IP,
3.本人用过VB,C/C++,asp.net等,没有用过VC举例时,能否说得详细细
4.用VC建立标准DLL的方法本人会。
...全文
299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kudeet 2004-09-09
  • 打赏
  • 举报
回复
建议用ADO操作数据库,有很多讲基本操作的文章
http://www.vckbase.com/document/listdoc.asp?mclsid=11&sclsid=1105
需要注意的是在DLL中import ado15.dll的时候如果直接用
在stdafx中加入
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","adoEOF")
可能会有编译通不过,说是有EditModeEnum、RecordStatusEnum、ParameterDirectionEnum、LockTypeEnum、DataTypeEnum、FieldAttributeEnum重定义!

改成
#pragma warning(disable:4146)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#pragma warning(default:4146)
using namespace ADODB; 后错误都没有了
Mr-Chen 2004-09-09
  • 打赏
  • 举报
回复
通过ODBC、ADO、DAO等方式

建议使用ADO

在Visual C++中用ADO进行数据库编程
作者:蒋东宇



  ActiveX数据对象(ADO)是OLE DB上面的高层数据库API。我们在C++程序中也可以调用ADO。本文将在VC 6.0环境下做一个小小的例子解释如何使用ADO。

  1. 生成应用程序框架并初始化OLE/COM库环境

  创建一个标准的MFC AppWizard(exe)应用程序,然后在应用程序类的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COM DLL库)。

  BOOL CADOTestApp::InitInstance()

  { //初始化OLE/COM库环境

AfxOleInit();}

  2. 引入ADO库文件

  使用ADO前必须在工程的stdafx.h文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:

   #include 〈comdef.h〉

   #import "c:\program files\common files\system\ado\msado15.dll"

   no_namespace

   rename ("EOF","adoEOF")

  头文件comdef.h使我们的应用程序能够使用Visual C++中的一些特殊COM支持类,这些类使得处理OLE自治更为容易一些,OLE自治是ADO使用的数据类型。后三行使用#import指令在我们的应用程序中输入ADO类库定义。

  ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。

  程序的第三行指示ADO对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。

  3.利用智能指针进行数据库操作

  在CaboutDlg头文件中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

  ClistCtrl m_List;

  ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。

_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。

_CommandPtr返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。

_RecordsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。

  在OnInitDialog()中加入以下代码:

  BOOL CAboutDlg::OnInitDialog()

  {

CDialog::OnInitDialog();

_variant_t TheValue;

m_List.ResetContent();

  m_pConnection.CreateInstance(_uuidof(Connection));

  m_pRecordset.CreateInstance(_uuidof(Recordset));

  try{

m_pConnection->Open("DSN=ADOTest","","",0); //连接叫作ADOTest的ODBC数据源

m_pRecordset->Open("SELECT * FROM BlockDefine",(IDispatch*)m_pConnection,
adOpenDynamic,
adLockOptimistic,
adCmdText);

  //执行SQL语句得到一个记录集

   while(!m_pRecordset->adoEOF)

  //遍历所有记录

   {

   TheValue = m_pRecordset->GetCollect("BlockIndex");

  //得到字段BlockIndex的值

   if(TheValue.vt!=VT_NULL)

   m_List.AddString((char*)_bstr_t(TheValue)); //将该值加入到列表控件中

   m_pRecordset->MoveNext();

  }

   m_pRecordset->Close();

m_pConnection->Close();

   }

   catch(_com_error e) //异常处理

   {

AfxMessageBox(e->ErrorMessage());

  }

  m_pRecordset = NULL;

m_pConnection = NULL;

  return TRUE; // return TRUE unless you set the focus to a control

  }

  程序中通过_variant_t和_bstr_t转换COM对象和C++类型的数据, _variant_t类封装了OLE自治VARIANT数据类型。在C++中使用_variant_t类要比直接使用VARIANT数据类型容易得多。

  好,编译后该程序就能运行了,但记住运行前要创建一个叫ADOTest的ODBC数据源。该程序将把表BlockDefine中的BlockIndex字段值显示在列表控件中。

snaill 2004-09-09
  • 打赏
  • 举报
回复
如果用MFC有以CDao开头的一系列的类,相当方便
只爱浓茶 2004-09-09
  • 打赏
  • 举报
回复
#import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" no_namespace rename( "EOF", "adoEOF" )

BOOL m_bConnected;
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_bstr_t m_strConn;
_bstr_t m_szDbUser;
_bstr_t m_szDbPassword;

void CUBoardDlg::InitDB()
{
m_bConnected = false;
m_pConnection = NULL;
m_pRecordset = NULL;

::CoInitialize(NULL);
}

void CUBoardDlg::EndDB()
{

if (m_pRecordset != NULL)
{
m_pRecordset->Close();
m_pRecordset.Release();
}
if (NULL != m_pConnection)
{
m_pConnection->Close();
m_pConnection.Release();
}
::CoUninitialize();
}
BOOL CUBoardDlg::ExecSQL(LPCTSTR lpszSql)
{
if (!ConnectDB())
{
return FALSE;
}

_CommandPtr pCmd = NULL;

try
{
HRESULT hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->putref_ActiveConnection(m_pConnection);
m_pRecordset->put_CacheSize(5000);
m_pRecordset->PutLockType(adLockReadOnly);
m_pRecordset->PutCursorType(adOpenStatic);

pCmd.CreateInstance(__uuidof(Command));
pCmd->putref_ActiveConnection(m_pConnection);
pCmd->put_CommandType(adCmdText);
pCmd->put_CommandText(_bstr_t(lpszSql));

m_pRecordset=pCmd->Execute(NULL, NULL, NULL);
pCmd.Release();

}
catch(_com_error &ce)
{
if(m_pRecordset!=NULL)
{
m_pRecordset.Release();
m_pRecordset = NULL;
}
CString emsg;
emsg.Format("%s",ce.ErrorMessage());
AfxMessageBox(emsg,MB_OK,IDABORT);
return FALSE;
}
return TRUE;

}

BOOL CUBoardDlg::ExecSelect(LPCTSTR lpszSql)
{
if (!ConnectDB())
{
return FALSE;
}
_CommandPtr pCmd = NULL;

try
{
HRESULT hr = m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset->putref_ActiveConnection(m_pConnection);
m_pRecordset->put_CacheSize(5000);
m_pRecordset->PutLockType(adLockReadOnly);
m_pRecordset->PutCursorType(adOpenStatic);
m_pRecordset->CursorLocation = adUseClient;
pCmd.CreateInstance(__uuidof(Command));
pCmd->putref_ActiveConnection(m_pConnection);
pCmd->put_CommandType(adCmdText);
pCmd->put_CommandText(_bstr_t(lpszSql));

m_pRecordset->Open((IDispatch *) pCmd,vtMissing,adOpenForwardOnly,adLockReadOnly,adCmdText);
pCmd.Release();

}catch (_com_error &ce)
{

if(m_pRecordset!=NULL)
{
m_pRecordset.Release();
m_pRecordset = NULL;
}
CString emsg;
emsg.Format("%s",ce.ErrorMessage());
AfxMessageBox(emsg,MB_OK,IDABORT);
return FALSE;

}
return TRUE;
}

BOOL CUBoardDlg::ConnectDB()
{
HRESULT hr;

if (m_pConnection)
return TRUE;

if(NULL != m_pConnection)
{
if (m_pConnection->State == adStateOpen)
m_pConnection->Close();

m_pConnection.Release();
m_pConnection = NULL;
}

try
{
hr = m_pConnection.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
{
::CoInitialize(NULL);
m_bConnected = false;
goto Label;
}

m_pConnection->put_CommandTimeout( 5 );
hr = m_pConnection->Open(m_strConn,
_bstr_t(m_szDbUser),
_bstr_t(m_szDbPassword),
0);

if (FAILED(hr))
m_bConnected = false;
else
m_bConnected = true;
}
catch(_com_error &error) //数据库打开异常
{
char message[400];
sprintf(message,"连接数据库出错:%s",error.ErrorMessage());

if(m_pConnection != NULL)
{
if (m_pConnection->State == adStateOpen)
m_pConnection->Close();
m_pConnection.Release();
m_pConnection = NULL;
}
AfxMessageBox(message,MB_OK,IDABORT);
m_bConnected = false;
}

Label:
return m_bConnected;

}

BOOL CUBoardDlg::SetConn()
{
CString strConn;
strConn.Format("Provider=SQLOLEDB;SERVER=serverIP;DATABASE=dbname;UID=sa;PWD=passwd;");
m_strConn = (_bstr_t) strConn;
return TRUE;
}

使用上面函数访问数据库
CString strOut;
strSQL.Format("select * from tb_yourTable);
if (!ExecSelect(strSQL))
{
strError="执行SQL语句失败.";
AfxMessageBox(strError,MB_OK,IDABORT);
return;
}
while (!m_pRecordset->adoEOF)
{
strOut=(char*)(_bstr_t)m_pRecordset->Fields->GetItem("字段名")->Value;
m_pRecordset->MoveNext();
}
EndDB();
101monster 2004-09-09
  • 打赏
  • 举报
回复
呵呵,UP!
Jimmy_Xia 2004-09-09
  • 打赏
  • 举报
回复
Ado好,还能远程连接。
smallcrocodile 2004-09-09
  • 打赏
  • 举报
回复
谢谢楼上
内存泄漏 2004-09-09
  • 打赏
  • 举报
回复
用ADO。。。不用配置数据源。比较简单。
相关文章:
http://www.vckbase.com/document/viewdoc/?id=1215
cgipro 2004-09-09
  • 打赏
  • 举报
回复
打开一个连接
pConnection->Open(ConnectionString,"","",adModeUnknown);///连接数据库

上面的连接字符串ConnectionString根据不同的数据源,分别对应不同的写法
1)访问Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord"

2)访问ODBC数据
" Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

3)访问Oracle数据库
“Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;"

3)访问MS SQL数据库
"Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"
luoyu971 2004-09-09
  • 打赏
  • 举报
回复
用ODBC就可以!因为他简单,实用!
cgipro 2004-09-09
  • 打赏
  • 举报
回复
ADO连接Oracle数据库
#import "c:\program files\common files\system\ado\msadox.dll" \
no_namespace \
rename ("EOF", "adodbEOF")


CoInitialize(NULL);
m_pConnection.CreateInstance(__uuidof(Connection),NULL);
try
{
m_pConnection->Open("Provider=MSDAORA;Data Source=CTOFA;","ATEST","ATEST",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
}

m_pRecordset.CreateInstance(__uuidof(Recordset));
_bstr_t sqlStr="select * from wo where 1=2";
m_pRecordset->Open(sqlStr,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);

}
sevenking 2004-09-09
  • 打赏
  • 举报
回复
odbc api和ado都是可以的
valkyrie7 2004-09-09
  • 打赏
  • 举报
回复
菜鸟初到此地~~

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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