1. 程式人生 > >Sqlite3插入資料和查詢資料

Sqlite3插入資料和查詢資料

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);
}