找回密码
 加入
搜索
查看: 11632|回复: 15

[系统综合] 关于SQLite数据库操作的疑问,内有简单代码

 火.. [复制链接]
发表于 2012-9-24 20:56:19 | 显示全部楼层 |阅读模式
本帖最后由 邪恶海盗 于 2012-9-24 21:46 编辑

Case $btn5;保存至数据库        
        Global $Msg, $hQuery, $aRow
Global $Temp, $a1, $a2, $a3
        $SQLite_Data = @ScriptDir&"\SQLite\"&@YEAR&@MON&@MDAY&".db"
_SQLite_Startup () ;加载 SQLite.dll
If Not FileExists($SQLite_Data) Then
    SQLCreate()
EndIf;如果数据库不存大则创建
SQLiteInsert(_GUICtrlListView_GetItemText($list2,0,0),_GUICtrlListView_GetItemText($list2,0,1),_GUICtrlListView_GetItemText($list2,0,2))

Case $btn24;读取数据库
    SQLiteRead()
;
;---------------------------------
;
Func SQLCreate();打开或创建数据库
    _SQLite_Open ($SQLite_Data)
    _SQLite_Exec(-1, "Create Table IF NOT Exists TestTable (IDs Text PRIMARY KEY, wb Text, bs Text);")
;SQLite数据库中创建列表
_SQLite_Close ()
EndFunc

Func SQLiteInsert($a1, $a2, $a3);插入数据
    _SQLite_Open ($SQLite_Data)
_SQLite_QuerySingleRow(-1, "SELECT IDs FROM TestTable WHERE IDs = '" & $a1 & "';", $aRow)
    $Temp = $aRow[0]
If $Temp = "" Then
  _SQLite_Exec(-1, "Insert into TestTable (IDs) values ('" & $a1 & "');")
EndIf
_SQLite_Exec(-1, "UPDATE TestTable SET wb = '" & $a2 & "' WHERE IDs = '" & $a1 & "';")
    _SQLite_Exec(-1, "UPDATE TestTable SET bs = '" & $a3 & "' WHERE IDs = '" & $a1 & "';")
    
    _SQLite_Close ()
EndFunc

Func SQLiteRead();读取数据

;_GUICtrlListView_DeleteAllItems ( GUICtrlGetHandle ($list3) )
    _SQLite_Open (@ScriptDir&"\SQLite\"&GUICtrlRead($combo2));打开所选择的数据库
    _SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;",$hQuery)
While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
        _GUICtrlListView_AddItem($list3, $aRow[0])
        _GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow[0]), $aRow[1], 1)
        _GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow[0]), $aRow[2], 2)
        
    WEnd
    _SQLite_Close ()
EndFunc



大家帮我瞧瞧,我的目的是按$btn5将ListView2内的数据到数据库,然后按$btn24读取数据库数据并写入到$listView3,当按$btn5后再按$btn24正常,当单独按$btn24时程序自动退出,高淫帮我看看哪里的问题...

不懂编程,不懂数据库的菜鸟表示鸭梨山大...
发表于 2012-9-25 10:59:20 | 显示全部楼层
回复 1# 邪恶海盗

定義問題吧...

你的 $btn5 是不是定義了很多 變數
而你的 $btn24 沒有.....但是 $btn24所呼叫的函數 會使用到變數.....所以會出問題.....

最好把你的錯誤訊息帶 PO 上來....
 楼主| 发表于 2012-9-25 12:27:50 | 显示全部楼层
回复 2# kk_lee69
G:\????\???????.au3 (515) : ==> ?????????.:
_SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;",$hQuery)
_SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;",^ ERROR
发表于 2012-9-25 16:30:22 | 显示全部楼层
回复 3# 邪恶海盗


    上面的訊息  不就是告訴你....程式跑到 要帶出 $hQuery 這個變數的時候 出錯誤...

表示  $hQuery 這個變數 在那邊的時候....是無法辨識的...

你先按了$BTN5  之後 $hQuery 這個變數有被定義   如果 你直接按 $BTN24  這個 $hQuery 依照你目前提供的資料是沒有被定義的  所以當然會出錯
 楼主| 发表于 2012-9-25 16:49:29 | 显示全部楼层
本帖最后由 邪恶海盗 于 2012-9-25 16:50 编辑

回复 4# kk_lee69


    那现在如何处理????
Dim $Temp, $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10, $a11, $a12, $a13, $a14, $a15
Dim $Msg, $hQuery, $aRow
这段写到程序初始地话直接按$btn24读数据库ListView3中显示空白,按$btn5之后再按$btn24则没问题..
发表于 2012-9-25 16:52:16 | 显示全部楼层
回复 5# 邪恶海盗
那就表示 你整個邏輯是有問題的  你能告訴我 那個變數裡面 放著甚麼東西嗎??

不然你就得把所有的程式碼 貼上來
 楼主| 发表于 2012-9-25 17:22:17 | 显示全部楼层
本帖最后由 邪恶海盗 于 2012-9-25 17:28 编辑

回复 6# kk_lee69


   
#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <ListviewConstants.au3>
#Include <GuiListView.au3>
#Include <GuiImageList.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#Include <GuiButton.au3>
#include <GuiComboBox.au3>

$main=GUICreate("XX",400,200)
$btn5=GUICtrlCreateButton('保存至数据库', 18,22,100,22, $SS_center)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
$combo2=GUICtrlCreateCombo("请刷新后选择", 124, 22, 100,11)
$btn22=GUICtrlCreateButton('刷新', 235,22,60,21)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
$btn24=GUICtrlCreateButton('读取数据', 305,22,80,21)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
GUICtrlSetFont(-1, 13, 500, 0, "", 18)
$list2=GUICtrlCreateListView("33|22|11", 10, 64, 780, 200,"")
GUICtrlCreateListViewItem("xx|dd|xx",$list2)
$List3 = GUICtrlCreateListView("11111|22222|3333", 10, 104, 780, 200,"")
_GUICtrlListView_SetExtendedListViewStyle($list3, $LVS_EX_GRIDLINES)

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        ;DirRemove($Temp, 1)
                        Exit
Case $btn5;保存至数据库        
        Global $Msg, $hQuery, $aRow
Global $Temp, $a1, $a2, $a3
        $SQLite_Data = @ScriptDir&"\SQLite\"&@YEAR&@MON&@MDAY&".db"
_SQLite_Startup () ;加载 SQLite.dll
If Not FileExists($SQLite_Data) Then
    SQLCreate()
EndIf;如果数据库不存大则创建
SQLiteInsert(_GUICtrlListView_GetItemText($list2,0,0),_GUICtrlListView_GetItemText($list2,0,1),_GUICtrlListView_GetItemText($list2,0,2))
 
 Case $btn22
_searchfile(@ScriptDir&"\SQLite\*.db")

Case $btn24;读取数据库
                Global $Msg, $hQuery, $aRow
Global $Temp, $a1, $a2, $a3
    SQLiteRead()
;
;---------------------------------
EndSwitch
WEnd
Func SQLCreate();打开或创建数据库
    _SQLite_Open ($SQLite_Data)
    _SQLite_Exec(-1, "Create Table IF NOT Exists TestTable (IDs Text PRIMARY KEY, wb Text, bs Text);")
;SQLite数据库中创建列表
_SQLite_Close ()
EndFunc
 
Func SQLiteInsert($a1, $a2, $a3);插入数据
    _SQLite_Open ($SQLite_Data)
_SQLite_QuerySingleRow(-1, "SELECT IDs FROM TestTable WHERE IDs = '" & $a1 & "';", $aRow)
    $Temp = $aRow[0]
If $Temp = "" Then
  _SQLite_Exec(-1, "Insert into TestTable (IDs) values ('" & $a1 & "');")
EndIf
_SQLite_Exec(-1, "UPDATE TestTable SET wb = '" & $a2 & "' WHERE IDs = '" & $a1 & "';")
    _SQLite_Exec(-1, "UPDATE TestTable SET bs = '" & $a3 & "' WHERE IDs = '" & $a1 & "';")
    
    _SQLite_Close ()
EndFunc
 
Func SQLiteRead();读取数据
 
;_GUICtrlListView_DeleteAllItems ( GUICtrlGetHandle ($list3) )
    _SQLite_Open (@ScriptDir&"\SQLite\"&GUICtrlRead($combo2));打开所选择的数据库
    _SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;",$hQuery)
While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
        _GUICtrlListView_AddItem($list3, $aRow[0])
        _GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow[0]), $aRow[1], 1)
        _GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow[0]), $aRow[2], 2)
        
    WEnd
    _SQLite_Close ()
EndFunc
Func _searchfile($path);搜索文件
        GUICtrlSetData($combo2,"")
       Local $search = FileFindFirstFile($path)
        If Not @error Then
                While 1
                        $file = FileFindNextFile($search)
                        If @error Then ExitLoop
                        _GUICtrlComboBox_AddString($combo2, $file)
                WEnd
        EndIf
        EndFunc


精简了一下,还是这个问题,新打开之后要读取必需先保存一下,无法直接读取上次已经保存的内容...

指点一下看哪里有问题....


另外发现执行_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($list3))清除列表数据之后再读取数据库ListView3中也是不显示的,但再执行一次保存操作后又可以显示出前面的数据了...
发表于 2012-9-25 17:39:21 | 显示全部楼层
回复 7# 邪恶海盗

_SQLite_Open ($SQLite_Data)

在 讀取的Func SQLiteRead()  加上上面的
 楼主| 发表于 2012-9-25 19:22:00 | 显示全部楼层
回复 8# kk_lee69


    哪一行???
发表于 2012-9-26 09:46:26 | 显示全部楼层
回复 9# 邪恶海盗

你在读取的时候选择数据库了没
 楼主| 发表于 2012-9-26 10:26:04 | 显示全部楼层
回复 10# love5173


    选择了啊,Combox下拉菜单,上面的代码可以运行测试的,你帮我看看...
发表于 2012-9-26 11:15:03 | 显示全部楼层
本帖最后由 love5173 于 2012-9-26 11:18 编辑

回复 11# 邪恶海盗
呵呵,是这样的,这个是你抄别人代码又修改的吧!
_SQLite_Startup () 是调用sqlite  这个是不能丢掉的在程序关闭的时候要_SQLite_Shutdown ( )卸载掉。
不能省略掉,你在$btn5的时候做了打开动作,但是如果不按这个按钮就是关闭的。改下位置就好了
#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <ListviewConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <GuiButton.au3>
#include <GuiComboBox.au3>

$main = GUICreate("XX", 400, 200)
$btn5 = GUICtrlCreateButton('保存至数据库', 18, 22, 100, 22, $SS_center)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
$combo2 = GUICtrlCreateCombo("请刷新后选择", 124, 22, 100, 11)
$btn22 = GUICtrlCreateButton('刷新', 235, 22, 60, 21)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
$btn24 = GUICtrlCreateButton('读取数据', 305, 22, 80, 21)
GUICtrlSetFont(-1, 10.5, 500, 0, "", 18)
GUICtrlSetFont(-1, 13, 500, 0, "", 18)
$list2 = GUICtrlCreateListView("33|22|11", 10, 64, 780, 200, "")
GUICtrlCreateListViewItem("xx|dd|xx", $list2)
$List3 = GUICtrlCreateListView("11111|22222|3333", 10, 104, 780, 200, "")
_GUICtrlListView_SetExtendedListViewStyle($List3, $LVS_EX_GRIDLINES)

GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
_SQLite_Startup ()
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        _SQLite_Shutdown ( )

                        Exit
                Case $btn5;保存至数据库
                        Global $Msg, $hQuery, $aRow
                        Global $Temp, $a1, $a2, $a3
                        $SQLite_Data = @ScriptDir & "\SQLite" & @YEAR & @MON & @MDAY & ".db"
                                If Not FileExists($SQLite_Data) Then
                                SQLCreate($SQLite_Data)
                        EndIf;如果数据库不存大则创建
                        SQLiteInsert(_GUICtrlListView_GetItemText($list2, 0, 0), _GUICtrlListView_GetItemText($list2, 0, 1), _GUICtrlListView_GetItemText($list2, 0, 2))

                Case $btn22
                        _searchfile(@ScriptDir & "\SQLite\*.db")

                Case $btn24;读取数据库
                        Global $Msg, $hQuery, $aRow
                        Global $Temp, $a1, $a2, $a3
                        SQLiteRead()
                        ;
                        ;---------------------------------
        EndSwitch
WEnd
Func SQLCreate($SQLite_Data);打开或创建数据库
        _SQLite_Open($SQLite_Data)
        _SQLite_Exec(-1, "Create Table IF NOT Exists TestTable (IDs Text PRIMARY KEY, wb Text, bs Text);")
        ;SQLite数据库中创建列表
        _SQLite_Close()
EndFunc   ;==>SQLCreate

Func SQLiteInsert($a1, $a2, $a3);插入数据
        _SQLite_Open($SQLite_Data)
        _SQLite_QuerySingleRow(-1, "SELECT IDs FROM TestTable WHERE IDs = '" & $a1 & "';", $aRow)
        $Temp = $aRow[0]
        If $Temp = "" Then
                _SQLite_Exec(-1, "Insert into TestTable (IDs) values ('" & $a1 & "');")
        EndIf
        _SQLite_Exec(-1, "UPDATE TestTable SET wb = '" & $a2 & "' WHERE IDs = '" & $a1 & "';")
        _SQLite_Exec(-1, "UPDATE TestTable SET bs = '" & $a3 & "' WHERE IDs = '" & $a1 & "';")

        _SQLite_Close()
EndFunc   ;==>SQLiteInsert

Func SQLiteRead();读取数据

        ;_GUICtrlListView_DeleteAllItems ( GUICtrlGetHandle ($list3) )
        _SQLite_Open(@ScriptDir & "\SQLite" & GUICtrlRead($combo2));打开所选择的数据库
        MsgBox(0,0,GUICtrlRead($combo2))
        _SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;", $hQuery)
        While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
                _GUICtrlListView_AddItem($List3, $aRow[0])
                _GUICtrlListView_AddSubItem($List3, _GUICtrlListView_FindInText($List3, $aRow[0]), $aRow[1], 1)
                _GUICtrlListView_AddSubItem($List3, _GUICtrlListView_FindInText($List3, $aRow[0]), $aRow[2], 2)

        WEnd
        _SQLite_Close()
EndFunc   ;==>SQLiteRead
Func _searchfile($path);搜索文件
        GUICtrlSetData($combo2, "")
        Local $search = FileFindFirstFile($path)
        If Not @error Then
                While 1
                        $file = FileFindNextFile($search)
                        If @error Then ExitLoop
                        _GUICtrlComboBox_AddString($combo2, $file)
                WEnd
        EndIf
EndFunc   ;==>_searchfile
发表于 2012-9-26 11:20:17 | 显示全部楼层
回复 11# 邪恶海盗

另外,检查路径的时候,要先检查指定文件夹是否存在,如果不存在就要建立。建立数据库的命令不会建立文件夹。这些都是在程序开始就要进行的。调用的dll,包含的udf都是一个道理
 楼主| 发表于 2012-9-26 11:29:59 | 显示全部楼层
回复 12# love5173

被你发现了,这个代码就是套别人的例子...
   
经修改后发现好使了...
没有学过编程的伤不起啊....
发表于 2012-9-26 11:39:22 | 显示全部楼层
本帖最后由 shqf 于 2012-9-26 11:41 编辑

回复 7# 邪恶海盗


代码中变量搞得有乱呢。几个cas里声明了相同的变量,但用的又是global。不带这样滴~
Global 声明的变量作用于全局,声明全局变量一般可放在程序的开头部分。还有Dim, Local 和 Global 等是声明并创建变量,或说是定义一个变量,但变量还有一个赋值的问题。如果没有赋值,后面代码用到它的值时就可能要出错唉。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-22 15:28 , Processed in 0.081801 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表