A. MFC客戶端程序如何獲得伺服器端資料庫里的數據
有遠程直接方法資料庫的方法。大中型資料庫基本都是網路資料庫,如常見的ORACLE / MSSQL / MYSQL等。
MFC編程,對這些資料庫可以直接通過ADO進行查詢和修改,常用的辦法,就是用IP地址和實例(一般為默認)作為連接字元串中的SERVER即可。
對於網路型資料庫(ACCESS、DBASE不在此列),你不需要做伺服器端程序,只需要通過資料庫支持的通訊協議和方法進行遠程操作即可。
B. MFC ODBC資料庫編程
給你個實例 只是一部分 應該有你要的全部東西了 至於變數與控制項關聯,用一下VC6.0的winzard就 會明白了 快捷鍵 ctrl+w
//////////////cpp部分
BOOL Subjectdlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CString sqlStr;
sqlStr="SELECT * FROM tb_subject";
mysubjectset = new Subjectinfo(&((CStudentsysApp*)AfxGetApp())->m_DB);
if(!mysubjectset->Open(AFX_DB_USE_DEFAULT_TYPE,sqlStr)) //打開數據表
{
AfxMessageBox("tb_subject表打開失敗!");
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
bool Subjectdlg::DisplayRecord()
{
if(mysubjectset->IsEOF()&&mysubjectset->IsBOF()) //判斷是否移動到了開頭和結尾
{
m_subjectname = "";
m_subjectid = "";
}
else
{
if(mysubjectset->IsBOF()) //移動到了開頭,就向後移動
{
mysubjectset->MoveNext();
}
else //否則前移
{
if(mysubjectset->IsEOF())
{
mysubjectset->MovePrev();
}
}
}
m_subjectname = mysubjectset->m_subject; //對應變數賦值
m_subjectid = mysubjectset->m_code;
UpdateData(FALSE);
return TRUE;
}
////////////那幾個指針
Subjectinfo* mysubjectset;
Subjectinfo* mysubjectset_find;
Subjectinfo* myclass_subject_findref;
///////////
subjectinfo是連接數據源的那個類
C. 求:MFC資料庫(sql-sever)編程實例要具體步驟從打開vc++6.0開始 郵箱:1666180916.qq.com
用ADO做吧 很簡單
D. MFC資料庫編程源代碼
10.Sql Server7.0/2000資料庫
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL); // 初始化OLE/COM庫環境 ,為訪問ADO介面做准備
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_ConnectionPtr m_pConnection("ADODB.Connection");
_bstr_t bstrSQL("select * from stu_info"); //查詢語句
char * query_cmd = "DELETE FROM stu_info WHERE sname = 』本拉登』";
try
{
// 創建Connection對象
m_pConnection.CreateInstance("ADODB.Connection");
// 設置連接字元串,必須是BSTR型或者_bstr_t類型
_bstr_t strConnect= "Provider=SQLOLEDB;Server=(local);Database=db2; uid=; pwd=;";
//若資料庫在網路上則Server為形如(192.168.1.5,3340)
//用戶sa和密碼123隻是針對我的庫
m_pConnection->Open(strConnect,"","",adModeUnknown);
if(m_pConnection==NULL)
cerr<<"Lind data ERROR!\n";
// 創建記錄集對象
m_pRecordset.CreateInstance(_uuidof(Recordset));
// 取得表中的記錄
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
_variant_t vsnum,vsname,vsage,vssex,vsmajor; //對應庫中的snum,sname,sage,ssex,smajor
cout << "學號 姓名 年齡 姓別 專業";
cout << "\n----------------------------------------------------------------\n";
while (!m_pRecordset->EndOfFile)
{
vsnum = m_pRecordset->GetCollect(_variant_t((long)0));//這兒給欄位編號和欄位名都可以
vsname = m_pRecordset->GetCollect("sname");
vsage = m_pRecordset->GetCollect("sage");
vssex = m_pRecordset->GetCollect("ssex");
vsmajor = m_pRecordset->GetCollect("smajor");
if (vsnum.vt != VT_NULL && vsname.vt != VT_NULL && vsage.vt != VT_NULL
&& vssex.vt != VT_NULL && vsmajor.vt != VT_NULL)
{
cout.setf(ios::left);
cout << setw(14) << (char*)(_bstr_t)vsnum;
cout << setw(14) << (char*)(_bstr_t)vsname;
cout << setw(8) << vsage.lVal;
cout << setw(8) << (char*)(_bstr_t)vssex;
cout <<setw(20) << (char*)(_bstr_t)vsmajor;
cout.unsetf(ios::left);
cout << endl;
}
m_pRecordset->MoveNext(); ///移到下一條記錄
}
cout << "\n----------------------------------------------------------------\n";
cout << "\n請輸入你要添加的學生信息\n";
cout << "學號:";
cin >> student.snum;
cout << "\n姓名:";
cin >> student.sname;
cout << "\n年齡:";
cin >> student.sage;
cout << "\n姓別:";
cin >> student.ssex;
cout << "\n專業:";
cin >> student.smajor;
m_pRecordset->MoveFirst(); //移動到第一條記錄
m_pRecordset->AddNew(); ///添加新記錄
m_pRecordset->PutCollect("snum",_variant_t(student.snum));
m_pRecordset->PutCollect("sname",_variant_t(student.sname));
m_pRecordset->PutCollect("sage",_variant_t(student.sage));
m_pRecordset->PutCollect("ssex",_variant_t(student.ssex));
m_pRecordset->PutCollect("smajor",_variant_t(student.smajor));
m_pRecordset->Update();
m_pConnection->Execute(query_cmd,NULL,1); //用Execute執行sql語句來刪除
m_pRecordset->Close(); // 關閉記錄集
}
// 捕捉異常
catch(_com_error e)
{
// 顯示錯誤信息
cerr << "\nERROR:" << (char*)e.Description();//拋出異常
}
if(m_pConnection->State)
m_pConnection->Close();
::CoUninitialize();
20.資料庫存入二進制欄位數據
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_RecordsetPtr pRs=NULL;
_StreamPtr pStream=NULL;
pRs.CreateInstance(_uuidof(Recordset));
pStream.CreateInstance(__unidof(Stream));
_bstr_t ConnectString(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%%1;Persist Security Info=False"); //C:\\mydb.mdb
pRs->Open(_bstr_t("Blob"),ConnectString,adOpenKeyset,adLockOptimistic,adCmdTable);
_variant vtSource;
vtSource.vt=VT_ERROR;
_bstr_t bstrUser(L"");
_bstr_t bstrPass(L"");
pStream->Type=adTypeBinary;
pStream->Open(vtSource,adModeUnknown,adOpenStreamUnspecified,bstrUser,bstrPass);
pStream->LoadFromFile(_bstr_t(%%3)); //"C:\\mypic.bmp"
pRs->AddNew();
pRs->Fields->GetItem(_variant_t(%%2))->put_Value(_variant_t(pStream->Read(adReadAll))); //"Image"
pRs->();
pStream->Close();
pRs->Close();
CoUninitialize();
21.資料庫取出二進制欄位數據
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_RecordsetPtr pRs=NULL;
_StreamPtr pStream=NULL;
pRs.CreateInstance(_uuidof(Recordset));
pStream.CreateInstance(__unidof(Stream));
_bstr_t ConnectString(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%%1;Persist Security Info=False");//C:\\mydb.mdb
pRs->Open(_bstr_t("Blob"),ConnectString,adOpenKeyset,adLockOptimistic,adCmdTable);
pStream->Write(_variant_t(pRs->Fields->GetItem(_variant_t(%%2))->GetValue())); //"Image"
pStream->SaveToFile(_bstr_t(%%3),adSaveCreateOverWrite); //"C:\\mypic.bmp"
pStream->Close();
pRs->Close();
CoUninitialize();
E. mfc編程實例
你用vc打開一個dsw文件就好了
F. MFC資料庫編程問題
試了一下,代碼沒有什麼問題,連接和訪問表都可以成功,不過沒有用LZ的資料庫表格式,自己亂寫了一個。
如果連接出問題,可以檢查一下資料庫文件是否在程序可以訪問的目錄,或者DataSource給個完整路徑試試。
----
發現一個小問題(不知道是不是貼出來的文字不對)
在連接字元串中間有個換行,最好寫在一行,如果一定要換行,在後面加上\
G. 如何進行MFC資料庫編程
MFC資料庫編程包含如下:
首先,你要選擇使用什麼方式連接資料庫,有ODBC,ADO等,
其他,就是sql語句操作資料庫了,對後是怎麼存儲操作數據。
H. mfc 資料庫編程 (odbc)
沒時間詳細說 給你個例子 有時間晚上交流
qq 469392501
void CMemoDBSDlg::OnBtnDelMember()
{
// TODO: Add your control notification handler code here
//獲取要刪除的成員記錄所在的行.
int nItem = m_listMember.GetNextItem(-1, LVNI_SELECTED);
if(nItem == -1){
AfxMessageBox("沒有選擇要刪除的成員");
return;
}
//獲取成員ID.
int id = atoi(m_listMember.GetItemText(nItem,0));
TRY{
CString sql;
//從資料庫中刪除記錄.
sql.Format("DELETE member_tab "
"where member_id = %d",id);
TRACE(sql);
m_db.ExecuteSQL(sql);
//從列表控制項中刪除該記錄.
m_listMember.DeleteItem(nItem);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
void CMemoDBSDlg::OnBtnAddType()
{
// TODO: Add your control notification handler code here
//添加備注類型.
//初始化備注類型對話框實例.
CMemoTypeDlg dlg;
if(dlg.DoModal() == IDOK){
//從對話框中獲取新添加的備注類型.
CString strName = dlg.m_strTypeName;
TRY{
CRecordset rs(&m_db);
//獲取最大的類型ID值.
rs.Open(CRecordset::dynaset,
"Select max(TYPE_ID) from MEMO_TYPE_TAB");
//初始化新類型ID值為1.
int newTypeID = 1;
//如果資料庫已經有類型記錄,則新的類型ID為最大類型ID+1
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
newTypeID = var.m_iVal + 1;
}
CString sql;
//向資料庫中添加新的備忘錄類型記錄.
sql.Format("Insert into MEMO_TYPE_TAB(TYPE_ID,"
"TYPE_NAME) "
"VALUES("
"%d,'%s')",newTypeID,strName);
TRACE(sql);
m_db.ExecuteSQL(sql);
//向界面中添加記錄行.
InsertMemoTypeItem(newTypeID,strName);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
}
void CMemoDBSDlg::OnBtnModType()
{
// TODO: Add your control notification handler code here
//獲取要修改的類型記錄
int nItem = m_listType.GetNextItem(-1, LVNI_SELECTED);
//如果沒有選擇要修改的紀錄,返回.
if(nItem == -1){
AfxMessageBox("沒有選擇要修改的類型");
return;
}
//獲取要修改記錄的ID和名稱.
int id = atoi(m_listType.GetItemText(nItem,0));
CString name = m_listType.GetItemText(nItem,1);
//初始化備注類型對話框.
CMemoTypeDlg dlg;
//給對話框的變數賦值.
dlg.m_strTypeName = name;
if(dlg.DoModal() == IDOK){
//獲取修改後的數據.
CString strName = dlg.m_strTypeName;
TRY{
CString sql;
//更新記錄.
sql.Format("UPDATE MEMO_TYPE_TAB SET TYPE_NAME = '%s' "
" WHERE TYPE_ID = %d",strName,id);
TRACE(sql);
m_db.ExecuteSQL(sql);
//修改界面的值.
m_listType.SetItemText(nItem,1,strName);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
}
void CMemoDBSDlg::OnBtnDelType()
{
// TODO: Add your control notification handler code here
//獲取要刪除的記錄所在的行.
int nItem = m_listType.GetNextItem(-1, LVNI_SELECTED);
//如果沒有選擇,返回.
if(nItem == -1){
AfxMessageBox("沒有選擇要刪除的類型");
return;
}
//獲取要刪除的類型ID
int id = atoi(m_listType.GetItemText(nItem,0));
TRY{
CString sql;
sql.Format("DELETE MEMO_TYPE_TAB "
"where TYPE_ID = %d",id);
TRACE(sql);
//刪除類型記錄
m_db.ExecuteSQL(sql);
//刪除界面中的記錄.
m_listType.DeleteItem(nItem);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
void CMemoDBSDlg::OnBtnAddMemo()
{
// TODO: Add your control notification handler code here
//初始化備忘錄信息對話框.
CMemoInfoDlg dlg;
//獲取所有的家庭成員的名稱.
for(int i = 0 ; i < m_listMember.GetItemCount() ; i++ )
dlg.m_strMemberArray.Add(m_listMember.GetItemText(i,1)) ;
//獲取所有的類型信息.
for(i = 0 ; i < m_listType.GetItemCount() ; i++ )
dlg.m_strTypeArray.Add(m_listType.GetItemText(i,1)) ;
//打開對話框,添加新的記錄.
if(dlg.DoModal() == IDOK){
//從對話框中獲取記錄值.
CString strName = dlg.m_strMember;
CString strType = dlg.m_strMemoType;
CString strHappenDate = dlg.m_oleDate.Format("%Y-%m-%d")
+ " " + dlg.m_oleTime.Format("%H:%M:%S");
CString strOperDate = COleDateTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
int isEvent = dlg.m_isEvent;
CString strCost = dlg.m_strCost;
CString strMemo = dlg.m_strMemoInfo;
TRY{
CRecordset rs(&m_db);
CString sql;
//根據成員姓名獲取成員ID值.
sql.Format("Select MEMBER_ID from MEMBER_TAB where "
"MEMBER_NAME = '%s'",strName);
rs.Open(CRecordset::dynaset,sql);
int memberID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
memberID = var.m_iVal;
}
rs.Close();
//根據備忘錄類型獲取備忘錄類型ID.
sql.Format("Select TYPE_ID from MEMO_TYPE_TAB where "
"TYPE_NAME = '%s'",strType);
rs.Open(CRecordset::dynaset,sql);
int typeID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
typeID = var.m_iVal;
}
rs.Close();
//從SEQ_MEMO_ID序列中獲取下一個值.這個值就是新的備忘錄ID.
rs.Open(CRecordset::dynaset,
"Select max(MEMO_ID) from MEMO_INFO_TAB");
int memoID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
memoID = var.m_iVal+1;
}
sql.Format("Insert into MEMO_INFO_TAB(MEMO_ID,"
"MEMBER_ID,OPER_DATE,HAPPEN_DATE,"
"IS_BIGEVENT,EVENT_COST,TYPE_ID,MEMO_TEXT) "
"VALUES("
"%d,%d,'%s'"
",'%s',%d,'%s'"
",%d,'%s')",memoID,memberID,
strOperDate,strHappenDate,isEvent,strCost,typeID,strMemo);
TRACE(sql);
m_db.ExecuteSQL(sql);
//向界面中插入新的紀錄.
InsertMemoInfoItem(memoID,strName,strOperDate,strHappenDate,isEvent,strCost,strType,strMemo) ;
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
}
I. 用MFC進行ODBC的編程過程是怎樣的
使用vs2008以上版本的開發環境會比較簡單,因為vs2008提供了資料庫管理界面,新建工程時選擇「支持文件的資料庫視圖」,並選擇odbc,然後選擇你對應的數據源後,生成工程。
在工程中選擇「項目-添加類-MFC ODBC使用者」,然後根據提示將該類與自己需要的資料庫中的表進行綁定即可,完成後,對該類實例的操作就意味著對應資料庫中對應表中的一條記錄。
J. C++ MFC資料庫 編程問題
#include "windows.h"就行了。
SYSTEMTIME sTime;
::GetSystemTime(&sTime);
if(10 == sTime.wMonth && 2013 == sTime.wYear)
{
}