关于SQLite数据库操作的疑问,内有简单代码
本帖最后由 邪恶海盗 于 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
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)
_GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow), $aRow, 1)
_GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow), $aRow, 2)
WEnd
_SQLite_Close ()
EndFunc
大家帮我瞧瞧,我的目的是按$btn5将ListView2内的数据到数据库,然后按$btn24读取数据库数据并写入到$listView3,当按$btn5后再按$btn24正常,当单独按$btn24时程序自动退出,高淫帮我看看哪里的问题...
不懂编程,不懂数据库的菜鸟表示鸭梨山大... 回复 1# 邪恶海盗
定義問題吧...
你的 $btn5 是不是定義了很多 變數
而你的 $btn24 沒有.....但是 $btn24所呼叫的函數 會使用到變數.....所以會出問題.....
最好把你的錯誤訊息帶 PO 上來.... 回复 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 回复 3# 邪恶海盗
上面的訊息不就是告訴你....程式跑到 要帶出 $hQuery 這個變數的時候 出錯誤...
表示$hQuery 這個變數 在那邊的時候....是無法辨識的...
你先按了$BTN5之後 $hQuery 這個變數有被定義 如果 你直接按 $BTN24這個 $hQuery 依照你目前提供的資料是沒有被定義的所以當然會出錯 本帖最后由 邪恶海盗 于 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则没问题.. 回复 5# 邪恶海盗
那就表示 你整個邏輯是有問題的你能告訴我 那個變數裡面 放著甚麼東西嗎??
不然你就得把所有的程式碼 貼上來 本帖最后由 邪恶海盗 于 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
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)
_GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow), $aRow, 1)
_GUICtrlListView_AddSubItem($list3, _GUICtrlListView_FindInText($list3, $aRow), $aRow, 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中也是不显示的,但再执行一次保存操作后又可以显示出前面的数据了... 回复 7# 邪恶海盗
_SQLite_Open ($SQLite_Data)
在 讀取的Func SQLiteRead()加上上面的 回复 8# kk_lee69
哪一行??? 回复 9# 邪恶海盗
你在读取的时候选择数据库了没 回复 10# love5173
选择了啊,Combox下拉菜单,上面的代码可以运行测试的,你帮我看看... 本帖最后由 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
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)
_GUICtrlListView_AddSubItem($List3, _GUICtrlListView_FindInText($List3, $aRow), $aRow, 1)
_GUICtrlListView_AddSubItem($List3, _GUICtrlListView_FindInText($List3, $aRow), $aRow, 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
回复 11# 邪恶海盗
另外,检查路径的时候,要先检查指定文件夹是否存在,如果不存在就要建立。建立数据库的命令不会建立文件夹。这些都是在程序开始就要进行的。调用的dll,包含的udf都是一个道理 回复 12# love5173
被你发现了,这个代码就是套别人的例子...{:face (303):}
经修改后发现好使了...
没有学过编程的伤不起啊.... 本帖最后由 shqf 于 2012-9-26 11:41 编辑
回复 7# 邪恶海盗
代码中变量搞得有乱呢。几个cas里声明了相同的变量,但用的又是global。不带这样滴~
Global 声明的变量作用于全局,声明全局变量一般可放在程序的开头部分。还有Dim, Local 和 Global 等是声明并创建变量,或说是定义一个变量,但变量还有一个赋值的问题。如果没有赋值,后面代码用到它的值时就可能要出错唉。
页:
[1]
2