一、條件情況:1、多文檔工程,
2、在App中的.h中定義 _ConnectionPtr m_pConnection;
3、在App中的.cpp中在初始化函數中進行了數據庫的連接和創建一個表和在標準添加數據
int CDrawYunApp::ADOInit(void)
{
//AfxOleInit();//初始化com,創建ado連接等操作,調用之後函數裏面會自動進行
// AfxOleInit()在前面已經調用過了,所以註釋掉
//AfxOleInit()初始化COM庫的優點就在於資源的釋放也是自動進行的,所以不必擔心資源泄漏的問題
m_pConnection.CreateInstance(__uuidof(Connection)); //創建Connection對象,通過uuid創建對象,這個uuid是唯一的.比過名字創建對象好,後者可能會出現衝突.
//////////////打開本地Access庫DrawYun.mdb////////////////
try
{ //打開本地Access庫Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access\\DrawYun.mdb",
"","",adModeUnknown);//注意代碼的拼寫錯誤!!!
//解釋://Microsoft.Jet.OLEDB.4.0爲數據庫驅動引擎或微軟接入口版本,Data Source後面是連接的數據庫存放的位置。 兩個""的意義是:第一個""是用戶名,第二個""是密碼,
//由於你沒有用戶名和密碼,所以這兩項均爲空;adModeUnknown 表示目前用ado連接數據庫的方式
//還不知道ad--ADO Mode-方式模式 Unknown-不知道,這種方式以後可以在程序中
//以表、視圖、查詢、SQL、過程等方式提取數據
}
catch(_com_error e) ////捕捉異常
{
// AfxMessageBox(_T("數據庫連接失敗,確認數據庫Demo.mdb是否在當前路徑下!"));
// return FALSE;
CString strError;
strError.Format( _T("連接數據庫發生異常! \r \n錯誤信息:%s"), e.ErrorMessage( ) );
//顯示錯誤信息
AfxMessageBox(strError);
}
//創建表
_variant_t RecordsAffected;
try
{
CString strCommand;
/*
執行SQL命令:CREATE TABLE創建表格
該表包含三個字段:記錄編號 INTEGER,姓名 TEXT,出生年月 DATETIME
SQL語言中的create table語句被用來建立新的數據庫表格。
create table語句的使用格式如下:
create tablename (column1 data type,column2 data type,column3 data type);
如果用戶希望在建立新表格時規定列的限制條件,可以使用可選的條件選項
create table tablename
(column1 data type[constraint],
column2 data type[constraint],
column3 data type[constraint]);
舉例:
create table employee
(firstname varchar(15),
lastname varchar(20),
age number(3),
address varchar(30),
city varchar(20));
簡單來說,創建新表格時,在關鍵詞create table後面加入所要建立的表格的名稱,
然後在括號內順次設定各列的名稱,數據類型,以及可選的限定條件等。
使用SQL語句創建的數據庫表格和表格中列的名稱必須以字母開頭,
後面可以使用字母,數字或下劃線,名稱的長度不能超過30個字符,
注意,用戶在選擇表格名稱時不要使用SQL語言中的保留關鍵字,
如select,create,insert等,作爲表格或列的名稱
*/
strCommand.Format(_T("CREATE TABLE %s(記錄編號 INTEGER,姓名 TEXT,出生年月 DATETIME)"),_T("student"));
//Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)
//其中CommandText是命令字串,通常是SQL命令,
//參數RecordsAffected是操作完成後所影響的行數
//參數Options表示CommandText中內容的類型,可以取下列值之一:
//adCmdText 表明CommandText是文本命令
//adCmdTable 表明CommandText是一個表名
//adCmdProc 表明CommandText是一個存儲過程
//adCmdUnknown 未知
//_bstr_t:_variant_t和_bstr_t這兩個類分別封裝並管理VARIANT和BSTR這兩種數據類型,VARIANT和BSTR這兩種類型是COM中使用的數據類型。
//通過_variant_t和_bstr_t這兩個類,就可以方便的把C++類型變量轉換成COM中的變量了
m_pConnection->Execute(_bstr_t(strCommand),&RecordsAffected,adCmdText);//創建表
//if(m_pConnection->State)
// m_pConnection->Close();/////如果已經打開了連接則關閉
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
///往表格裏面添加記錄
CString str;
str.Format(_T("Yunge"));
CString str1;
// str1.Format(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1, '"+str+"','1970/1/1')"));
str1.Format(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1, '%s','1970/1/1')"),str);
m_pConnection->Execute(_bstr_t(str1),&RecordsAffected,adCmdText);
//m_pConnection->Execute(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1,'Yunge','1970/1/1')"),&RecordsAffected,adCmdText);
return 0;
}
//程序退出時刪除new的堆
int CDrawYunApp::ExitInstance()
{
//關閉ado的access數據庫連接
m_pConnection->Close( );
m_pConnection=NULL;
}
二、在創建的對話框中,在已經創建的表中插入數據
void CDataSaveConfigeDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
int rowCount;
CString strSql,orderStr,iedStr,ycStr,timeStr;
rowCount = m_list.GetItemCount();
_variant_t RecordsAffected;
CDrawYunApp * pApp =(CDrawYunApp *)AfxGetApp();
for(int i=0;i<rowCount;i++)
{
try
{
orderStr = m_list.GetItemText(i ,0);
iedStr = m_list.GetItemText(i ,1);
ycStr = m_list.GetItemText(i ,2);
timeStr = m_list.GetItemText(i ,3);
//strSql.Format(_T("INSERT INTO HisDataConfig(序號,裝置名,遙測名,採樣週期(分))VALUES ('%s','%s','%s','%s')"),orderStr,iedStr,ycStr,timeStr);
strSql.Format(_T("INSERT INTO [HisDataConfig]([序號],[裝置名],[遙測名],[採樣週期(分)])VALUES ('"+orderStr+"','"+iedStr+"','"+ycStr+"','"+timeStr+"')"));
if(pApp->m_pConnection)
{
pApp->m_pConnection->Execute(_bstr_t(strSql),&RecordsAffected,adCmdText);
}
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}
}
CDialogEx::OnOK();
}
三、在。app中可行的插入,但在對話框中不行的三種方法
1、CString str;
str.Format(_T("Yunge"));
m_pConnection->Execute(_bstr_t(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1,'"+str+"','1970/1/1')")),&RecordsAffected,adCmdText);
2、CString str;
str.Format(_T("Yunge"));
CString str1;
str1.Format(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1, '"+str+"','1970/1/1')"));
m_pConnection->Execute(_bstr_t(str1),&RecordsAffected,adCmdText);
3、把2中的倒數第二句換成str1.Format(_T("INSERT INTO student(記錄編號,姓名,出生年月)VALUES (1, '%s','1970/1/1')"),str);也行
但在對話框使用時還是出現“INSERT INTO語句語法錯誤”
查找過程中幾個重要的連接:1、http://zhidao.baidu.com/link?url=YlQQ2O7SU8_hRTA3uDfRIv7auSnV-y0Y_v_raVPk-ThIxF2g4sUeko8DWAplWyfuoTPxpQOZljLrZW6xLPmSN_
總之兩點:在插入時有變量時,如變量str,改成 '"+str+"',還有在 表名和字段名添加中括號
補充:在創建Access數據庫中的表中的四個字段原來類型都是備註,現在修改成兩個數字和兩個文本,還是能夠進行插入。原來代碼中的CString類型不影響數據庫中字段的類型
不知道'"+str+"'是什麼用法
初學數據庫進行記錄,以便以後回顧和初學者的參考