當前位置:首頁 » 數據倉庫 » vc讀取資料庫連接
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

vc讀取資料庫連接

發布時間: 2022-04-23 12:51:09

① 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);
不知道能否幫到你,參考下把