kk_lee69 发表于 2016-6-23 21:52:45

回复 16# mikezunya

我沒用過 SQLLITE只是看到 說明內定是 UTF-8 那就表示 內定是採UNZICODE 方式
如果無法改ANSI

那我就更肯定 存在資料庫上的東西與 UNCODE 或者 ANSI 無關才對.......

話說回來方便提供 資料庫與 你的程式與法 我測試看看嗎??

mikezunya 发表于 2016-6-23 22:39:11

本帖最后由 mikezunya 于 2016-6-24 13:36 编辑

回复 17# kk_lee69



这是数据库与源码,解压密码我私聊发给你了

kk_lee69 发表于 2016-6-24 01:39:40

本帖最后由 kk_lee69 于 2016-6-24 09:53 编辑

回复 18# mikezunya

問題解決了幫你測試出來了

注意聽好了 要改寫SQLITE 的UDF

因為原本的 _SQLite_Exec 會將你輸入的SQL語法轉成 UTF-8因此 不能用這個
需要自己建立一個 _SQLite_Exec2然後將裡面 轉換成 UTF-8 的語法 改成 另外一個函數

建立一個 __SQLite_StringToUtf8Struct2由 _SQLite_Exec2   呼叫這個

然後再將   __SQLite_StringToUtf8Struct2   裡面的 65001 改成 936

然後就可以成功了~~~ 細節我沒測試   你在 自行修改與測試方向應該沒錯

附上幾段我改的地方

                _SQLite_Exec2($barserverdb, "INSERT INTO tbl_ProcessDenySecurity (Name,Desc,MD5,Size,Type) VALUES ('" & $linshi2 & "','" & $linshi2 & "','" & $linshi2 & "','2048','16');")
                                        GUICtrlCreateListViewItem($linshi2 & "|" & $linshi2 & "|" & $linshi2, $ListView1)
                                        If @error Then
                                                MsgBox(48, "", "數據庫寫入失敗,原因" & @error)
                                                Exit
                                        EndIf

Func _SQLite_Exec2($hDB, $sSQL, $sCallBack = "")
        If __SQLite_hChk($hDB, 2) Then Return SetError(@error, 0, $SQLITE_MISUSE)
        If $sCallBack <> "" Then
                Local $iRows, $iColumns
                Local $aResult = "SQLITE_CALLBACK:" & $sCallBack
                Local $iRval = _SQLite_GetTable2d($hDB, $sSQL, $aResult, $iRows, $iColumns)
                If @error Then Return SetError(3, @error, $iRval)
                Return $iRval
        EndIf
        Local $tSQL8 = __SQLite_StringToUtf8Struct2($sSQL)
    If @error Then Return SetError(4, @error, 0)
        Local $avRval = DllCall($g_hDll_SQLite, "int:cdecl", "sqlite3_exec", _
                        "ptr", $hDB, _ ; An open database
                        "ptr", DllStructGetPtr($tSQL8), _ ; SQL to be executed
                        "ptr", 0, _ ; Callback function
                        "ptr", 0, _ ; 1st argument to callback function
                        "long*", 0) ; Error msg written here
        If @error Then Return SetError(1, @error, $SQLITE_MISUSE) ; Dllcall error
        __SQLite_szFree($avRval)        ; free error message
        If $avRval <> $SQLITE_OK Then
                __SQLite_ReportError($hDB, "_SQLite_Exec", $sSQL)
                SetError(-1)
        EndIf
        Return $avRval
EndFunc   ;==>_SQLite_Exec


; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __SQLite_StringToUtf8Struct
; Description ...: UTF-16 to UTF-8 (as struct) conversion
; Syntax.........: __SQLite_StringToUtf8Struct($sString)
; Parameters ....: $sString   - String to be converted
; Return values .: Success      - Utf8 structure
;                  Failure      - Set @error
; Author ........: jchd
; Modified.......: jpm
; ===============================================================================================================================
Func __SQLite_StringToUtf8Struct2($sString)
        Local $aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 54936, "dword", 0, "wstr", $sString, "int", -1, _
                                                                "ptr", 0, "int", 0, "ptr", 0, "ptr", 0)
        If @error Then Return SetError(1, @error, "") ; Dllcall error
        Local $tText = DllStructCreate("char[" & $aResult & "]")
        $aResult = DllCall("Kernel32.dll", "int", "WideCharToMultiByte", "uint", 54936, "dword", 0, "wstr", $sString, "int", -1, _
                                                        "ptr", DllStructGetPtr($tText), "int", $aResult, "ptr", 0, "ptr", 0)
        If @error Then Return SetError(2, @error, "") ; Dllcall error
        Return $tText
EndFunc   ;==>__SQLite_StringToUtf8Struct

附上 我編譯的程式你可以測試看看寫入後 會有錯誤訊息我沒時間找問題在哪
因為 我的是繁體測試 還得找 簡體系統 很麻煩
但是字的編碼問題應該解決了細節 可能您要研究看看

kk_lee69 发表于 2016-6-24 01:58:01

回复 18# mikezunya

剛剛再仔細的分析一下   資料其實不太一樣但是我覺得應該是 用936 的號碼不對

kk_lee69 发表于 2016-6-24 02:00:21

回复 18# mikezunya


   參考一下這個網頁

https://msdn.microsoft.com/zh-tw/library/windows/desktop/dd317756(v=vs.85).aspx

kk_lee69 发表于 2016-6-24 02:33:18

回复 19# kk_lee69

找到正確編碼了 54936

GB18030 Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030)

kk_lee69 发表于 2016-6-24 12:02:42

回复 19# kk_lee69


無法解決你的問題嗎我認為應該是可以解決才是??

mikezunya 发表于 2016-6-24 13:26:19

本帖最后由 mikezunya 于 2016-6-24 13:29 编辑

回复 23# kk_lee69


    可以解决,非常感谢。但是程序会有报错,我想应该问题不大,我正在看你写的那个代码的意思。{:face (88):}
页: 1 [2]
查看完整版本: 请教一个数据编码转换问题[已解决]