|

楼主 |
发表于 2014-11-27 18:44:24
|
显示全部楼层
本帖最后由 19900603 于 2014-11-27 18:45 编辑
增加了
Rem 备份数据库 table 为main 时 备份整个数据库
sqlite_BackUp_To_File
Rem 从物理文件拷贝一个表 CopyData 是否拷贝数据
sqlite_CopyTable_From_File
hSQLite 模块
测试代码- Private Sub Command2_Click()
- Dim db As Long
- Dim ret As Long
- Dim hstmt As Long
- Dim pReturn As Long
- rem 创建内存数据库(处理速度比物理数据库快很多)
- Call sqlite_open(":memory:", db)
-
- MsgBox sqlite_CopyTable_From_File(db, "Role.SQLite", "Role")
- Dim Script As String
- rem 查询记录
- Script = "select count(*) from Role"
- pReturn = sqlite_prepare(db, Script, hstmt)
- If pReturn = SQLITE_OK And sqlite_next(hstmt) Then
- MsgBox sqlite_column_int(hstmt, 0)
- sqlite_step hstmt
- sqlite_finalize hstmt
- End If
- Rem 保存内存数据库到文件
- MsgBox sqlite_BackUp_To_File(db, "Bak.Sqlite")
- sqlite_close db
- End Sub
复制代码- Option Explicit
-
- Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
- Public Declare Sub sqlite_free_table Lib "SQLite" (ByVal ResultPtr As String)
- Public Declare Sub sqlite_initialize Lib "SQLite" ()
- Public Declare Sub sqlite_interrupt Lib "SQLite" (ByVal hdb As Long)
- Public Declare Sub sqlite_free Lib "SQLite" (ptr As Any)
- Public Declare Function sqlite_open Lib "SQLite" (ByVal pwsFileName As String, ByRef hdb As Long) As Long ' PtrDb
- Public Declare Function sqlite_close Lib "SQLite" (ByVal hdb As Long) As Long
- Public Declare Function sqlite_finalize Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_prepare Lib "SQLite" (ByVal hdb As Long, ByVal pwsSql As String, ByRef hstmt As Long) As Long
- Public Declare Function sqlite_sleep Lib "SQLite" (ByVal Times As Long) As Long
- Public Declare Function sqlite_column_int Lib "SQLite" (ByVal hstmt As Long, ByVal iCol As Long) As Long
- Public Declare Function sqlite_column_ptext Lib "SQLite" Alias "sqlite_column_text" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_step Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_exec Lib "SQLite" (ByVal hdb As Long, ByVal pwsSql As String) As Long
- Public Declare Function sqlite_get_table Lib "SQLite" (ByVal db As Long, ByVal zSql As String, ByRef pazResult As String, ByRef pnRow As Long, ByRef pnColumn As Long) As Long
- Public Declare Function sqlite_limit Lib "SQLite" (ByVal db As Long, ByVal Id As Long, ByVal NewVal As Long) As Long
- Public Declare Function sqlite_libversion Lib "SQLite" () As Long
- Public Declare Function sqlite_libversion_number Lib "SQLite" () As Long
- Public Declare Function sqlite_reset Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_errcode Lib "SQLite" (ByVal db As Long) As Long
- Public Declare Function sqlite_changes Lib "SQLite" (ByVal db As Long) As Long
- Public Declare Function sqlite_total_changes Lib "SQLite" (ByVal db As Long) As Long
- Public Declare Function sqlite_malloc Lib "SQLite" (ByVal nByte As Long) As Long
- Public Declare Function sqlite_errmsgchar Lib "SQLite" Alias "sqlite_errmsg" (ByVal db As Long) As Long '字符串指针
- Public Declare Function sqlite_column_database_pname Lib "SQLite" Alias "sqlite_column_database_name" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_column_table_pname Lib "SQLite" Alias "sqlite_column_table_name" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_column_origin_pname Lib "SQLite" Alias "sqlite_column_origin_name" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_column_declptype Lib "SQLite" Alias "sqlite_column_decltype" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_data_count Lib "SQLite" (ByVal hstmt As Long) As Long
- Rem 判断语句是否以分号结尾
- Public Declare Function sqlite_complete Lib "SQLite" (ByVal zSql As String) As Long
- Public Declare Function sqlite_column_count Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_column_ptype Lib "SQLite" Alias "sqlite_column_type" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_column_pname Lib "SQLite" Alias "sqlite_column_name" (ByVal hstmt As Long, ByVal iCol As Long) As Long '字符串指针
- Public Declare Function sqlite_column_blob Lib "SQLite" (ByVal hstmt As Long, ByVal iCol As Long) As Long
- Public Declare Function sqlite_column_bytes Lib "SQLite" (ByVal hstmt As Long, ByVal iCol As Long) As Long
- Public Declare Function sqlite_column_double Lib "SQLite" (ByVal hstmt As Long, ByVal iCol As Long) As Double
- Public Declare Function sqlite_column_value Lib "SQLite" (ByVal hstmt As Long, ByVal iCol As Long) As Long
- Public Declare Function sqlite_bind_parameter_count Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_bind_parameter_pname Lib "SQLite" Alias "sqlite_bind_parameter_name" (ByVal hstmt As Long, ByVal paramIndex As Long) As Long '字符串指针
- Public Declare Function sqlite_bind_parameter_index Lib "SQLite" (ByVal hstmt As Long, ByVal zName As String) As Long
- Public Declare Function sqlite_bind_null Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long) As Long
- Public Declare Function sqlite_bind_blob Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long, Dataptr As Any, ByVal nByte As Long) As Long
- Public Declare Function sqlite_bind_zeroblob Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long, ByVal nByte As Long) As Long
- Public Declare Function sqlite_bind_double Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long, ByVal nByte As Double) As Long
- Public Declare Function sqlite_bind_int Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long, ByVal nByte As Long) As Long
- Public Declare Function sqlite_bind_ptext Lib "SQLite" Alias "sqlite_bind_text" (ByVal hstmt As Long, ByVal paramIndex As Long, ByVal lpStr As String) As Long
- Public Declare Function sqlite_bind_value Lib "SQLite" (ByVal hstmt As Long, ByVal paramIndex As Long, ByVal NewVal As Long) As Long
- Public Declare Function sqlite_clear_bindings Lib "SQLite" (ByVal hstmt As Long) As Long
- Public Declare Function sqlite_last_insert_rowid Lib "SQLite" (ByVal hdb As Long) As Long
- Public Declare Function sqlite_backup_init Lib "SQLite" (ByVal pDestDC As Long, ByVal zDestName As String, ByVal pSourceDC As Long, ByVal zSourceName As String) As Long
- Public Declare Function sqlite_backup_step Lib "SQLite" (ByVal pBackup As Long, ByVal nPage As Long) As Long
- Public Declare Function sqlite_backup_finish Lib "SQLite" (ByVal pBackup As Long) As Long
- Public Declare Function sqlite_backup_remaining Lib "SQLite" (ByVal pBackup As Long) As Long
- Public Declare Function sqlite_backup_pagecount Lib "SQLite" (ByVal pBackup As Long) As Long
- Public Declare Function CopyStr Lib "kernel32" Alias "lstrcpynA" (ByVal lpStringDestination As String, ByVal lpStringSource As Long, ByVal lngMaxLength As Long) As Long
- Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
- Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
- Public Declare Function lstrcpynW Lib "kernel32" (ByVal pwsDest As Long, ByVal pwsSource As Long, ByVal cchCount As Long) As Long
- Public Declare Function lstrcpyW Lib "kernel32" (ByVal pwsDest As Long, ByVal pwsSource As Long) As Long
- Public Declare Function lstrlenW Lib "kernel32" (ByVal pwsString As Long) As Long
- Private Const CP_UTF8 As Long = 65001
- Enum SQLITE_RETURN
- SQLITE_OK = 0
- SQLITE_ERROR = 1
- SQLITE_INTERNAL = 2
- SQLITE_PERM = 3
- SQLITE_ABORT = 4
- SQLITE_BUSY = 5
- SQLITE_LOCKED = 6
- SQLITE_NOMEM = 7
- SQLITE_READONLY = 8 ' Attempt to write a readonly database
- sqlite_interruptD = 9 ' Operation terminated by sqlite3_interrupt()
- SQLITE_IOERR = 10 ' Some kind of disk I/O error occurred
- SQLITE_CORRUPT = 11 ' The database disk image is malformed
- SQLITE_NOTFOUND = 12 ' (Internal Only) Table or record not found
- SQLITE_FULL = 13 ' Insertion failed because database is full
- SQLITE_CANTOPEN = 14 ' Unable to open the database file
- SQLITE_PROTOCOL = 15 ' Database lock protocol error
- SQLITE_EMPTY = 16 ' Database is empty
- SQLITE_SCHEMA = 17 ' The database schema changed
- SQLITE_TOOBIG = 18 ' Too much data for one row of a table
- SQLITE_CONSTRAINT = 19 ' Abort due to contraint violation
- SQLITE_MISMATCH = 20 ' Data type mismatch
- SQLITE_MISUSE = 21 ' Library used incorrectly
- SQLITE_NOLFS = 22 ' Uses OS features not supported on host
- SQLITE_AUTH = 23 ' Authorization denied
- SQLITE_FORMAT = 24 ' Auxiliary database format error
- SQLITE_RANGE = 25 ' 2nd parameter to sqlite3_bind out of range
- SQLITE_NOTADB = 26 ' File opened that is not a database file
- SQLITE_ROW = 100 ' sqlite3_step() has another row ready
- SQLITE_DONE = 101 ' sqlite3_step() has finished executing
- End Enum
- Public Const SQLITE_TRANSIENT As Long = 0
- Public Function UTF8StringFromPtr(ByVal pUtf8String As Long) As String
- Dim cSize As Long
- UTF8StringFromPtr = ""
- cSize = MultiByteToWideChar(CP_UTF8, 0, pUtf8String, -1, 0, 0)
- If cSize > 1 Then
- UTF8StringFromPtr = Space(cSize - 1) 'String(cSize - 1, " ")
- MultiByteToWideChar CP_UTF8, 0, pUtf8String, -1, StrPtr(UTF8StringFromPtr), cSize
- End If
- End Function
-
- Public Function sqlite_bind_text(hstmt As Long, iCol As Long, lpStr As String) As Long
- sqlite_bind_text = sqlite_bind_ptext(hstmt, iCol, StrConv(lpStr, vbUnicode))
- End Function
-
- Private Function BytesFromPtr(ByVal lAddr As Long, ByVal lSize As Long) As Byte()
- ReDim bvData(lSize - 1) As Byte
- CopyMemory bvData(0), ByVal lAddr, lSize
- BytesFromPtr = bvData
- End Function
-
- Public Function SQLite_Vacuum(h_DB As Long) As Boolean
- Dim hstmt As Long, lpReturn As SQLITE_RETURN
- lpReturn = sqlite_exec(h_DB, "VACUUM")
- SQLite_Vacuum = (lpReturn = SQLITE_OK)
- End Function
-
- Public Function sqlite3_column_name(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_name(hstmt, iCol)
- sqlite3_column_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_text(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_ptext(hstmt, iCol)
- sqlite_column_text = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_database_name(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_database_pname(hstmt, iCol)
- sqlite_column_database_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_table_name(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_table_pname(hstmt, iCol)
- sqlite_column_table_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_origin_name(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_origin_pname(hstmt, iCol)
- sqlite_column_origin_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_decltype(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_declptype(hstmt, iCol)
- sqlite_column_decltype = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_errmsg(hdb As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_errmsgchar(hdb)
- sqlite_errmsg = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_type(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_ptype(hstmt, iCol)
- sqlite_column_type = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_column_name(hstmt As Long, iCol As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_column_pname(hstmt, iCol)
- sqlite_column_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Public Function sqlite_bind_parameter_name(hstmt As Long, paramIndex As Long) As String
- Dim lpReturn As Long
- lpReturn = sqlite_bind_parameter_pname(hstmt, paramIndex)
- sqlite_bind_parameter_name = UTF8StringFromPtr(lpReturn)
- End Function
-
- Rem 是否跳转到下一条记录
- Public Function sqlite_next(hstmt As Long) As Boolean
- sqlite_next = (sqlite_step(hstmt) = SQLITE_ROW)
- End Function
-
- Rem 备份数据库 table 为main 时 备份整个数据库
- Public Function sqlite_BackUp_To_File(hdb As Long, FileName As String, Optional table As String = "main") As Boolean
- Dim db As Long
- Dim backup As Long
- Call sqlite_open(FileName, db)
- backup = sqlite_backup_init(db, table, hdb, table)
- If backup Then
- sqlite_backup_step backup, -1
- sqlite_backup_finish backup
- sqlite_BackUp_To_File = True
- End If
- sqlite_close db
- End Function
-
- Rem 从物理文件拷贝一个表 CopyData 是否拷贝数据
- Public Function sqlite_CopyTable_From_File(db As Long, FileName As String, table As String, Optional CopyData As Boolean = True) As Boolean
- Dim pReturn As SQLITE_RETURN
- Dim Script As String
- Rem ATTACH Role.SQLite 到内存 命名为RoleDB
- pReturn = sqlite_exec(db, "ATTACH DATABASE '" & FileName & "' AS CopyDB")
- If pReturn = SQLITE_OK Then
- Rem 创建脚本
- Script = "CREATE TABLE " & table & " AS SELECT * FROM CopyDB." & table
- Rem 是否复制表内数据
- If Not CopyData Then Script = Script & " WHERE 1=0"
- Rem 执行SQL
- pReturn = sqlite_exec(db, Script)
- If pReturn = SQLITE_OK Then
- Rem 分离数据库
- pReturn = sqlite_exec(db, "DETACH DATABASE CopyDB")
- If pReturn = SQLITE_OK Then sqlite_CopyTable_From_File = True
- End If
- End If
- End Function
-
复制代码 |
|