MFC連接sqlite3數據庫

      好一陣子沒有更新了,因爲項目已經做完了。這個項目的後期還有一個MFC的電腦上位機,這部分本來是由師姐做的,但是她忙,就讓我小打小鬧一下下。

      這個MFC程序要求比較多,但是我先打算把基本框架做好,後期的事情再說。這個要求比較多,而且還在隨用戶的要求還要修改,但是有些部分是肯定的,比方說,連接到我做的那個Android手機的數據庫,操作那個數據庫,導出成Excel表格。

      由於手機裏面的那個數據庫是sqlite3,所以第一件事就是要能讓MFC連接到sqlite3這個數據庫,然後纔有別的操作。這個真的是花費不少時間做連接調試。下面具體說說怎麼實現的。

      sqlite3的官網是有提供源碼和一些編譯好的下載資源。(http://www.sqlite.org/download.html)這裏可以下載到我截圖的這些文件。但是紅線標註的是沒有的,要自己手動生成,或者在別的地方下載。生成也很簡單,新建一個Win32 Dynamic-Link Library工程,然後添加源碼,編譯一下就可以了。(怕麻煩的的話,這裏有我打包的庫文件:http://download.csdn.net/detail/u012321815/7617293

      有了這些文件,只要把他們添加到你的工程裏面,然後添加頭文件和.cpp文件,當然,還要設置包含庫和引用庫。

       其實設置了這些就應該可以連接並操作數據庫的,但是往往沒那麼順利,因爲我調試了一上午才成功了,不同機器可能編譯調試時報的錯誤不同,所以我就不給出我調試時的錯誤了,(其實我也沒截圖當時),不過報錯怎麼辦呢?你不是第一個遇到錯誤的人,所以記住,百度一下,肯定可以解決的。

      接下來說說操作數據庫。如果你只需要用到像我這樣,越簡單約好的話,我可以告訴你,程序很簡單,無非是增刪改查四步,也就是幾個關鍵函數的調用就好了。前提是你對數據庫有最基本的瞭解。

      這是查詢裏面的顯示函數,也是最簡單的查詢操作。db.open(m_exclefilepath)是打開選擇的路徑下的數據庫,裏面的參數是路徑;db.tableExists("data")是查看錶data是否存在,因爲我android的那個程序的數據庫的表名就是data;CppSQLite3Buffer bufSQL;bufSQL.format("select * from data where %s;",tempsql);q = db.execQuery(bufSQL);前兩句是爲了拼裝一句sql語句,因爲包含特殊字符串,所以用的是自帶的這個buffer,儘量不要用string的“+”,最後一句是查詢,當然,因爲第二句是一句條件sql,所以這裏是條件查詢,返回的是一個集合CppSQLite3Query;q.nextRow()是指向下一條記錄;!q.eof()循環條件不爲空;有了上面這些解釋,下面的代碼就很好懂了。

void CQueryDialog::ShowDBList(CString sql)
{
	CString tempsql = "";
	tempsql = G2U(sql);

	try{
		CppSQLite3DB db;

		db.open(m_exclefilepath);

		// 判斷是否存在表data、建立表
        if (db.tableExists("data"))
        {
			int count = 0;
			// 查詢
			CppSQLite3Query q;
			if(sql==""){
				q= db.execQuery("select * from data ;");
			}else{
				CppSQLite3Buffer bufSQL;
				bufSQL.format("select * from data where %s;",tempsql);
				q = db.execQuery(bufSQL);
			}

			while (!q.eof())
			{
				CString str_id = CString(q.fieldValue(0));
				CString str_linename = CString(q.fieldValue(1));
				CString str_time = CString(q.fieldValue(2));
				CString str_identification = CString(q.fieldValue(3));
				CString str_stationtrack = CString(q.fieldValue(4));
				CString str_mileage = CString(q.fieldValue(5));
				CString str_hundred = CString(q.fieldValue(6));
				CString str_ten = CString(q.fieldValue(7));
				CString str_longitude = CString(q.fieldValue(8));
				CString str_latitude = CString(q.fieldValue(9));
				CString str_sidegrinding = CString(q.fieldValue(10));
				CString str_verticalmill = CString(q.fieldValue(11));
				CString str_fatedge = CString(q.fieldValue(12));
				CString str_brightbeltlocation = CString(q.fieldValue(13));
				CString str_brightbeltwidth = CString(q.fieldValue(14));
				CString str_profile13 = CString(q.fieldValue(15));
				CString str_profile25 = CString(q.fieldValue(16));
				CString str_profile487 = CString(q.fieldValue(17));
				CString str_profile65 = CString(q.fieldValue(18));

				m_listquery.InsertItem(count,_T(""));
				m_listquery.SetItemText(count,0,U2G(str_id) );
				m_listquery.SetItemText(count,1,U2G(str_linename) );
				m_listquery.SetItemText(count,2,U2G(str_time) );
				m_listquery.SetItemText(count,3,U2G(str_identification) );
				m_listquery.SetItemText(count,4,U2G(str_stationtrack) );
				m_listquery.SetItemText(count,5,U2G(str_mileage) );
				m_listquery.SetItemText(count,6,U2G(str_hundred) );
				m_listquery.SetItemText(count,7,U2G(str_ten) );
				m_listquery.SetItemText(count,8,U2G(str_longitude) );
				m_listquery.SetItemText(count,9,U2G(str_latitude) );
				m_listquery.SetItemText(count,10,U2G(str_sidegrinding) );
				m_listquery.SetItemText(count,11,U2G(str_verticalmill) );
				m_listquery.SetItemText(count,12,U2G(str_fatedge) );
				m_listquery.SetItemText(count,13,U2G(str_brightbeltlocation) );
				m_listquery.SetItemText(count,14,U2G(str_brightbeltwidth) );
				m_listquery.SetItemText(count,15,U2G(str_profile13) );
				m_listquery.SetItemText(count,16,U2G(str_profile25) );
				m_listquery.SetItemText(count,17,U2G(str_profile487) );
				m_listquery.SetItemText(count,18,U2G(str_profile65) );

				count++;
				q.nextRow();
			}
			q.finalize(); 
        } 
        else
        {
			AfxMessageBox("表data不存在");
        }
    }
    catch (CppSQLite3Exception& e)
    {
		// 出錯
    }

	AfxMessageBox("檢索完畢");

}

       當然,上面是條件查詢,還有增刪改,這都要用到另外一個函數db.execDML(bufSQL);這個函數和db.execQuery(bufSQL)很類似,但是前者返回值是一個int後者返回值是一個字集,前者只是看操作成功了沒有,後者是給出查詢到的結果。比方說我這裏用到的增刪改三種操作,我直接貼我的代碼,很簡單。

//插入一條空記錄在最後一行的下一行
	CppSQLite3Buffer bufSQL;
	bufSQL.format("insert into data values (%d, '','','','','','','','','','','','','','','','','','');",atoi(dblastid)+1);
	db.execDML(bufSQL);

      這是插入一行空記錄,只有id。

//刪掉指定行
			CppSQLite3Buffer bufSQL;
			bufSQL.format("delete from data where id = %s;",id);
			db.execDML(bufSQL);

        這是刪掉一行,要給出id。或者別的條件,當然,你也可以把怎個表刪掉,直接用drop table,懂sql語句就行。

//更新數據庫
	CppSQLite3Buffer bufSQL;
	bufSQL.format("update data set %s = '%s' where id = %s;",head,G2U(strText),id);
	db.execDML(bufSQL);

        這是更新數據庫,要有條件,這裏是指定id的更新。
      

       要用的到基本就是這麼多,還想要調用更多的函數,可以直接查看源文件裏面的函數說明,不是很難,可以看註釋。




發佈了37 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章