日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

VS2012+SQL2008+ODBC編程,第一篇博客,寫的不

系統(tǒng) 1789 0

? 近期寫一個數(shù)據(jù)庫的課程設(shè)計,用的是C++ MFC 。最開始用的是ADO技術(shù),可是苦于網(wǎng)上大部分的教程都是VC6.0的,對著教程敲了4,5遍還是執(zhí)行不成功。我用的IDE是VS2012,畢竟VC6.0和VS2012之間的差距太大了,所以就改成了ODBC編程,實際上ODBC對于數(shù)據(jù)庫類的操作封裝的非常好,能夠非常方便的使用相關(guān)的函數(shù)并且不須要自己去寫一些異常處理機制,對于新手來說是非常方便的,網(wǎng)上也有非常多的ODBC教程,我照著網(wǎng)上的VS2010的ODBC教程然后加上自己的理解寫了一個學(xué)生成績管理系統(tǒng),非常easy,可是也基本上能把ODBC的思想和簡單的使用方法說清楚了,聲明:此文章僅適合剛剛接觸數(shù)據(jù)庫的新手以及相關(guān)專業(yè)的大學(xué)生,大神就能夠直接忽略了,如有大神看了文章后對代碼或者思想提出寶貴的改進意見,在下不勝感激!

?OK,廢話不多說。首先打開VS2012->建立一個MFC應(yīng)用程序(基于DIALOG),然后就是自己拉EDIT和BUTTON了,這個非常easy,基本學(xué)過一點MFC的都曉得怎么去弄,大小間距什么的就不具體介紹了,VS2012->格式,里面有對齊和使大小同樣,自己去弄就能夠了,基本上 4個static,4個EDIT,四個BUTTON,一個List Control ,注意的是 List Control的格式設(shè)置為report VS2012+SQL2008+ODBC編程,第一篇博客,寫的不好忘各位大神指點一二~

這個就是我的基本界面, cno是課程號,cname是課程名,xf是學(xué)分 ,由于數(shù)據(jù)庫中就是這么寫的,所以static里面的就不變了,這個能夠自己隨便寫,沒有影響的。

? 以下就是基本的了,首先要做的就是加入成員變量,在主對話框右鍵單擊->類向?qū)?>成員變量,然后就是自己加入成員,這里要注意的是類型,這個類型為什么要這么寫,下文我會一一說明 VS2012+SQL2008+ODBC編程,第一篇博客,寫的不好忘各位大神指點一二~

? 這些基礎(chǔ)工作都做好之后,接下來就是加入ODBC使用者了,這里的ODBC使用者的加入也非常easy,類向?qū)?>加入類->MFC ODBC使用者 VS2012+SQL2008+ODBC編程,第一篇博客,寫的不好忘各位大神指點一二~
然后PV數(shù)據(jù)源,點擊機器數(shù)據(jù)源 VS2012+SQL2008+ODBC編程,第一篇博客,寫的不好忘各位大神指點一二~
要注意的是這里的數(shù)據(jù)源是須要自己去配置的,具體的配置方法這里就不具體介紹了,百度上隨便搜一下都有好多,也非常easy,基本上3分鐘就能配置好,我這里用的數(shù)據(jù)源已經(jīng)是配置好的了,叫 Test,配置好數(shù)據(jù)源之后就會生成一個類,這個類的名字就是SQL 2008里面列的名字,比方我這里就是CKC,由于我的數(shù)據(jù)庫中的列就是KC。 以下我們來看下這個類里面有什么內(nèi)容。以下是.h文件的一些內(nèi)容。
? ? ? ? CString m_cno;
CString m_cname;
long m_xf;


// 重寫
// 向?qū)傻奶摵瘮?shù)重寫
public:
virtual CString GetDefaultConnect(); // 默認(rèn)連接字符串


virtual CString GetDefaultSQL(); // 記錄集的默認(rèn) SQL
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX 支持


// 實現(xiàn)
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
這是基本的代碼,當(dāng)中最重要的的m_cno,m_cname,m_xf當(dāng)中m_cno,m_cname是CStringA類型的,僅僅只是我把它改成了CString,CStringA是和UNICODE有關(guān)的,這里我們臨時不須要考慮編碼的問題,所以直接改成CString。
? 這就是為什么剛剛加入的成員變量的類型是CString,CString,long,要和這個類里面的類型一樣。
再來看看.cpp文件的一些內(nèi)容,比較重要的是
m_cno = "";
m_cname = "";
m_xf = 0;
m_nFields = 3;
m_nDefaultType = dynaset;
這個是類生成初始化的結(jié)果,GetDefaultConnect()這個函數(shù)返回的是連接字符串,里面包含DSN,UID,PSW等等,自己能夠去看看,由于包含了帳號和password,這里我就不貼出來了,其它的都沒什么。OK,如今我們正式開始實現(xiàn)對數(shù)據(jù)庫的操作,在MFC界面上雙擊查詢BUTTON,這時候我們就會進代碼界面了。
? 開始,我們要做的是對List Control進行初始化,廢話不多說,上代碼。
? 首先,須要自己寫一個初始化函數(shù),這個函數(shù)是BOOL CXSKC::OnInitDialog(),實際上這個函數(shù)應(yīng)該是在生成dlg時候就有的,可是不曉得為什么我生成的時候沒有,非常愚蒙,可能是之前的步驟弄錯了,可是這不影響,假設(shè)有的就直接在函數(shù)里面寫,假設(shè)沒有就自己加一個函數(shù)進去,非常easy吧。
函數(shù)里面的內(nèi)容是
UpdateData(FALSE);
MyCjList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_TWOCLICKACTIVATE);
MyCjList.InsertColumn(0,L"xf",LVCFMT_CENTER,80,0);
MyCjList.InsertColumn(0,L"cname",LVCFMT_CENTER,160,0);
MyCjList.InsertColumn(0,L"cno",LVCFMT_CENTER,80,0);
return TRUE;
這個是對List Control的一些初始化,詳細(xì)含義非常easy,隨便查一查都知道,沒什么好說的。
? 然后找到DoDataExchange()函數(shù),在函數(shù)里面加上這些代碼CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, MyCjList);
DDX_Text(pDX, IDC_EDIT1, MyCno);
DDX_Text(pDX, IDC_EDIT2, MyCname);
DDX_Text(pDX, IDC_EDIT3, MyXf);
GetDlgItem(IDC_EDIT3)->SetWindowTextW(L"");
這個也沒什么好說的,都非常easy。如今,List Control就初始化好了,接下來就是重中之重了,查詢的實現(xiàn)。SQL 中的查詢語句是select * from KC where cno =。。。,由于cno是主鍵,為了簡潔,我們就僅僅用主鍵查詢就能夠了。
void CXSKC::OnBnClickedButton1()//這個就是查詢button的代碼
{
// TODO: 在此加入控件通知處理程序代碼
CKC MyKC;//XS類操作對象
MyKC.Open();
MyKC.MoveFirst();
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);

CString sql;
sql.Format(L"select * from KC where cno = '%s'",str1);
MessageBox(sql);

ListAll(sql);
}
我解釋一下,要操作數(shù)據(jù)庫,首先要做的就是打開數(shù)據(jù)庫, CKC定義一個對象,調(diào)用open()函數(shù) ,打開數(shù)據(jù)庫之后把EDIT里面的內(nèi)容給str, 三個EDIT相應(yīng)三個str,注意順序不要錯了 ,不然就悲劇了。然后,須要調(diào)用一個movefirst()函數(shù),移動到第一個記錄,這樣就能夠從頭到尾順序的掃描表了(大概的過程就這樣),畢竟不是專業(yè)的數(shù)據(jù)庫project師,對于數(shù)據(jù)庫的深入理解還不夠。。。然后就是sql語句了,CString 創(chuàng)建一個對象,用來存放sql語句 ,F(xiàn)ormat()函數(shù) 真是一個好東西,我太喜歡這個函數(shù)了,它能夠把后面str的內(nèi)容插入‘%’,簡直就是神器啊!s說明的是一個字符串,還有u,等等,有興趣的能夠自己去了解一下。MessageBox()是我用來測試SQL語句對不正確的,ListAll()函數(shù)是須要自己寫的,以下是ListAll()函數(shù)的代碼。
void CXSKC::ListAll(CString str)
{
MyCjList.DeleteAllItems();
MyCjList.InsertItem(0,L"");
CKC m_kc;//類的對象,用來調(diào)用操作數(shù)據(jù)庫函數(shù)
try
{
if(m_kc.IsOpen())
{
m_kc.Close();
}
if(!m_kc.Open(CRecordset::snapshot,str))
{
MessageBox(L"數(shù)據(jù)庫打開失敗",L"數(shù)據(jù)錯誤",MB_OK);
return;
}
}
catch(CDBException *e)
{
e->ReportError();
}
int index = 0;
//int line = 0;
CString t;
m_kc.MoveFirst();
while(!m_kc.IsEOF())
{



//MessageBox(L"123");
MyCjList.SetItemText(index,0,m_kc.m_cno);
m_kc.m_cname.Remove(' ');
MyCjList.SetItemText(index,1,m_kc.m_cname);
//MessageBox(m_xs.m_name);
t.Format(L"%Id",m_kc.m_xf);
const TCHAR * ip = (LPCTSTR)t;
MyCjList.SetItemText(index,2,t);


m_kc.MoveNext();
index++;
}
m_kc.Close();
}
說明一下,t.Format(L"%Id",m_kc.m_xf);
? ??const TCHAR * ip = (LPCTSTR)t;
? ? MyCjList.SetItemText(index,2,t);
這兩句是一個簡單的類型轉(zhuǎn)換,設(shè)計到LPCTSTR類型,所以有些麻煩。
這樣就寫好了查詢BUTTONbutton了,接下來就是加入,刪除和改動了,詳細(xì)的思想都差點兒相同,假設(shè)查詢能搞清楚,那么其它的應(yīng)該非常easy就寫出來,以下我把代碼貼上來。
oid CXSKC::OnBnClickedButton2()//加入
{
// TODO: 在此加入控件通知處理程序代碼
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql語句
CDatabase m_xs;//對象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=;");
try{
if(str1.IsEmpty()||str2.IsEmpty()||str3.IsEmpty())
{
MessageBox(L"輸入的信息不完好請完好后在插入數(shù)據(jù)",L"提示");
MyCno = (L"");
MyCname = L"";
MyXf = _ttoi(L"");
UpdateData(FALSE);
}
else
{
sql.Format(_T("insert into KC values('%s','%s','%s')"),str1,str2,str3);
MessageBox(sql);

m_xs.ExecuteSQL(sql);
MessageBox(L"加入成功!",L"提示");
//UpdateData(FALSE);
}
}
catch(CDBException ex)
{
MessageBox(L"插入異常");
ex.ReportError();
ex.Delete();
}
m_xs.Close();
}




void CXSKC::OnBnClickedButton3()//刪除
{
// TODO: 在此加入控件通知處理程序代碼
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql語句
CDatabase m_xs;//對象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=");// 帳號與password我就不寫了,自己把自己的SQL的帳號與password寫上就好。
sql.Format(L"delete from KC where cno = '%s'",str1);
try{
if(str1.IsEmpty())
{
MessageBox(L"信息不完整",L"提示");
UpdateData(FALSE);
return;
}
else
{
//sql.Format(L"delete from KC where cno = '%S'",str1);
MessageBox(sql);

m_xs.ExecuteSQL(sql);
MessageBox(L"刪除成功!",L"提示");


}
}
catch(CDBException ex)
{
ex.ReportError();
ex.Delete();
}
m_xs.Close();


}




void CXSKC::OnBnClickedButton4()//改動
{
// TODO: 在此加入控件通知處理程序代碼
CString str1,str2,str3;
GetDlgItem(IDC_EDIT1)->GetWindowTextW(str1);
GetDlgItem(IDC_EDIT2)->GetWindowTextW(str2);
GetDlgItem(IDC_EDIT3)->GetWindowTextW(str3);
CString sql;//sql語句
CDatabase m_xs;//對象
m_xs.Open(L"Test",FALSE,FALSE,L"ODBC;UID=;PWD=;");
sql.Format(L"update KC set cno = '%s' , cname = '%s',xf = '%s' where cno = '%s'",str1,str2,str3,str1);
try
{
if(str1.IsEmpty()||str2.IsEmpty()||str3.IsEmpty())
{
MessageBox(L"信息輸入不完整",L"提示");
UpdateData(FALSE);
return;
}
else
{
sql.Format(L"update KC set cno = '%s' , cname = '%s',xf = '%s' where cno = '%s'",str1,str2,str3,str1);
MessageBox(sql);

if(MessageBox(L"cno:"+str1+'\n'+L"cname:"+str2+'\n'+L"xf:"+str3+'\n',L"確認(rèn)改動?",MB_OKCANCEL)==IDCANCEL)
{
return;
}
else
{
m_xs.ExecuteSQL(sql);
MessageBox(L"改動成功",L"提示");
}
}
}
catch(CDBException ex)
{
ex.ReportError();
ex.Delete();
}
m_xs.Close();
}
這些代碼都非常easy,用CDataBase類生成一個對象,這個對象來調(diào)用ExecuteSQL(),這個函數(shù)能夠運行SQL語句。
然后就是異常處理機制,這些就不詳細(xì)多說了。
注意的是:1. 每調(diào)用一次open()都要調(diào)用一次close();不要忘記了,不然會出現(xiàn)無法操作數(shù)據(jù)庫的情況,切記切記!
? ? ? ? ? ? ? ? ? ? 2. 記得#include “afxdb.h"。僅僅有include了這個頭文件之后才干用CDataBase。

剩下的就沒什么好說的,主要的就是這樣,假設(shè)大家還有什么意見和建議或者發(fā)現(xiàn)了文章有什么寫的不對的地方歡迎指正~!
賣個萌 可憐 哈哈~!感謝閱讀!

VS2012+SQL2008+ODBC編程,第一篇博客,寫的不好忘各位大神指點一二~


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 全椒县| 游戏| 南靖县| 大化| 漯河市| 东乡| 苏尼特左旗| 新宾| 泉州市| 陵水| 曲水县| 宽城| 钟祥市| 如皋市| 福建省| 赣榆县| 和政县| 江油市| 南安市| 大埔县| 莱阳市| 砀山县| 营山县| 巩留县| 焦作市| 望江县| 高雄市| 万源市| 兴隆县| 巴东县| 五台县| 南城县| 毕节市| 鄂尔多斯市| 新巴尔虎右旗| 佛山市| 沾益县| 大方县| 汝城县| 夏津县| 襄城县|