Sqlite3插入資料和查詢資料
阿新 • • 發佈:2018-12-12
1.
//表單:Record(USN+有線MAC地址+無線MAC地址) //查詢 #define QUERY_SQL_SN "SELECT * FROM Record WHERE USN = '%s'" #define QUERY_SQL_MAC "SELECT * FROM Record WHERE MAC = '%s'" #define QUERY_SQL_WMAC "SELECT * FROM Record WHERE W_MAC = '%s'" //插入 //#define INSERT_SQL_SN_MAC "INSERT INTO Record (USN, MAC, W_MAC, TIME) VALUES ('%s','%s','%s','%s');" #define INSERT_SQL_SN_MAC "INSERT OR REPLACE INTO Record (USN, MAC, W_MAC, TIME) VALUES ('%s','%s','%s','%s');" #define INSERT_SQL_SN_MAC_OLD "INSERT INTO RepeatRecord (USN, MAC, W_MAC, TIME) VALUES ('%s','%s','%s','%s');" //insert or replace:如果不存在就插入,存在就更新 //insert or ignore:如果不存在就插入,存在就忽略
2.
//NOT NULL - 非空 //UNIQUE - 唯一 //PRIMARY KEY - 主鍵 //FOREIGN KEY - 外來鍵 //CHECK - 條件檢查 //DEFAULT - 預設 static const char* create_sql = "CREATE TABLE Record("\ "USN CHAR(20) PRIMARY KEY UNIQUE NOT NULL,"\ "MAC CHAR(20) UNIQUE,"\ "W_MAC CHAR(20) UNIQUE,"\ "TIME CHAR(20)) ;"; static const char* create_EntrySql = "CREATE TABLE RepeatRecord("\ "USN CHAR(20) ,"\ "MAC CHAR(20) ,"\ "W_MAC CHAR(20) ,"\ "TIME CHAR(20)) ;"; DB::DB(void):m_pDB(NULL) { } DB::~DB(void) { if (m_pDB) { sqlite3_close(m_pDB); m_pDB = NULL; } } bool DB::OpenDB(const char* name, sqlite3 **ppDB) { int ret = sqlite3_open(name, &m_pDB); if (SQLITE_OK != ret) { AfxMessageBox(_T("開啟資料庫失敗")); return false; } return true; } bool DB::CreateTable(const char* sql) { if (!m_pDB || !sql) return false; char *errMsg = NULL; int ret = sqlite3_exec(m_pDB, sql, 0, 0, &errMsg); if (SQLITE_OK != ret) { CString strMsg; strMsg.Format("建立表失敗,錯誤資訊:%s", errMsg); AfxMessageBox(strMsg); sqlite3_free(errMsg); return false; } if (errMsg) sqlite3_free(errMsg); return true; } bool DB::InsertToDB(const char* dbName, char* sql, int Control) { if (!dbName || !sql) return false; bool bCreateTbl = true; if (-1 == _access(dbName, 0)) bCreateTbl = false; bool bSuccess = OpenDB(dbName, &m_pDB); if (!bSuccess) return false; if (!bCreateTbl) { if(Control == 0) bSuccess = CreateTable(create_sql); else bSuccess = CreateTable(create_EntrySql); // if (!bSuccess) return false; } if (!m_pDB) return false; char *errMsg = NULL; int ret = sqlite3_exec(m_pDB, sql, 0, 0, &errMsg); if (SQLITE_OK != ret) { CString strMsg; strMsg.Format("資料庫插入失敗,錯誤資訊:%s", errMsg); AfxMessageBox(strMsg); sqlite3_free(errMsg); return false; } else { //AfxMessageBox("插入資料庫成功!"); } if (errMsg) sqlite3_free(errMsg); return true; } bool DB::QueryDB(const char* dbName, char* sql, CString& strResult) { if (!dbName || !sql) return false; if (-1 == _access(dbName, 0)) return false; bool bSuccess = OpenDB(dbName, &m_pDB); if (!bSuccess) return false; if (!m_pDB) return false; char *errMsg = NULL; char** pResult = NULL; int rowCount = 0, colCount = 0; int ret = sqlite3_get_table(m_pDB, sql, &pResult, &rowCount, &colCount, &errMsg); if (SQLITE_OK != ret) { CString strMsg; strMsg.Format("資料庫查詢失敗,錯誤資訊:%s", errMsg); AfxMessageBox(strMsg); sqlite3_free(errMsg); return false; } //"INSERT OR REPLACE INTO Record (USN, MAC, W_MAC, TIME) VALUES ('%s','%s','%s','%s');" int index = colCount; CString pData[10]={0}; for (int i = 0; i < rowCount; ++i) { for (int j = 0; j < colCount; ++j) { //strResult += pResult[j]; //strResult += ":"; //strResult += pResult[index]; //strResult += "#"; pData[j]=pResult[index]; ++ index; } //strResult += "&&"; strResult.Format(INSERT_SQL_SN_MAC_OLD,pData[0],pData[1],pData[2],pData[3]); // sprintf_s(strResult,sizeof(strResult),QUERY_SQL_WMAC,pData[0],pData[1],pData[2],pData[3]); } //TRACE(strResult); if (pResult) sqlite3_free_table(pResult); if (errMsg) sqlite3_free(errMsg); return true; } bool DB::UpdateDB(const char* dbName, char* sql) { if (!dbName || !sql) return false; if (-1 == _access(dbName, 0)) return false; bool bSuccess = OpenDB(dbName, &m_pDB); if (!bSuccess) return false; if (!m_pDB) return false; char *errMsg = NULL; int ret = sqlite3_exec(m_pDB, sql, 0, 0, &errMsg); if (SQLITE_OK != ret) { CString strMsg; strMsg.Format("資料庫修改失敗,錯誤資訊:%s", errMsg); AfxMessageBox(strMsg); sqlite3_free(errMsg); return false; } if (errMsg) sqlite3_free(errMsg); return true; } bool DB::DeleteDB(const char* dbName, char* sql) { if (!dbName || !sql) return false; if (-1 == _access(dbName, 0)) return false; bool bSuccess = OpenDB(dbName, &m_pDB); if (!bSuccess) return false; if (!m_pDB) return false; char *errMsg = NULL; int ret = sqlite3_exec(m_pDB, sql, 0, 0, &errMsg); if (SQLITE_OK != ret) { CString strMsg; strMsg.Format("資料庫刪除失敗,錯誤資訊:%s", errMsg); AfxMessageBox(strMsg); sqlite3_free(errMsg); return false; } if (errMsg) sqlite3_free(errMsg); return true; }
3.
BOOL CXVRProductCheckDlg::PreTranslateMessage(MSG* pMsg) { //if (WM_KEYFIRST <= pMsg-> message && pMsg-> message <= WM_KEYLAST) if(pMsg->message==WM_KEYDOWN)//鍵盤按下 { if(GetFocus()->GetDlgCtrlID() == IDC_SN)//繫結SN編輯框ID { if(pMsg-> wParam==VK_RETURN ) //回車事件 { UpdateData(TRUE); DB db; int x=0,y=0,z=0; char szSql[1024] = {0}; char szSqlUsn[1024]={0}; char szSqlMac[1024]={0}; char szSqlWmac[1024]={0}; CString strResultUsn; CString strResultMac; CString strResultWmac; CString strSnMac; CString strWiredMac = m_dev.wiredmac; CString strWifiMac =m_dev.wifimac; CString strPrint;//SN+有線MAC+無線MAC m_snmac.GetWindowText(strSnMac); CTime time; time = CTime::GetCurrentTime(); CString strNowTime = time.Format("%Y-%m-%d;%H:%M:%S");//獲取當前時間 if((strWiredMac.IsEmpty()!=0)||(strWifiMac.IsEmpty()!=0)||(strSnMac.IsEmpty()!=0)) //if(strSnMac.IsEmpty()!=0) { MessageBox("USN,有線MAC和無線MAC地址不能為空!","提示",MB_ICONSTOP|MB_OK); } else { sprintf_s(szSqlUsn,sizeof(szSqlUsn),QUERY_SQL_SN,strSnMac); sprintf_s(szSqlMac,sizeof(szSqlMac),QUERY_SQL_MAC,strWiredMac); sprintf_s(szSqlWmac,sizeof(szSqlWmac),QUERY_SQL_WMAC,strWifiMac); sprintf_s(szSql, sizeof(szSql),INSERT_SQL_SN_MAC,strSnMac,strWiredMac,strWifiMac,strNowTime); //分別查詢USN,MAC,W_MAC,有一個重複都算重複 db.QueryDB("my_sql.db",szSqlUsn,strResultUsn); if(strResultUsn.IsEmpty()==0) { x=1; //MessageBox(strResultUsn,"提示",MB_ICONSTOP|MB_OK); // db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultUsn,1); } db.QueryDB("my_sql.db",szSqlMac,strResultMac); if(strResultMac.IsEmpty()==0) { y=1; //db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultMac,1); } db.QueryDB("my_sql.db",szSqlWmac,strResultWmac); if(strResultWmac.IsEmpty()==0) { z=1; // db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultWmac,1); } point dlg; if((x+y+z)>0) { dlg.m_usn =x; dlg.m_mac =y; dlg.m_wmac=z; dlg.DoModal();//提示框,輸入123繼續列印否則取消 } else { db.InsertToDB("my_sql.db", szSql,0); strPrint.Format("%s,%s,%s",strSnMac,strWiredMac,strWifiMac); // MessageBox(strPrint,"提示",MB_ICONSTOP|MB_OK); char szUSn[100] = {0}; memcpy(szUSn, strPrint, strlen(strPrint)+1); szUSn[100] = '\0'; if( NULL == "MAC.fr3") return FALSE; HINSTANCE hDllFile = NULL; hDllFile = LoadLibrary("JuanReport.dll"); DLL_API_BarPrint BarPrint=NULL; BarPrint = (DLL_API_BarPrint)GetProcAddress(hDllFile, "PrintReport"); BarPrint(szUSn, NULL, "MAC.fr3"); FreeLibrary(hDllFile); BarPrint = NULL; hDllFile = NULL; } if(dlg.m_Print==1) { if(x==1) db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultUsn,1); if(y==1) db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultMac,1); if(z==1) db.InsertToDB("Oldsql.db", (LPSTR)(LPCTSTR)strResultWmac,1); db.InsertToDB("my_sql.db", szSql,0); strPrint.Format("%s,%s,%s",strSnMac,strWiredMac,strWifiMac); // MessageBox(strPrint,"提示",MB_ICONSTOP|MB_OK); char szUSn[100] = {0}; memcpy(szUSn, strPrint, strlen(strPrint)+1); szUSn[100] = '\0'; if( NULL == "MAC.fr3") return FALSE; HINSTANCE hDllFile = NULL; hDllFile = LoadLibrary("JuanReport.dll"); DLL_API_BarPrint BarPrint=NULL; BarPrint = (DLL_API_BarPrint)GetProcAddress(hDllFile, "PrintReport"); BarPrint(szUSn, NULL, "MAC.fr3"); FreeLibrary(hDllFile); BarPrint = NULL; hDllFile = NULL; } } return TRUE;//除了截獲的訊息,其他返回應該全部為假 } } } return FALSE; //return CDialogEx::PreTranslateMessage(pMsg); }