① VC与数据库连接(数据库该怎么建 )
数据库随便建啊,没要求的,程序里面的连接字符串设置好数据库地址,数据库名,登录用户名,登录密码就可以连了,和数据库里面具体字段没什么关系~
② 在VC++中如何从数据库中读取数据和向数据库中写入数据
#include "stdafx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
// 初始化—连接数据库
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=MSDAsql.1;Persist Security Info=False;User ID=***;Data Source=***;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
// 执行查询
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
// 连接数据库,如果Connection对象为空,则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
// 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
// 返回记录集
return m_pRecordset;
}
// 执行SQL语句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
// _variant_t RecordsAffected;
try
{
// 是否已经连接数据库
if(m_pConnection == NULL)
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
void ADOConn::ExitConnect()
{
// 关闭记录集和连接
if (m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
// 释放环境
::CoUninitialize();
}
③ 求教VC连接远程数据库方法
通常都是通过TCP/IP协议来连接远程数据库。
首先要保持网络畅通,可以使用ping命令来进行测试网络是否连通,没有问题可以进行下一步:在客户端通过配置工具或者应用程序代码来设置服务器的地址、端口号、数据库名称等信息,此时客户端采用的工具或者编程语言不同,则配置方法也不同,每一种主流数据库产品都有图形化的客户端配置工具,可以直接使用,在里面填写好服务器相关信息,测试连接即可,下图就是SQL Server的配置工具。
如果客户端采用高级语言编程,不同的语言连接方法也不同,通常主要有ODBC和JDBC连接方式,这两种方式比较通用,每个厂商的数据库都会提供对应的连接驱动程序和连接字符串信息。
主流数据库产品通常还提供了一些特殊的连接方式,采用特定的网络协议,这时连接的速度会更快一些,但配置会更复杂,而且方法不通用。
④ vc++与数据库连接的简单问题
可以用 ADO 连接数据库,下面是转自于VC知识库网站的文档。
ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。 ADO提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于ODBC数据源也提供了一般的OLE DB Privider,所以ADO不仅可以应用自身的OLE DB Privider,而且还可以应用所有的ODBC驱动程序。关于OLE DB和ADO的其它详细情况,读者可以自行查阅相关书籍或MSDN,这里就不一一说明了。让我们直接步入主题:如何掌握ADO这种数据库访问技术。ADO的操作方法和前面讲过的DAO的操作在很多方面存在相似之处,在这里,笔者为了更有效的说明它的使用方法,用VC6.0做了一个示例程序——AdoRWAccess,这个示例程序可以直接通过ADO来操作Access数据库,示例程序的运行效果如下图所示:
在示例程序中我们仍采用原库结构,数据库名Demo.mdb,库内表名DemoTable,表内字段名为Name(姓名)和Age(年龄)的两个字段,来构造示例程序操作所需的Access数据库,这也和上两篇文章的示例源码中的库结构相兼容。
下面让我们看看ADO数据库访问技术使用的基本步骤及方法:
首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();
接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:
1、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。
——打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。代码如下所示: _ConnectionPtr m_pConnection;
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
return FALSE;
}
——关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
2、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
——打开数据表。打开库内表名为DemoTable的数据表,代码如下: _RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable", // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。代码如下所示: _variant_t var;
CString strName,strAge;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
m_AccessList.AddString( strName + " --> "+strAge );
m_pRecordset->MoveNext();
}
// 默认列表指向第一项,同时移动记录指针并显示
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——插入记录。可以先用AddNew()方法新增一个空记录,再用PutCollect(字段名,值)输入每个字段的值,最后再Update()更新到库中数据既可。其中变量m_Name和m_Age分别为姓名及年龄编辑框的成员变量名。代码所下所示: try
{
// 写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
AfxMessageBox("插入成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——移动记录指针。移动记录指针可以通过MoveFirst()方法移动到第一条记录、MoveLast()方法移动到最后一条记录、MovePrevious()方法移动到当前记录的前一条记录、MoveNext()方法移动到当前记录的下一条记录。但我们有时经常需要随意移动记录指针到任意记录位置时,可以使用Move(记录号)方法来实现,注意: Move()方法是相对于当前记录来移动指针位置的,正值向后移动、负值向前移动,如:Move(3),当前记录是3时,它将从记录3开始往后再移动3条记录位置。代码如下所示: try
{
int curSel = m_AccessList.GetCurSel();
// 先将指针移向第一条记录,然后就可以相对第一条记录来随意移动记录指针
m_pRecordset->MoveFirst();
m_pRecordset->Move(long(curSel));
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——修改记录中字段值。可以将记录指针移动到要修改记录的位置处,直接用PutCollect(字段名,值)将新值写入并Update()更新数据库既可。可以用上面方法移动记录指针,修改字段值代码如下所示: try
{
// 假设对第二条记录进行修改
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从0开始
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——删除记录。删除记录和上面修改记录的操作类似,先将记录指针移动到要修改记录的位置,直接用Delete()方法删除它并用Update()来更新数据库既可。代码如下所示: try
{
// 假设删除第二条记录
m_pRecordset->MoveFirst();
m_pRecordset->Move(1); // 从0开始
m_pRecordset->Delete(adAffectCurrent); // 参数adAffectCurrent为删除当前记录
m_pRecordset->Update();
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——关闭记录集。直接用Close方法关闭记录集并赋于其空值。代码如下所示: m_pRecordset->Close();
m_pRecordset = NULL;
3、CommandPtr智能指针,可以使用_ConnectionPtr或_RecordsetPtr来执行任务,定义输出参数,执行存储过程或SQL语句。
——执行SQL语句。先创建一个_CommandPtr实例指针,再将库连接和SQL语句做为参数,执行Execute()方法既可。代码如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "SELECT * FROM DemoTable"; // SQL语句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回记录集
——执行存储过程。执行存储过程的操作和上面执行SQL语句类似,不同点仅是CommandText参数中不再是SQL语句,而是存储过程的名字,如Demo。另一个不同点就是在Execute()中参数由adCmdText(执行SQL语句),改为adCmdStoredProc来执行存储过程。如果存储过程中存在输入、输出参数的话,需要使用到另一个智能指针_ParameterPtr来逐次设置要输入、输出的参数信息,并将其赋于_CommandPtr中Parameters参数来传递信息,有兴趣的读者可以自行查找相关书籍或MSDN。执行存储过程的代码如下所示: _CommandPtr m_pCommand;
m_pCommand.CreateInstance(__uuidof(Command));
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "Demo";
m_pCommand->Execute(NULL,NULL, adCmdStoredProc);
⑤ 数据库和VC的连接
配置ODBC数据源:打开控制面板下的“数据源”,弹出“ODBC数据源管理器”,选择DSN选项卡-》添加->你选择你的SQLServer选项,单击完成。如图然后你再按照向导提示添加。
代码中用ODBC访问数据库你得加上afxdb.h头文件,
用CDataBase类连接数据库、CRecordSet类查询记录。
现在在VC访问数据库常用的是ADO访问,你可以找一下我前面的回答有ADO访问数据库的步骤。
CDataBasem_cODBCDb;
用CDataBase类的OpenEx()函数打开数据库连接。连接字符串你自己构造一下。
定义一个与上面数据库相关的查询对象
CRecordSetm_cODBCRec(&m_cODBCDb);
用这个查询对象的open方法就可以执行SQL语句与数据库交互了。
⑥ VC连接数据库到底怎么设置啊
// 要是有odbc、ado,首先必须对要初始化,在CMyApp的InitInstance函数中需要加入如下代码
BOOL CMyApp::InitInstance()
{
// Initialize OLE libraries
AfxEnableControlContainer();
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
m_pMainWnd = NULL;
... .....
}
_ConnectionPtr m_FaxDataLink;
/// 初始化数据库
IniDataLink()
{
CString SQL="Driver={SQL Server};Server=150.0.1.131;Uid Id=;Pwd=;Database=餐饮管理";
_bstr_t conn = SQL;
_bstr_t name;
_bstr_t code;
HRESULT hr = 0;
try
{
// 创建连接智能指针"ADODB.Connection"
hr = m_FaxDataLink.CreateInstance(__uuidof(Connection));
m_FaxDataLink -> Open(conn, "", "", -1);
// 设置连接超时
m_FaxDataLink->PutCommandTimeout(5);
}
catch (_com_error & error)
{
// 出错处理
return 0;
}
return 1;
}
这里还只是链接到了数据库,以后就可以利用这个链接,打开数据库表,还要知道包含哪些文件不要搞错,问题太多,要一个一个的提,不要在一个问题中提多个问题
⑦ VC 和数据库连接
“把数据库当作文件使用”
那你需要的是一款桌面型数据库,而不是SQL2000这类需要安装大堆文件和系统服务才能使用的数据库。
你可以使用Access,sqlite之类随带随走的数据库。根据易用性,你就用Access吧。
无论什么开发工具在Windows对Access的支持都很好,都有现成的控件可用,你填填连接字符串就行了。
下面这个是不依赖任何控件的访问方式,来自MSDN。使用的COM技术。
=====================================================================
// BeginMoveFirstCpp
#include <ole2.h>
#include <stdio.h>
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveFirstX();
void MoveAny(int intChoice, _RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
/////////////////////////////////
// Main Function //
/////////////////////////////////
void main()
{
if(FAILED(::CoInitialize(NULL)))
return;
MoveFirstX();
::CoUninitialize();
}
//////////////////////////////////////
// MoveFirstX Function //
//////////////////////////////////////
void MoveFirstX()
{
HRESULT hr = S_OK;
_RecordsetPtr pRstAuthors = NULL;
_bstr_t strCnn("Provider=sqloledb;Data Source=MyServer;"
"Initial Catalog=pubs;User Id=sa;Password=;");
_bstr_t strMessage("UPDATE Titles SET Type = "
"'psychology' WHERE Type = 'self_help'");
int intCommand = 0;
// Temporary string variable for type conversion for printing.
_bstr_t bstrFName;
_bstr_t bstrLName;
try
{
// Open recordset from Authors table.
TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
pRstAuthors->CursorType = adOpenStatic;
// Use client cursor to enable AbsolutePosition property.
pRstAuthors->CursorLocation = adUseClient;
pRstAuthors->Open("Authors", strCnn, adOpenStatic,
adLockBatchOptimistic, adCmdTable);
// Show current record information and get user's method choice.
while (true) // Continuous loop.
{
// Convert variant string to convertable string type.
bstrFName = pRstAuthors->Fields->Item["au_fName"]->Value;
bstrLName = pRstAuthors->Fields->Item["au_lName"]->Value;
printf("Name: %s %s\n Record %d of %d\n\n",
(LPCSTR) bstrFName,
(LPCSTR) bstrLName,
pRstAuthors->AbsolutePosition,
pRstAuthors->RecordCount);
printf("[1 - MoveFirst, 2 - MoveLast, \n");
printf(" 3 - MoveNext, 4 - MovePrevious, 5 - Quit]\n");
scanf("%d", &intCommand);
if ((intCommand < 1) || (intCommand > 4))
break; // Out of range entry exits program loop.
// Call method based on user's input.
MoveAny(intCommand, pRstAuthors);
}
pRstAuthors->Close();
}
catch (_com_error &e)
{
// Notify the user of errors if any.
// Pass a connection pointer accessed from the Recordset.
_variant_t vtConnect = pRstAuthors->GetActiveConnection();
// GetActiveConnection returns connect string if connection
// is not open, else returns Connection object.
switch(vtConnect.vt)
{
case VT_BSTR:
PrintComError(e);
break;
case VT_DISPATCH:
PrintProviderError(vtConnect);
break;
default:
printf("Errors occured.");
break;
}
}
}
/////////////////////////////////
// MoveAny Function //
/////////////////////////////////
void MoveAny(int intChoice, _RecordsetPtr pRstTemp)
{
// Use specified method, trapping for BOF and EOF
try
{
switch(intChoice)
{
case 1:
pRstTemp->MoveFirst();
break;
case 2:
pRstTemp->MoveLast();
break;
case 3:
pRstTemp->MoveNext();
if (pRstTemp->EndOfFile)
{
printf("\nAlready at end of recordset!\n");
pRstTemp->MoveLast();
} //End If
break;
case 4:
pRstTemp->MovePrevious();
if (pRstTemp->BOF)
{
printf("\nAlready at beginning of recordset!\n");
pRstTemp->MoveFirst();
}
break;
default:
;
}
}
catch(_com_error &e)
{
// Notify the user of errors if any.
// Pass a connection pointer accessed from the Recordset.
_variant_t vtConnect = pRstTemp->GetActiveConnection();
// GetActiveConnection returns connect string if connection
// is not open, else returns Connection object.
switch(vtConnect.vt)
{
case VT_BSTR:
PrintComError(e);
break;
case VT_DISPATCH:
PrintProviderError(vtConnect);
break;
default:
printf("Errors occured.");
break;
}
}
}
////////////////////////////////////////////
// PrintProviderError Function //
////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection's Error collection.
ErrorPtr pErr = NULL;
if( (pConnection->Errors->Count) > 0)
{
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount - 1.
for(long i = 0; i < nCount; i++)
{
pErr = pConnection->Errors->GetItem(i);
printf("\t Error number: %x\t%s", pErr->Number,
pErr->Description);
}
}
}
//////////////////////////////////////
// PrintComError Function //
//////////////////////////////////////
void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}
// EndMoveFirstCpp
⑧ 用VC怎么连接SQL数据库
我用的是数据源ODBC。先打开控制面板上的管理工具。然后打开数据源。添加描述数据什么。然后去到vc那里。新建单个文档。下一步选择W数据库查看使用文件支持,单击DatabaseSource按钮。选择之前你设好的数据源。就连好了数据库了。
⑨ 用vc++连接到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:下加入
private:
_ConnectionPtr
ADOConn;
--------------------------------------------------------------------------
在class
C***App
:
public
CWinApp
{
...
};之后#endif之前加入
extern
CxxxApp
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
CxxxApp::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
sqlQuery
;
sqlQuery
=
"select
*
from
user_table
where
user_name='"+strUser
+"'
and
user_pwd='"+
strPwd
+"'";
theApp.ADOExecute(theApp.m_pADOSet,
sqlQuery
);
int
iCount
=
theApp.m_pADOSet->GetRecordCount();
if
(
0==iCount
)
{
AfxMessageBox(_T("密码错误"),
MB_ICONEXCLAMATION);
return;
}
else
{
AfxMessageBox(_T("登录成功"),
MB_ICONEXCLAMATION);
不知道能否帮到你,参考下把