mfc操作sql
㈠ mfc中如何連接access資料庫 求詳細步驟
比如在你的工程目錄中建一個 dbfvir.mdb //Access資料庫,然後你需要做以下操作:
1.在StadAfx.h裡面添加#include <afxdb.h> //新加入頭文件,用於CDatabase類。
2.在StadAfx.h最後的#endif上添加#import "msado15.dll" no_namespace rename("EOF","rsEOF")
這時,你要把msado15.dll拷到與dbf同級的目錄,也就是工程目錄里,當然你可以該路徑
3.在你自己的工程里,比如MyProc是你建的工程,添加代碼
CMyPorcApp::CMyProcApp(){
CoInitialize(NULL);
sqlConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",
"DSN=MyImage;DBQ=dbf\vir.mdb;DEFAULTDIR=dbf"); //注冊本地資料庫數據源
m_db.OpenEx("DSN=MyImage;;",CDatabase::noOdbcDialog);//MyImage是數據源名稱
}
4.在前面的函數體之前創建全局變數CDatabase m_db; CRecordset m_rec(&m_db);
5.使用資料庫{
CString strSQL="select * from virdb";
BSTR bstrSQL=strSQL.AllocSysString();
m_rec.Open(CRecordset::dynaset,strSQL);
while(!m_rec.IsEOF())
{
// 使用資料庫的代碼,讀出來的數據都是字元串型的
CString MyVirable;
m_rec.GetFieldValue("欄位名",MyVirable); //將某個欄位的當前行的值讀到MyVirabl中
// ......
m_rec.MoveNext(); //將記錄移到下一行
}
}
本程序是自動注冊數據源的,當然可以手動注冊數據源,關於如何注冊數據源並不麻煩,敘述起來不太方面,你就參考其他的吧。不過建議不用手動注冊數據源,這樣你地程序移植性不好.
㈡ SQL語言和C++有什麼區別
你好。根據你的年齡,可能是初學者,通俗易懂點給你講講吧。
首先,說說資料庫。我們玩的英雄聯盟,每次登錄都會顯示你買過的皮膚,你有的英雄。這些信息就存在資料庫中,其實也沒有什麼,和你電腦裡面的文件一種性質,不過不是存在你電腦的裡面,而是存在專門存儲這些信息的伺服器裡面,伺服器也沒啥,其實就是一台電腦,只不過專門用來存儲數據。(嗯,還是不明白伺服器,去網路查查)
sql語言呢,就是用來從這么多數據中找出自己想要的數據。舉個例子,當你想看看你有多少英雄時,就通過sql語言去資料庫中去進行查找,並且把結果返到界面,你就可以看到了。
這兩種語言之間的區別呢。都是高級語言,但是c++屬於第三代語言,sql屬於第四代語言。c++語言功能比較廣,前端用戶界面可以進行編寫,中間邏輯層代碼也可以編寫,資料庫查詢也可以編寫。但是突出點是編寫邏輯層,應該就是你現在學的c++內容。類,函數這些內容。但是用c++編寫查詢資料庫的語句太麻煩,於是就有了專門用來查詢資料庫的語言sql。還有專門用來寫前端的第四代語言像h5等。sql語言專注於資料庫部分,而且用起來比較簡單。而c++,什麼都能做做,但是對像查詢資料庫這些部分太復雜。
我也是從你這個階段過來的,當初我連什麼是資料庫都不知道,而且我當時都19歲了。一點點來,一定要多思考這些不會的地方,多去了解關於這部分的知識,早晚會懂的,重在堅持!
㈢ 怎麼使用mfc的cdatabase類直接執行sql命令
在使用MFC的CDatabase類執行SQL命令時,首先需要創建一個CDatabase對象,然後打開資料庫連接。在該示例中,我們使用了OpenEx方法並指定了資料庫連接字元串。接下來,創建一個CRecordset對象,並將其資料庫指針設置為剛才創建的CDatabase對象。接著可以直接執行SQL查詢語句,但需注意SQL語句字元串不能以空格開頭。例如,可以執行如下SQL查詢:SELECT 欄位或計算列 FROM 表 WHERE 條件。在執行查詢後,使用CRecordset對象的Open方法以快照模式打開結果集。通過循環遍歷結果集,可以使用GetFieldValue方法獲取每一行數據,該方法將數據保存在一個CDBVariant變數中。值得注意的是,不能直接使用數字0作為列索引,應該從1開始計數。
此外,還可以使用其他方式獲取查詢結果,例如通過直接操作CRecordset對象的欄位。在循環遍歷過程中,可以調用MoveFirst方法定位到結果集的第一行,然後使用GetFieldValue方法按列索引獲取具體欄位值。完成數據獲取後,記得關閉CRecordset和CDatabase對象以釋放資源。
以上示例僅展示了如何使用CDatabase和CRecordset類執行簡單的SQL查詢。實際上,MFC還提供了豐富的API用於處理更復雜的數據操作。例如,可以使用CRecordset的AddNew和Update方法插入和更新數據,使用Delete方法刪除記錄。在執行這些操作時,同樣需要注意正確管理資料庫連接和資源。
總結來說,使用MFC的CDatabase類執行SQL命令是一個相對直接的過程,只需按照正確的步驟操作即可。關鍵在於正確設置資料庫連接,編寫正確的SQL語句,以及合理使用CRecordset類的方法來處理查詢結果。通過這些步驟,可以有效地在MFC應用程序中實現資料庫操作。
㈣ MFC怎麼讀寫EXCEL文件
可以用多種方法,比如說用ODBC對excel資料庫進行操作,或者說用excel 的COM介面進行編程。我找到一個例子關鍵代碼如下:
//創建並寫入Excel文件
void CRWExcel::WriteToExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安裝驅動
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件
CString sSql;
TRY
{
// 創建進行存取的字元串
sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
sDriver, sExcelFile, sExcelFile);
// 創建資料庫 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 創建表結構(姓名、年齡)
sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
database.ExecuteSQL(sSql);
// 插入數值
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐景周'',26)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''徐志慧'',22)";
database.ExecuteSQL(sSql);
sSql = "INSERT INTO demo (Name,Age) VALUES (''郭徽'',27)";
database.ExecuteSQL(sSql);
}
// 關閉資料庫
database.Close();
}
CATCH_ALL(e)
{
TRACE1("Excel驅動沒有安裝: %s",sDriver);
}
END_CATCH_ALL;
}
// 讀取Excel文件
void CRWExcel::ReadFromExcel()
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "Demo.xls"; // 將被讀取的Excel文件名
// 檢索是否安裝有Excel驅動 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 沒有發現Excel驅動
AfxMessageBox("沒有安裝Excel驅動!");
return;
}
// 創建進行存取的字元串
sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);
TRY
{
// 打開資料庫(既Excel文件)
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
// 設置讀取的查詢語句.
sSql = "SELECT Name, Age "
"FROM demo "
"ORDER BY Name ";
// 執行查詢語句
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
// 獲取查詢結果
while (!recset.IsEOF())
{
//讀取Excel內部數值
recset.GetFieldValue("Name ", sItem1);
recset.GetFieldValue("Age", sItem2);
// 移到下一行
recset.MoveNext();
}
// 關閉資料庫
database.Close();
}
CATCH(CDBException, e)
{
// 資料庫操作產生異常時...
AfxMessageBox("資料庫錯誤: " + e->m_strError);
}
END_CATCH;