在學習SQL的時候,本來預計花三天的時候掌握MS SQL這些基礎,現在爭取提前一天看完。總結沉底下來,其實也沒有多少東西:
1、程序初始化前,先連接數據庫
MFC程序中添加記錄的代碼:
- /************************************************************************/
- /* 函數作用: 對話框默認初始化函數,連接SQL數據庫、添加列表頭
- /* 函數參數: 無
- /* 返 回 值: 成功返回TRUE,否則返回FALSE
- /* 說 明: By Koma 2009-08-20 20:18 Edit
- /************************************************************************/
- BOOL CQDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- //初始化COM接口
- if (!AfxOleInit())
- {
- AfxMessageBox("初始化com接口失敗");
- }
- HRESULT hr;
- try
- {
- // 創建Connection對象
- hr = m_pConnection.CreateInstance("ADODB.Connection");
- if(SUCCEEDED(hr))
- {
- // 連接數據庫成功
- hr = m_pConnection->Open("Provider=SQLOLEDB;Server=koma.5166.info,1433;DataBase=student;UID=sa;PWD=","","",adModeUnknown);
- }
- }
- catch(_com_error e)
- {
- // 捕捉異常
- CString errormessage;
- errormessage.Format("連接數據庫失敗!/r/n錯誤信息:%s",e.ErrorMessage());
- AfxMessageBox(errormessage);///顯示錯誤信息
- }
- // 上下列表控件初始化XP風格
- LONG lStyle = m_LineList.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
- lStyle |= LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
- m_LineList.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle);
- // 添加ListBox列表頭
- m_LineList.InsertColumn(0,"姓名", NULL,80, -1);
- m_LineList.InsertColumn(1,"班級", NULL,80,-1);
- m_LineList.InsertColumn(2,"語文", NULL,80,-1);
- m_LineList.InsertColumn(3,"數學", NULL,80, -1);
- m_LineList.InsertColumn(4,"英語", NULL,80, -1);
- return TRUE; // return TRUE unless you set the focus to a control
- }
2、選擇表名
例句:use student 這條語句一般在SQL查詢分析器中需要使用到,而在程序中我覺得並不需要。
3、讀取記錄
SQL查詢分析器中例句:
use student
select * from db_info
MFC程序中添加記錄的代碼:
- /************************************************************************/
- /* 函數作用: 讀取SQL數據庫記錄,將內容寫入ListBox
- /* 函數參數: 無
- /* 返 回 值: 無
- /* 說 明: By Koma 2009-08-20 21:35 Edit
- /************************************************************************/
- void CQDlg::OnBtnRead()
- {
- // TODO: Add your control notification handler code here
- // 清空列表框
- m_LineList.DeleteAllItems();
- int nItem;
- _variant_t vName,vBanJi,vYuWen,vShuXue,vYinWen;
- try
- {
- // 連接數據庫,打開MainInfo表
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
- m_pConnection,TRUE),adOpenStatic,adLockOptimistic,adCmdText);
- // 判斷記錄集指針標志,是否讀取完畢
- while(!m_pRecordset->adoEOF)
- {
- // 獲取記錄集
- vName = m_pRecordset->GetCollect("姓名");
- vBanJi = m_pRecordset->GetCollect("班級");
- vYuWen = m_pRecordset->GetCollect("語文");
- vShuXue = m_pRecordset->GetCollect("數學");
- vYinWen = m_pRecordset->GetCollect("英語");
- // 更新上面的ListBox
- nItem = m_LineList.InsertItem(0xffff,(_bstr_t)vName);
- m_LineList.SetItem(nItem,1,1,(_bstr_t)vBanJi,NULL,0,0,0);
- m_LineList.SetItem(nItem,2,1,(_bstr_t)vYuWen,NULL,0,0,0);
- m_LineList.SetItem(nItem,3,1,(_bstr_t)vShuXue,NULL,0,0,0);
- m_LineList.SetItem(nItem,4,1,(_bstr_t)vYinWen,NULL,0,0,0);
- // 移動記錄集指針到下一條
- m_pRecordset->MoveNext();
- Sleep(5);
- }
- }
- catch (_com_error e)
- {
- // 讀取出數據庫記錄出錯
- CString strTemp;
- strTemp.Format("讀取數據庫時出錯,錯誤代碼:『%s』",GetLastError());
- AfxMessageBox(strTemp);
- }
- }
4、添加記錄
SQL查詢分析器中例句:
insert into db_info ([姓名],[班級],[語文],[數學],[英語]) values ('鄧麗君','二年三班','98','94','100')
MFC程序中添加記錄的代碼:
- /************************************************************************/
- /* 函數作用: 讀取SQL數據庫,添加記錄集
- /* 函數參數: 無
- /* 返 回 值: 無
- /* 說 明: By Koma 2009-08-20 22:45 Edit
- /************************************************************************/
- void CQDlg::OnBtnAdd()
- {
- // TODO: Add your control notification handler code here
- try
- {
- UpdateData(TRUE);
- CString sql;
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
- m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);
- sql.Format("insert into db_info ([姓名],[班級],[語文],[數學],[英語]) values ('%s','%s','%d','%d','%d')",
- m_Name,m_Class,m_Yuwen,m_Shuxue,m_English);
- // 執行SQL語句
- m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);
- MessageBox("添加成功!","提示");
- }
- catch(_com_error e)
- {
- // 添加出錯
- CString errormessage;
- errormessage.Format("添加失敗,請檢查姓名『%s』是否已經存在!/n錯誤信息:『%s』",m_Name,e.ErrorMessage());
- AfxMessageBox(errormessage);
- }
- }
5、修改記錄
SQL查詢分析器中例句:
update db_info set [姓名]='黃家駒',[班級]='三年三班',[語文]='97',[數學]='96',[英語]='98' where [姓名]='黃家駒'
MFC程序中添加記錄的代碼:
- /************************************************************************/
- /* 函數作用: 讀取SQL數據庫,修改記錄集
- /* 函數參數: 無
- /* 返 回 值: 無
- /* 說 明: By Koma 2009-08-20 22:58 Edit
- /************************************************************************/
- void CQDlg::OnBtnEdit()
- {
- // TODO: Add your control notification handler code here
- try
- {
- // 修改數據,以姓名為鍵
- UpdateData(TRUE);
- CString sql;
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
- m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);
- sql.Format("update db_info set [姓名]='%s',[班級]='%s',[語文]='%d',[數學]='%d',[英語]='%d' where [姓名]='%s'",
- m_Name,m_Class,m_Yuwen,m_Shuxue,m_English,m_OldName);
- // 執行SQL語句
- m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);
- // 刷新重新讀取數據庫
- OnBtnRead();
- MessageBox("修改成功!","提示");
- }
- catch(_com_error e)
- {
- // 修改失敗
- CString errormessage;
- errormessage.Format("修改失敗,錯誤信息:『%s』",e.ErrorMessage());
- AfxMessageBox(errormessage);
- }
- }
6、刪除記錄
SQL查詢分析器中例句:
delete from db_info where [姓名]='黃家駒'
MFC程序中添加記錄的代碼:
- /************************************************************************/
- /* 函數作用: 讀取SQL數據庫,刪除記錄集
- /* 函數參數: 無
- /* 返 回 值: 無
- /* 說 明: By Koma 2009-08-20 21:46 Edit
- /************************************************************************/
- void CQDlg::OnBtnDel()
- {
- // TODO: Add your control notification handler code here
- try
- {
- UpdateData(TRUE);
- CString sql;
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset->Open("select * from db_info",_variant_t((IDispatch*)
- m_pConnection,TRUE),adOpenStatic,adLockBatchOptimistic,adCmdText);
- UpdateData(TRUE);
- sql.Format("delete from db_info where [姓名]='%s'",m_Name);
- // 執行SQL語句
- m_pConnection->Execute((_bstr_t)sql,NULL,adExecuteNoRecords);
- OnBtnRead();
- MessageBox("刪除成功!","提示");
- }
- catch(_com_error e)
- {
- CString errormessage;
- errormessage.Format("刪除失敗,錯誤信息:『%s』",e.ErrorMessage());
- AfxMessageBox(errormessage);
- }
- }
7、條件判斷
SQL腳本中,常用的關鍵詞有:
where、or、and、like、order by
SQL查詢分析器中例句:
A、完全符合條件:select * from db_info where [姓名]='黃家強'
B、比較符合條件:select * from db_info where [語文]>='80'
C、按語文來排序:select * from db_info where [語文]>='80' order by [語文]
D、符合關鍵字的:select * from db_info where [姓名] like '%黃%'
E、組合條件查詢:select * from db_info where [姓名] like '%黃%' and [語文]>=90
F、組合條件查詢:select * from db_info where [姓名] like '%黃%' or [語文]>=90
MFC程序中添加記錄的代碼,上面的代碼中除了帶有%關鍵字比較麻煩,其他的應該沒問題,這里舉例以字段包含某關鍵字:
- /************************************************************************/
- /* 函數作用: 查詢姓名字段包含某關鍵字的記錄集
- /* 函數參數: 默認
- /* 返 回 值: 無
- /* 說 明: By Koma 2009-08-20 23:10 Edit
- /************************************************************************/
- void CQDlg::OnBtnFind()
- {
- // TODO: Add your control notification handler code here
- try
- {
- // 清空列表框
- UpdateData(TRUE);
- m_LineList.DeleteAllItems();
- CString sql;
- int nItem;
- _variant_t vName,vBanJi,vYuWen,vShuXue,vYinWen;
- sql.Format("select * from db_info where [姓名] like /'%%%s%%/'",m_FindName);
- m_pRecordset.CreateInstance("ADODB.Recordset");
- m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)
- m_pConnection,TRUE),adOpenStatic,adLockOptimistic,adCmdText);
- // 判斷記錄集指針標志,是否讀取完畢
- while(!m_pRecordset->adoEOF)
- {
- // 獲取記錄集
- vName = m_pRecordset->GetCollect("姓名");
- vBanJi = m_pRecordset->GetCollect("班級");
- vYuWen = m_pRecordset->GetCollect("語文");
- vShuXue = m_pRecordset->GetCollect("數學");
- vYinWen = m_pRecordset->GetCollect("英語");
- // 更新上面的ListBox
- nItem = m_LineList.InsertItem(0xffff,(_bstr_t)vName);
- m_LineList.SetItem(nItem,1,1,(_bstr_t)vBanJi,NULL,0,0,0);
- m_LineList.SetItem(nItem,2,1,(_bstr_t)vYuWen,NULL,0,0,0);
- m_LineList.SetItem(nItem,3,1,(_bstr_t)vShuXue,NULL,0,0,0);
- m_LineList.SetItem(nItem,4,1,(_bstr_t)vYinWen,NULL,0,0,0);
- // 移動記錄集指針到下一條
- m_pRecordset->MoveNext();
- Sleep(5);
- }
- CString strTotal;
- int nTotals=m_pRecordset->GetRecordCount();
- strTotal.Format("查詢完成,總共有%d條記錄!",nTotals);
- SetDlgItemText(IDC_STATIC_RESULT,strTotal);
- }
- catch (_com_error e)
- {
- // 讀取出數據庫記錄出錯
- CString strTemp;
- strTemp.Format("讀取數據庫時出錯,錯誤代碼:『%s』",GetLastError());
- AfxMessageBox(strTemp);
- }
- }
8、總結
個人覺得,在程序設計中上面的實例與代碼應付一般的數據庫操作都沒什么問題,如果具體還需要更高級的操作的話,直接去查查聯機手機吧,“中文”稍微好點的,應該沒什么問題!