#include "StdAfx.h" #include "UIIImpSQLiteServer.h" #include "sqlite3.h" #include "zlib.h" extern HINSTANCE _hdllInstance; CUIIImpSQLiteServer::CUIIImpSQLiteServer(void) { m_pSQLiteDb = NULL; } CUIIImpSQLiteServer::~CUIIImpSQLiteServer(void) { if (m_pSQLiteDb != NULL) { sqlite3_close((sqlite3 *)m_pSQLiteDb); } } // 将ansi字符串转换成UNICODE static LPWSTR MultiByteToUnicode(char* szText) { int nLength,nLen; wchar_t *pBuffer; nLen = (int)strlen(szText); nLength = MultiByteToWideChar(CP_ACP, 0, szText, nLen, NULL, 0); pBuffer = new wchar_t[nLength+1]; MultiByteToWideChar(CP_ACP, 0, szText, nLen, (LPWSTR)pBuffer, nLength); pBuffer[nLength] = 0; return pBuffer; } // 将UNICODE字符串转换成UTF8 static LPSTR UnicodeToUTF8(LPWSTR szText) { char *pBuffer; int nLength; int nLen; nLen = (int)wcslen(szText); // 获取转换后的字符串长度 nLength = WideCharToMultiByte(CP_UTF8, 0, szText, nLen, NULL, 0, 0, 0); int rc = GetLastError(); pBuffer = new char[nLength + 1]; // 进行字符转换 WideCharToMultiByte(CP_UTF8, 0, szText, nLen, pBuffer, nLength, 0, 0); pBuffer[nLength] = 0; return pBuffer; } BOOL CUIIImpSQLiteServer::InitADOServer(LPCTSTR pszDbFileName) { if (m_pSQLiteDb != NULL) { sqlite3_close((sqlite3 *)m_pSQLiteDb); m_pSQLiteDb = NULL; } _bstr_t bst(pszDbFileName); char* pszcDbFileName = (char*)bst; WCHAR * pWideFile = MultiByteToUnicode(pszcDbFileName); char * pUTF8File = UnicodeToUTF8(pWideFile); int nRes = sqlite3_open(pUTF8File,(sqlite3 **)&m_pSQLiteDb); if (nRes != SQLITE_OK) { //error can not open database!!! if (pWideFile != NULL) delete pWideFile; if (pUTF8File != NULL) delete pUTF8File; return FALSE; } if (pWideFile != NULL) delete pWideFile; if (pUTF8File != NULL) delete pUTF8File; return TRUE; } BOOL CUIIImpSQLiteServer::InitSQLServer(LPCTSTR pszConnection) { return FALSE; } BOOL CUIIImpSQLiteServer::CreateDBTable(LPCTSTR pszTableName,Ttable& arFields) { if (m_pSQLiteDb != NULL) { if (IsDbTableExist(pszTableName)) { return FALSE; } CString strSQL,sTemp; int i; int nSize = (int)arFields.GetSize(); CUIITableField fieldInfo; CString keyStr = _T(""),sFormat; strSQL.Format(_T("CREATE TABLE %s ("),pszTableName); for( i = 0; i< nSize; i++ ) { fieldInfo = arFields.GetAt(i); if( fieldInfo.m_sFieldType == _T("nvarchar") || fieldInfo.m_sFieldType == _T("varchar")) { sFormat = _T("[%s] %s (%d) "); if(!fieldInfo.m_bPrimaryKey) { if( fieldInfo.m_bIsAllowNull) { sFormat += _T("NULL,"); } else { sFormat += _T("NOT NULL,"); } } else { sFormat += _T("PRIMARY KEY,"); } sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType, fieldInfo.m_nSize); } else if(fieldInfo.m_sFieldType.CompareNoCase(_T("int")) == 0 || fieldInfo.m_sFieldType.CompareNoCase(_T("smallint")) == 0) { sFormat = _T("[%s] int "); if(!fieldInfo.m_bPrimaryKey) { if( fieldInfo.m_bIsAllowNull) { sFormat += _T("NULL,"); } else { sFormat += _T("NOT NULL,"); } } else { sFormat += _T("PRIMARY KEY,"); } sTemp.Format(sFormat, fieldInfo.m_sFieldName); } else if( fieldInfo.m_sFieldType == _T("float") ) { sFormat = _T("[%s] float "); if(!fieldInfo.m_bPrimaryKey) { if( fieldInfo.m_bIsAllowNull) { sFormat += _T("NULL,"); } else { sFormat += _T("NOT NULL,"); } } else { sFormat += _T("PRIMARY KEY,"); } sTemp.Format(sFormat, fieldInfo.m_sFieldName); } else if(fieldInfo.m_sFieldType == _T("image")) { sFormat = _T("[%s] image NULL,"); sTemp.Format(sFormat, fieldInfo.m_sFieldName); } else if(fieldInfo.m_sFieldType == _T("datetime")) { sFormat = _T("[%s] datetime DEFAULT GETDATE(),"); sTemp.Format(sFormat, fieldInfo.m_sFieldName); } else if(fieldInfo.m_sFieldType == _T("text") || fieldInfo.m_sFieldType == _T("ntext")) { sFormat = _T("[%s] %s NULL,"); sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType); } else if(fieldInfo.m_sFieldType == _T("real")) { sFormat = _T("[%s] real "); if(!fieldInfo.m_bPrimaryKey) { if( fieldInfo.m_bIsAllowNull) { sFormat += _T("NULL,"); } else { sFormat += _T("NOT NULL,"); } } else { sFormat += _T("PRIMARY KEY,"); } sTemp.Format(sFormat, fieldInfo.m_sFieldName); } if(sTemp.GetLength() > 0) { strSQL += sTemp; } sTemp = _T(""); } int nlen = strSQL.GetLength(); if(nlen > 0) { strSQL.SetAt(nlen - 1, _T(')')); } else { return FALSE; } try { ExecuteSQL(strSQL); } catch(...) { return FALSE; } return TRUE; } return FALSE; } BOOL CUIIImpSQLiteServer::IsDbTableExist(LPCTSTR pszTableName) { CString sSQL; sSQL.Format(_T("select count(*) from sqlite_master where type='table' and name='%s'"),pszTableName); _bstr_t bst(sSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow == 0)//说明没有 { if (pazResult != NULL) sqlite3_free_table(pazResult); return FALSE; } if (pazResult != NULL) sqlite3_free_table(pazResult); return TRUE; } static int ParaseString(LPCTSTR pszText,CStringArray& arFields,TCHAR ch = _T(',')) { CString sTemp,sText; sText = pszText; for (int i = 0;i < sText.GetLength();i++) { if (sText.GetAt(i) == ch ) { arFields.Add(sTemp); sTemp = _T(""); } else { sTemp += sText.GetAt(i); if (i == sText.GetLength() - 1) { arFields.Add(sTemp); } } } return (int)arFields.GetSize(); } BOOL CUIIImpSQLiteServer::GetTableStru(LPCTSTR pszTableName,Ttable& arFields,BOOL bTypeAsSQLite) { CString sSQL; sSQL.Format(_T("select * from sqlite_master where type = 'table' and name='%s'"),pszTableName); _bstr_t bst(sSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow == 0)//说明没有 { if (pazResult != NULL) sqlite3_free_table(pazResult); return FALSE; } //CREATE TABLE tblFloor (ID INTEGER PRIMARY KEY ASC,No_ INTEGER,Name TEXT,StdFlrID INTEGER REFERENCES tblStdFlr(ID) ON UPDATE CASCADE ON DELETE CASCADE ,LevelB REAL,Height REAL) //1行,n列 CString sValue,sName,sType; int j = 0,nPos1 = 0,nPos2 = 0; CUIITableField field; //for (int j = 0;j < nRow;j++) { for (int i = 0;i < nCol;i++) { /* offset to access column C of row R of **result */ //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; if (nRow > 0 ) { int nOffset = ((j + 1) * nCol) + i; sValue = pazResult[nOffset]; sValue.MakeLower(); if (sValue.Find(_T("create table")) != -1) { int nPos1 = sValue.Find(_T('(') ); if (nPos1 != -1) { //() sSQL = sValue.Mid(nPos1); sSQL.TrimLeft(_T('(')); sSQL.TrimRight(_T(')')); CStringArray arSegs; ParaseString(sSQL,arSegs,_T(',')); for (int n = 0;n < arSegs.GetSize();n++) { sValue = arSegs.GetAt(n); sValue.TrimRight(); sValue.TrimLeft(); //ID INTEGER PRIMARY KEY ASC nPos1 = sValue.Find(_T(' ')); nPos2 = sValue.Find(_T(' '),nPos1 + 2); if (nPos1 != -1) { sName = sValue.Mid(0,nPos1); if (nPos2 == -1) { sType = sValue.Mid(nPos1 + 1); } else { sType = sValue.Mid(nPos1 + 1,nPos2 - nPos1 - 1); } field.m_bPrimaryKey = FALSE; if ( sValue.Find(_T("primary")) != -1) { field.m_bPrimaryKey = TRUE; } sName.TrimLeft(_T('[')); sName.TrimRight(_T(']')); field.m_sFieldName = sName; field.m_nSize = 256; field.m_sFieldType = sType; field.m_bIsAllowNull = TRUE; sType.MakeLower(); if (sType.CompareNoCase(_T("text")) == 0 || sType.CompareNoCase(_T("varchar")) == 0) { field.m_sFieldType = _T("varchar"); if (bTypeAsSQLite) { field.m_sFieldType = _T("TEXT"); } } else if (sType.CompareNoCase(_T("nvarchar")) == 0) { field.m_sFieldType = _T("nvarchar"); } else if(sType.CompareNoCase(_T("integer")) == 0 || sType.CompareNoCase(_T("BOOLEAN")) == 0 || sType.CompareNoCase(_T("int")) == 0 ) { field.m_sFieldType = _T("int"); if (bTypeAsSQLite) { field.m_sFieldType = _T("INTEGER"); } } else if(sType.CompareNoCase(_T("real")) == 0 || sType.CompareNoCase(_T("double")) == 0 || sType.CompareNoCase(_T("float")) == 0) { field.m_sFieldType = _T("double"); if (bTypeAsSQLite) { field.m_sFieldType = _T("REAL"); } } else if(sType.CompareNoCase(_T("blob")) == 0) { field.m_sFieldType = _T("image"); if (bTypeAsSQLite) { field.m_sFieldType = _T("blob"); } } else if(sType.CompareNoCase(_T("ntext")) == 0) { field.m_sFieldType = _T("varchar"); } else if(sType.CompareNoCase(_T("binary")) == 0) { //field.m_sFieldType = _T("binary"); field.m_sFieldType = _T("image"); if (bTypeAsSQLite) { field.m_sFieldType = _T("blob"); } } else if(sType.CompareNoCase(_T("char")) == 0) { field.m_sFieldType = _T("char"); } else//其他默认为字符串类型 { field.m_sFieldType = _T("varchar"); if (bTypeAsSQLite) { field.m_sFieldType = _T("TEXT"); } } arFields.Add(field); } } } break; } } } } if (pazResult != NULL) sqlite3_free_table(pazResult); return arFields.GetSize() == 0 ? FALSE : TRUE; } BOOL CUIIImpSQLiteServer::GetTableStru(LPCTSTR pszTableName,CStringList& listField) { CString sSQL;//大小写敏感??? sSQL.Format(_T("select * from sqlite_master where type = 'table' and name='%s'"),pszTableName); _bstr_t bst(sSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow == 0)//说明没有 { if (pazResult != NULL) sqlite3_free_table(pazResult); return FALSE; } //CREATE TABLE tblFloor (ID INTEGER PRIMARY KEY ASC,No_ INTEGER,Name TEXT,StdFlrID INTEGER REFERENCES tblStdFlr(ID) ON UPDATE CASCADE ON DELETE CASCADE ,LevelB REAL,Height REAL) //1行,n列 CString sValue,sName,sType; int j = 0,nPos1 = 0,nPos2 = 0; CUIITableField field; //for (int j = 0;j < nRow;j++) { for (int i = 0;i < nCol;i++) { /* offset to access column C of row R of **result */ //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; if (nRow > 0 ) { int nOffset = ((j + 1) * nCol) + i; sValue = pazResult[nOffset]; sValue.MakeLower(); if (sValue.Find(_T("create table")) != -1) { int nPos1 = sValue.Find(_T('(') ); if (nPos1 != -1) { //() sSQL = sValue.Mid(nPos1); sSQL.TrimLeft(_T('(')); sSQL.TrimRight(_T(')')); CStringArray arSegs; ParaseString(sSQL,arSegs,_T(',')); for (int n = 0;n < arSegs.GetSize();n++) { sValue = arSegs.GetAt(n); sValue.TrimRight(); sValue.TrimLeft(); //ID INTEGER PRIMARY KEY ASC nPos1 = sValue.Find(_T(' ')); nPos2 = sValue.Find(_T(' '),nPos1 + 2); if (nPos1 != -1) { sName = sValue.Mid(0,nPos1); sName.TrimLeft(_T('[')); sName.TrimRight(_T(']')); listField.AddTail(sName); } } } break; } } } } if (pazResult != NULL) sqlite3_free_table(pazResult); return listField.GetCount() > 0 ? TRUE : FALSE; } BOOL CUIIImpSQLiteServer::DeleteTable(LPCTSTR pszTableName) { if (m_pSQLiteDb != NULL) { CString strSQL; strSQL.Format(_T("DROP TABLE [%s]"),pszTableName); ExecuteSQL(strSQL); return TRUE; } return FALSE; } BOOL CUIIImpSQLiteServer::DeleteTable(CStringArray& arTableNames) { for (int i = 0;i < arTableNames.GetSize();i++) { DeleteTable(arTableNames.GetAt(i)); } return TRUE; } BOOL CUIIImpSQLiteServer::DeleteTableFields(LPCTSTR pszTableName,CStringArray& arFields) { BOOL bSuccess = FALSE; for (int i = 0;i < arFields.GetSize();i++) { bSuccess = DeleteTableFields(pszTableName,arFields.GetAt(i)); } return bSuccess; } BOOL CUIIImpSQLiteServer::DeleteTableFields(LPCTSTR pszTableName,LPCTSTR pszFields) { return FALSE; /* sqlite 不支持直接删除表中字段 if (pszTableName == NULL || pszFields == NULL ) return FALSE; CString strSQL; strSQL.Format(_T("ALTER TABLE [%s] DROP COLUMN [%s]"),pszTableName,pszFields); ExecuteSQL(strSQL); return FALSE;*/ } BOOL CUIIImpSQLiteServer::AppendTableFields(LPCTSTR pszTableName,Ttable& arFields) { if (pszTableName == NULL) return FALSE; int nSize = (int)arFields.GetSize(); int i,bSuccess = 0; for(i = 0;i 0) { if (pVal->IsEmpty()) *pVal = pColVals[0]; } return 0; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CString& sValue) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char *psSQL = (char *)bst; sValue.Empty(); CString *pValue = &sValue; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData1, (void *)pValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } return TRUE; /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { // offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; if (nRow > 0 ) { int nOffset = ((0 + 1) * nCol) + 0; sValue = pazResult[nOffset]; sqlite3_free_table(pazResult); return TRUE; } } return FALSE;*/ } static int CallbackGetSelData2(void *data, int nColcount, char **pColVals, char **pColNames) { CStringArray *pArVal = (CStringArray *)data; for (int i = 0;i < nColcount;i++) { pArVal->Add(pColVals[i]); } return 0; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char *psSQL = (char *)bst; CStringArray *pArValue = &arStrValue; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData2, (void *)pArValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } return TRUE; /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { if (nRow > 0) { //offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; int nOffset = 0; for (int i = 0;i < nRow;i++) { for (int j = 0;j < nCol;j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; arStrValue.Add(sValue); } } sqlite3_free_table(pazResult); return (int)arStrValue.GetSize(); } } return FALSE; */ } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue,int nFr, int nTo) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char *psSQL = (char *)bst; CStringArray arVals; CStringArray *pArValue = &arVals; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData2, (void *)pArValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } if (nFr < arVals.GetSize() && nFr > -1 && nTo < arVals.GetSize() && nTo > -1) { for (int i = nFr;i <= nTo;i++) { arStrValue.Add(arVals.GetAt(i)); } } return arStrValue.GetSize(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { //offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; int nOffset = 0; for (int i = nFr;i < nRow && i <= nTo;i++) { //if (i >= nFr && i <= nTo) //{ for (int j = 0;j < nCol;j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; arStrValue.Add(sValue); } //} } sqlite3_free_table(pazResult); return (int)arStrValue.GetSize(); } return FALSE;*/ } static int CallbackGetSelData3(void *data, int nColcount, char **pColVals, char **pColNames) { std::vector *pArVal = (std::vector *)data; for (int i = 0; i < nColcount; i++) { pArVal->push_back(pColVals[i]); } return 0; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL, std::vector& arStrValue) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char *psSQL = (char *)bst; std::vector *pArValue = &arStrValue; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData3, (void *)pArValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } return arStrValue.size(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0, nCol = 0; sqlite3_get_table((sqlite3*)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0); if (pazResult != NULL) { if (nRow > 0) { //offset to access column C of row R of **result// //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; int nOffset = 0; for (int i = 0; i < nRow; i++) { for (int j = 0; j < nCol; j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; arStrValue.push_back(sValue); } } sqlite3_free_table(pazResult); return (int)arStrValue.size(); } } return FALSE; */ } BOOL CUIIImpSQLiteServer::IsSelEmpty(LPCTSTR pszStrSQL) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow > 0) //第0行为列名 { sqlite3_free_table(pazResult); return FALSE; } if (pazResult != NULL) sqlite3_free_table(pazResult); return TRUE; } typedef struct listStrValbMakeLower { CStringList *plistStrValue; BOOL bMakeLower; }LISTSTRVALBMAKELOWER; static int CallbackGetSelData4(void *data, int nColcount, char **pColVals, char **pColNames) { listStrValbMakeLower* pLstMk = (listStrValbMakeLower *)data; CString sVal; for (int i = 0; i < nColcount; i++) { sVal = pColVals[i]; if (pLstMk->bMakeLower) sVal.MakeLower(); pLstMk->plistStrValue->AddTail(sVal); } return 0; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue,BOOL bMakeLower) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char *psSQL = (char *)bst; listStrValbMakeLower lstMk; lstMk.plistStrValue = &listStrValue; lstMk.bMakeLower = bMakeLower; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData4, (void *)&lstMk, NULL); if (nRc != SQLITE_OK) { return FALSE; } return listStrValue.GetCount(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { //offset to access column C of row R of **result/ //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; int nOffset = 0; for (int i = 0;i < nRow;i++) { for (int j = 0;j < nCol;j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; if (bMakeLower) sValue.MakeLower(); listStrValue.AddTail(sValue); } } sqlite3_free_table(pazResult); return (int)listStrValue.GetCount(); } return FALSE; */ } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue, int nFr, int nTo, BOOL bMakeLower) { CStringArray arStrValue; GetSelData(pszStrSQL, arStrValue, nFr, nTo); if (nFr > -1 && nTo > -1 && nTo < arStrValue.GetSize()) { CString sVal; for (int i = nFr; i <= nTo; i++) { sVal = arStrValue.GetAt(i); listStrValue.AddTail(bMakeLower ? sVal.MakeLower() : sVal); } } return listStrValue.GetCount(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { // offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; int nOffset = 0; for (int i = nFr;i < nRow && i <= nTo;i++) { //if (i >= nFr && i <= nTo) //{ for (int j = 0;j < nCol;j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; if (bMakeLower) sValue.MakeLower(); listStrValue.AddTail(sValue); } //} } sqlite3_free_table(pazResult); return (int)listStrValue.GetCount(); } return FALSE; */ } typedef struct GetSelDataParaTbl { CUIIValueTable* pvalueTable; BOOL bUpdateLable; }GETSELDATAPARATBL; static int CallbackGetSelData(void* data,int nColcount,char** pColVals,char** pColNames) { CStringArray arValues,arColNames; GetSelDataParaTbl* pGetSelData = (GetSelDataParaTbl*)data; if (pGetSelData->bUpdateLable) { for(int i = 0;i < nColcount;i++) { arColNames.Add(pColNames[i]); } pGetSelData->pvalueTable->SetLableRecord(arColNames); pGetSelData->bUpdateLable = FALSE;//只更新一次 } arValues.RemoveAll(); for(int i = 0;i < nColcount;i++) { arValues.Add(pColVals[i]); } pGetSelData->pvalueTable->AddValueRecord(arValues); return 0; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable,BOOL bUpdateLable) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; GetSelDataParaTbl par; par.pvalueTable = &valueTable; par.bUpdateLable = bUpdateLable; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb,psSQL,CallbackGetSelData,(void*)&par,NULL); if (nRc != SQLITE_OK) { return FALSE; } return valueTable.GetTableLogicSize(); } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable, int nFr, int nTo, BOOL bUpdateLable) { GetSelData(pszStrSQL, valueTable, bUpdateLable); for (int i = nTo+1;i < valueTable.GetTableLogicSize();i++) { valueTable.RemoveRecordByIndex(i); } for (int i = 0;i < nFr;i++) { valueTable.RemoveRecordByIndex(0); } return valueTable.GetTableLogicSize(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL) { // offset to access column C of row R of **result// //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue; CStringArray arValues; int nOffset = 0; for (int i = 0;i < nRow;i++) { //LABLE if (bUpdateLable && i == 0) { for (int j = 0;j < nCol;j++) { sValue = pazResult[j]; arValues.Add(sValue); } valueTable.SetLableRecord(arValues); } //VALUES arValues.RemoveAll(); if (i >= nFr && i <= nTo) { for (int j = 0;j < nCol;j++) { nOffset = ((i + 1) * nCol) + j; sValue = pazResult[nOffset]; arValues.Add(sValue); } valueTable.AddValueRecord(arValues); } } sqlite3_free_table(pazResult); return valueTable.GetTableLogicSize(); } return FALSE; */ } //选取两列,一个为Key,一个为Value建map int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszSKey_ValueSQL,CMapStringToString& mapKey_Value) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSKey_ValueSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nCol >= 2) { //offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue,sKey; CStringArray arValues; int nOffset = 0; for (int i = 0;i < nRow;i++) { sKey = pazResult[((i + 1) * nCol) + 0]; sValue = pazResult[((i + 1) * nCol) + 1]; mapKey_Value.SetAt(sKey,sValue); } sqlite3_free_table(pazResult); return (int)mapKey_Value.GetCount(); } return FALSE; } int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszSKey_ValueSQL, std::map& mapKey_Value) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSKey_ValueSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0, nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0); if (pazResult != NULL && nCol >= 2) { // offset to access column C of row R of **result// //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue, sKey; CStringArray arValues; int nOffset = 0; for (int i = 0; i < nRow; i++) { sKey = pazResult[((i + 1) * nCol) + 0]; sValue = pazResult[((i + 1) * nCol) + 1]; mapKey_Value.insert(std::make_pair(sKey, sValue)); } sqlite3_free_table(pazResult); return (int)mapKey_Value.size(); } return FALSE; } static int CallbackGetSelData5(void *data, int nColcount, char **pColVals, char **pColNames) { CStringArray arValues, arColNames; CMapStringToString *pMapKey_Value = (CMapStringToString *)data; CString sKey, sVal; for (int i = 0; i < nColcount; i++) { sKey = pColNames[i]; sVal = pColVals[i]; pMapKey_Value->SetAt(sKey, sVal); } return 0; } //选取一行,获得Field到对应数据的映射 int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL,CMapStringToString& mapFieldToValue) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSelectSQL); char *psSQL = (char *)bst; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData5, (void *)&mapFieldToValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } return mapFieldToValue.GetCount(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSelectSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow > 0 && nCol > 0) { // offset to access column C of row R of **result //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue,sKey; // 第0行为字段数据 // 第1行开始,为表内数据 int nOffset = 0; for (int j = 0;j < nCol;j++) { nOffset = (0 * nCol) + j; sKey = pazResult[nOffset]; nOffset = (1 * nCol) + j; sValue = pazResult[nOffset]; mapFieldToValue.SetAt(sKey, sValue); } sqlite3_free_table(pazResult); return (int)mapFieldToValue.GetCount(); } return FALSE; */ } static int CallbackGetSelData6(void *data, int nColcount, char **pColVals, char **pColNames) { CStringArray arValues, arColNames; std::map *pMapKey_Value = (std::map *)data; CString sKey, sVal; for (int i = 0; i < nColcount; i++) { sKey = pColNames[i]; sVal = pColVals[i]; pMapKey_Value->insert(std::make_pair(sKey, sVal)); } return 0; } //选取一行,获得Field到对应数据的映射 int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::map& mapFieldToValue) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSelectSQL); char *psSQL = (char *)bst; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData6, (void *)&mapFieldToValue, NULL); if (nRc != SQLITE_OK) { return FALSE; } return mapFieldToValue.size(); /*OLD if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSelectSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0, nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0); if (pazResult != NULL && nRow > 0 && nCol > 0) { // offset to access column C of row R of **result// //int offset = ((R + 1) * numCol) + C; //char *value = result[offset]; CString sValue, sKey; // 第0行为字段数据 // 第1行开始,为表内数据 int nOffset = 0; for (int j = 0; j < nCol; j++) { nOffset = (0 * nCol) + j; sKey = pazResult[nOffset]; nOffset = (1 * nCol) + j; sValue = pazResult[nOffset]; mapFieldToValue.insert(std::make_pair(sKey, sValue)); } sqlite3_free_table(pazResult); return (int)mapFieldToValue.size(); } return FALSE; */ } static int CallbackGetSelData7(void *data, int nColcount, char **pColVals, char **pColNames) { std::vector> *pOut = (std::vector> *)data; std::vector ss; CString sKey, sVal; for (int i = 0; i < nColcount; i++) { sKey = pColNames[i]; sVal = pColVals[i]; ss.push_back(sVal); } pOut->push_back(ss); return 0; } int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::vector>& datas) { if (m_pSQLiteDb == NULL) return FALSE; datas.clear(); _bstr_t bst(pszSelectSQL); char* psSQL = (char*)bst; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData7, (void *)&datas, NULL); if (nRc != SQLITE_OK) return FALSE; return (int)datas.size(); } static int CallbackGetSelData8(void *data, int nColcount, char **pColVals, char **pColNames) { std::vector> *pOut = (std::vector> *)data; std::map ss; CString sKey, sVal; for (int i = 0; i < nColcount; i++) { sKey = pColNames[i]; sVal = pColVals[i]; ss.insert(std::make_pair(sKey, sVal)); } pOut->push_back(ss); return 0; } int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::vector> &datas) { if (m_pSQLiteDb == NULL) return FALSE; datas.clear(); _bstr_t bst(pszSelectSQL); char *psSQL = (char *)bst; int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData8, (void *)&datas, NULL); if (nRc != SQLITE_OK) return FALSE; return (int)datas.size(); } //blob 操作 //insert into table (id,name,picture) values (0,'namestr',?) //table 对应 id,name 的数据 int CUIIImpSQLiteServer::InsertBlob(LPCTSTR pszSQL,void* pData,int nSize) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSQL); char* psSQL = (char*)bst; sqlite3_stmt* pstat = NULL; const char* pzTail = NULL; int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail); if (!nResult && pstat) { //和 SQL 的第 1 个?绑定( 如果有多个 ? ,需要分开绑定 int nResult1 = sqlite3_bind_blob(pstat,1,pData,nSize,NULL); //将数据输入数据库 int nResult2 = sqlite3_step(pstat); int nResult3 = sqlite3_reset( pstat ); sqlite3_clear_bindings( pstat ); return nResult1 == 0 ? 1 : 0; } return 0; } int CUIIImpSQLiteServer::InsertBlob(LPCTSTR pszSQL,LPCTSTR pszFile) { _bstr_t bst(pszFile); char* psFile = (char*)bst; FILE* pFile = NULL; #if ARX==16 pFile = fopen(psFile,"rb"); #else fopen_s(&pFile,psFile,"rb"); #endif byte* pData = NULL; long l_file_size = 0; if (pFile) { fseek(pFile,0,SEEK_END); l_file_size = ftell(pFile); fseek(pFile,0,SEEK_SET); pData = new byte[l_file_size]; fread(pData,1,l_file_size,pFile); fclose(pFile); int nResult = 0; #ifdef ZIP_DATA //压缩 uLong ldestLen = compressBound(l_file_size); byte* pDest = new byte[ldestLen + sizeof(l_file_size)]; compress(pDest,&ldestLen,pData,l_file_size); byte* pOffSize = pDest + ldestLen; memcpy(pOffSize,&l_file_size,sizeof(l_file_size)); nResult = InsertBlob(pszSQL,pDest,(int)(ldestLen + sizeof(l_file_size) ) ); delete [] pDest; #else nResult = InsertBlob(pszSQL,pData,(int)(l_file_size ) ); #endif delete [] pData; return nResult; } return 0; } //update table set id=,name='namestr',picture=? where ... int CUIIImpSQLiteServer::UpdateBlob(LPCTSTR pszSQL,void* pData,int nSize) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSQL); char* psSQL = (char*)bst; sqlite3_stmt* pstat = NULL; const char* pzTail = NULL; int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail); if (!nResult && pstat) { //和 SQL 的第 1 个?绑定( 如果有多个 ? ,需要分开绑定 nResult = sqlite3_bind_blob(pstat,1,pData,nSize,NULL); //将数据输入数据库 nResult = sqlite3_step(pstat); sqlite3_reset(pstat); sqlite3_clear_bindings( pstat ); return 1; } return 0; } int CUIIImpSQLiteServer::UpdateBlob(LPCTSTR pszSQL,LPCTSTR pszFile) { _bstr_t bst(pszFile); char* psFile = (char*)bst; FILE* pFile = NULL; #if ARX==16 pFile = fopen(psFile,"rb"); #else fopen_s(&pFile,psFile,"rb"); #endif byte* pData = NULL; long l_file_size = 0; if (pFile) { fseek(pFile,0,SEEK_END); l_file_size = ftell(pFile); fseek(pFile,0,SEEK_SET); pData = new byte[l_file_size]; fread(pData,1,l_file_size,pFile); fclose(pFile); int nResult = 0; #ifdef ZIP_DATA //压缩 uLong ldestLen = compressBound(l_file_size); byte* pDest = new byte[ldestLen + sizeof(l_file_size) ]; compress(pDest,&ldestLen,pData,l_file_size); byte* pOffSize = pDest + ldestLen; memcpy(pOffSize,&l_file_size,sizeof(l_file_size)); nResult = UpdateBlob(pszSQL,pDest,(int)(ldestLen + sizeof(l_file_size) ) ); delete [] pDest; #else nResult = UpdateBlob(pszSQL,pData,(int)( l_file_size ) ); #endif delete [] pData; return nResult; } return 0; } //select picture from table where id=... int CUIIImpSQLiteServer::GetSelBlob(LPCTSTR pszSQL,void*& pData,int& nSize) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSQL); char* psSQL = (char*)bst; sqlite3_stmt* pstat = NULL; const char* pzTail = NULL; int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail); int nCol = sqlite3_column_count(pstat); int colType = 0; nResult = sqlite3_step(pstat); if (nResult == SQLITE_ROW) { for(int k = 0;k < nCol;k++) { colType = sqlite3_column_type(pstat,k); if (colType == 4) { const void* pData1 = sqlite3_column_blob(pstat, k); nSize = sqlite3_column_bytes(pstat,k); pData = new byte[nSize]; memcpy(pData,pData1,nSize); BOOL bRes = FALSE; #ifdef ZIP_DATA int l_file_size = nSize; uLongf udestLen = nSize; byte* pBuffer = pData; byte* pOff = (byte*)pBuffer; pOff += ( lDataSize - sizeof(long) ); l_file_size = *((long*)pOff); //解压缩 byte* pDest = new byte[l_file_size + 512];//放大512 udestLen = l_file_size + 512; if ( Z_OK == uncompress(pDest,&udestLen,(byte*)pBuffer,lDataSize - sizeof(long) ) ) { delete [] pData; pData = new byte[udestLen]; nSize = udestLen; memcpy(pData,pDest,udestLen); delete [] pDest; } #endif sqlite3_finalize( pstat ); return nSize > 0 ? 1 : 0; } } } sqlite3_finalize( pstat ); return 0; } int CUIIImpSQLiteServer::GetSelBlob(LPCTSTR pszSQL,LPCTSTR pszFilePath) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszSQL); char* psSQL = (char*)bst; void* pData = NULL; int nSize = 0; if ( GetSelBlob(pszSQL,pData,nSize) ) { _bstr_t bst2(pszFilePath); char* psFile = (char*)bst2; FILE *file = NULL; #if ARX==16 file = fopen(psFile,"wb"); #else errno_t er = fopen_s(&file,psFile,"wb"); #endif if (file) { fwrite(pData, 1, nSize, file); fclose(file); delete [] (byte*)pData; return 1; } } return 0; } void CUIIImpSQLiteServer::GetDbTableNameArray(CStringArray& arTables) { CString sSQL; sSQL = _T("select name from sqlite_master where type='table'"); _bstr_t bst(sSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow == 0)//说明没有 { return; } CString sName; int nOffset = 0; for (int i = 0;i < nRow;i++) { nOffset = i + 1; sName = pazResult[nOffset]; if (sName.CompareNoCase(_T("sqlite_sequence")) != 0)//内部表不加入 arTables.Add(sName); } if (pazResult != NULL) sqlite3_free_table(pazResult); } void CUIIImpSQLiteServer::GetDBTableNameList(CStringList& listTables) { CString sSQL; sSQL = _T("select name from sqlite_master where type='table'"); _bstr_t bst(sSQL); char* psSQL = (char*)bst; char** pazResult = NULL; int nRow = 0,nCol = 0; sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0); if (pazResult != NULL && nRow == 0)//说明没有 { return; } CString sName; int nOffset = 0; for (int i = 0;i < nRow;i++) { nOffset = i + 1; sName = pazResult[nOffset]; listTables.AddTail(sName); } if (pazResult != NULL) sqlite3_free_table(pazResult); } BOOL CUIIImpSQLiteServer::ExecuteSQL(LPCTSTR pszStrSQL) { if (m_pSQLiteDb == NULL) return FALSE; _bstr_t bst(pszStrSQL); char* pszSql = (char*)bst; int nRes = sqlite3_exec((sqlite3 *)m_pSQLiteDb,pszSql,NULL,NULL,NULL); if (nRes != SQLITE_OK) { if (nRes == SQLITE_LOCKED || nRes == SQLITE_BUSY) { } return FALSE; } return TRUE; } BOOL CUIIImpSQLiteServer::IsDatabaseOpen() { return (m_pSQLiteDb != NULL) ? TRUE : FALSE; } void CUIIImpSQLiteServer::BeginTrans() { if (m_pSQLiteDb != NULL) { sqlite3_exec((sqlite3 *)m_pSQLiteDb, "begin;", 0, 0, 0); // 开启事务 } } void CUIIImpSQLiteServer::RollbackTrans() { if (m_pSQLiteDb != NULL) { sqlite3_exec((sqlite3 *)m_pSQLiteDb, "rollback;", 0, 0, 0);// 回滚事务 } } void CUIIImpSQLiteServer::CommitTrans() { if (m_pSQLiteDb != NULL) { sqlite3_exec((sqlite3 *)m_pSQLiteDb, "commit;", 0, 0, 0); // 提交事务 } }