找回密码  加入

AUTOIT CN

搜索
查看: 86133|回复: 267

[原创] SQLite 数据库操作实例(读取、写入、查找、删除)!

[复制链接]
发表于 2008-7-29 13:11:25 | 显示全部楼层 |阅读模式
本帖最后由 ceoguang 于 2010-8-25 20:32 编辑

SQLite是一款轻型的数据库,
关于它的特点,可以参考网上的相关文章。

令人兴奋的是,AutoIT UDFs 支持对 SQLite 的操作。
遗憾的是到今天为止,论坛上没有相关的文章和资料可供参考,
我根据自己学习的心得体会,写了“SQLite 数据库操作实例”,
希望能抛砖引玉,帮助大家在写 AutoIT +  SQLite 程序的过程中有所帮助。



源代码中用到的主要语句,大家可以参考AutoIT的帮助文档:
_SQLite_Startup
_SQLite_Open
_SQLite_Exec
_SQLite_Query
_SQLite_QuerySingleRow
_SQLite_Close
_SQLite_Shutdown
_GUICtrlListView_AddColumn
_GUICtrlListView_DeleteAllItems
_GUICtrlListView_AddItem
_GUICtrlListView_AddSubItem
_GUICtrlListView_FindInText


  1. #NoTrayIcon
  2. #include <GUIListBox.au3>
  3. #Include <GuiListView.au3>
  4. #include <SQLite.au3>
  5. #include <SQLite.dll.au3>
  6. Opt("TrayIconHide", 1)
  7. Opt('MustDeclareVars', 1)
  8. Opt("GUICloseOnESC", 0)
  9. Global $GUI_Form, $Title, $SQLite_Data_Path, $GUI_ListBox
  10. Global $GUI_Input1, $GUI_Input2, $GUI_Input3, $GUI_Input4, $GUI_Input5
  11. Global $GUI_Button1, $GUI_Button2, $GUI_Button3, $GUI_Button4
  12. Global $Msg, $hQuery, $aRow
  13. Global $Temp, $a, $b, $c
  14. $Title = "SQLite操作实例..."
  15. $SQLite_Data_Path = "SQLite.db"
  16. _SQLite_Startup () ;加载 SQLite.dll
  17. If Not FileExists($SQLite_Data_Path) Then
  18.     SQLCreate()
  19. EndIf
  20. $GUI_Form = GUICreate($Title, 300, 435, -1, -1)
  21. GUISetBkColor(0xECE9D8)  ; will change background color
  22. $GUI_ListBox = GUICtrlCreateListView("", 2, 2, 296, 309, 0x0010)
  23. _GUICtrlListView_AddColumn($GUI_ListBox, "编号", 100, 0)
  24. _GUICtrlListView_AddColumn($GUI_ListBox, "姓名", 80, 1)
  25. _GUICtrlListView_AddColumn($GUI_ListBox, "年龄", 80, 1)
  26. GUICtrlCreateLabel("编号         姓名         年龄", 34, 325, 240, 15)
  27. $GUI_Input1 = GUICtrlCreateInput("", 10, 341, 73, 20)
  28. $GUI_Input2 = GUICtrlCreateInput("", 88, 341, 73, 20)
  29. $GUI_Input3 = GUICtrlCreateInput("", 166, 341, 73, 20)
  30. $GUI_Input4 = GUICtrlCreateInput("", 88, 366, 73, 20)
  31. $GUI_Input5 = GUICtrlCreateInput("", 88, 391, 73, 20)
  32. $GUI_Button1 = GUICtrlCreateButton("读取", 246, 315, 48, 22, 0)
  33. $GUI_Button2 = GUICtrlCreateButton("写入", 246, 340, 48, 22, 0)
  34. $GUI_Button3 = GUICtrlCreateButton("查找", 246, 365, 48, 22, 0)
  35. $GUI_Button4 = GUICtrlCreateButton("删除", 246, 390, 48, 22, 0)
  36. GUICtrlCreateGroup("", 2, 307, 296, 107)
  37. GUICtrlCreateLabel("「江西樟树·仅此一仙·QQ:43848058」制作", 32, 419, 240, 15)
  38. GUICtrlSetState(-1, $GUI_DISABLE)
  39. GUISetState()
  40. While 1
  41.   $Msg = GUIGetMsg()
  42.   Select
  43.    Case $Msg = $GUI_EVENT_CLOSE
  44.              _SQLite_Shutdown () ;卸载 SQLite.dll
  45.     ExitLoop
  46.    Case $Msg = $GUI_Button1
  47.     SQLiteRead()
  48.    Case $Msg = $GUI_Button2
  49.                 SQLiteInsert(GUICtrlRead ($GUI_Input1), GUICtrlRead ($GUI_Input2), GUICtrlRead ($GUI_Input3))
  50.                 SQLiteRead()
  51.    Case $Msg = $GUI_Button3
  52.                 SQLiteSelect(GUICtrlRead ($GUI_Input4))
  53.    Case $Msg = $GUI_Button4
  54.     SQLiteDelete(GUICtrlRead ($GUI_Input5))
  55.                 SQLiteRead()
  56.   EndSelect
  57.   
  58. WEnd
  59. Func SQLCreate()
  60.     _SQLite_Open ($SQLite_Data_Path)
  61.     _SQLite_Exec(-1, "Create Table IF NOT Exists TestTable (IDs Text PRIMARY KEY, Name Text, Age Text);")
  62.     _SQLite_Close ()
  63. EndFunc
  64. Func SQLiteRead()
  65. _GUICtrlListView_DeleteAllItems ( GUICtrlGetHandle ($GUI_ListBox) )
  66.     _SQLite_Open ($SQLite_Data_Path)
  67.     _SQLite_Query(-1, "SELECT * FROM TestTable ORDER BY IDs DESC;",$hQuery)
  68. While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
  69.         _GUICtrlListView_AddItem($GUI_ListBox, $aRow[0])
  70.         _GUICtrlListView_AddSubItem($GUI_ListBox, _GUICtrlListView_FindInText($GUI_ListBox, $aRow[0]), $aRow[1], 1)
  71.         _GUICtrlListView_AddSubItem($GUI_ListBox, _GUICtrlListView_FindInText($GUI_ListBox, $aRow[0]), $aRow[2], 2)
  72.     WEnd
  73.     _SQLite_Close ()
  74. EndFunc
  75. Func SQLiteInsert($a, $b, $c)
  76.     _SQLite_Open ($SQLite_Data_Path)
  77. _SQLite_QuerySingleRow(-1, "SELECT IDs FROM TestTable WHERE IDs = '" & $a & "';", $aRow)
  78.     $Temp = $aRow[0]
  79. If $Temp = "" Then
  80.   _SQLite_Exec(-1, "Insert into TestTable (IDs) values ('" & $a & "');")
  81. EndIf
  82. _SQLite_Exec(-1, "UPDATE TestTable SET Name = '" & $b & "' WHERE IDs = '" & $a & "';")
  83.     _SQLite_Exec(-1, "UPDATE TestTable SET Age = '" & $c & "' WHERE IDs = '" & $a & "';")
  84.     _SQLite_Close ()
  85. EndFunc
  86. Func SQLiteSelect($a)
  87.     _SQLite_Open ($SQLite_Data_Path)
  88. _SQLite_QuerySingleRow(-1, "SELECT * FROM TestTable WHERE Name = '" & $a & "';", $aRow)
  89.     $Temp = $aRow[0]
  90. If $Temp = "" Then
  91.   MsgBox(262208, "查找结果...", "数据库中姓名为 [" & $a & "] 的员工记录不存在!")
  92.     Else
  93.   _GUICtrlListView_DeleteAllItems ( GUICtrlGetHandle ($GUI_ListBox) )
  94.         _GUICtrlListView_AddItem($GUI_ListBox, $aRow[0])
  95.         _GUICtrlListView_AddSubItem($GUI_ListBox, _GUICtrlListView_FindInText($GUI_ListBox, $aRow[0]), $aRow[1], 1)
  96.         _GUICtrlListView_AddSubItem($GUI_ListBox, _GUICtrlListView_FindInText($GUI_ListBox, $aRow[0]), $aRow[2], 2)
  97.         MsgBox(262208, "查找结果...", "找到记录: 编号[" & $aRow[0] & "] 姓名[" & $aRow[1] & "] 年龄[" & $aRow[2] & "] !")
  98. EndIf
  99.     _SQLite_Close ()
  100. EndFunc
  101. Func SQLiteDelete($a)
  102.     _SQLite_Open ($SQLite_Data_Path)
  103.     _SQLite_Exec(-1, "DELETE FROM  TestTable WHERE Name = '" & $a & "';")
  104.     _SQLite_Close ()
  105. MsgBox(262208, "删除记录...", "删除数据库中姓名为 [" & $a & "] 的员工记录!")
  106. EndFunc
复制代码

================黄金分割线==================
BY HOOK
借位置一用
Sqlite是支持加密的.参考开源项目
http://sourceforge.net/projects/ ... ilename&sortdir=asc
操作方法:

打开数据库 sqlite3_open,然后在操作数据库之前执行 sqlite3_key 后就可进行数据库操作,否则会返回错误。

sqlite3_key是输入密钥,如果数据库已加密必须先执行此函数并输入正确密钥才能进行操作,如果数据库没有加密,执行此函数后进行数据库操作反而会出现“此数据库已加密或不是一个数据库文件”的错误。

int sqlite3_key( sqlite3 *db, const void *pKey, int nKey),db 是指定数据库,pKey 是密钥,nKey 是密钥长度。例:sqlite3_key( db, "abc", 3);

sqlite3_rekey是变更密钥或给没有加密的数据库添加密钥或清空密钥,变更密钥或清空密钥前必须先正确执行 sqlite3_key。在正确执行 sqlite3_rekey 之后在 sqlite3_close 关闭数据库之前可以正常操作数据库,不需要再执行 sqlite3_key。

int sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),参数同上。

清空密钥为 sqlite3_rekey( db, NULL, 0)

================黄金分割线完毕==================

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入

x

评分

2

查看全部评分

发表于 2008-7-29 15:03:45 | 显示全部楼层
其实数据库方面,语法都是差不多的。
发表于 2008-8-5 15:24:59 | 显示全部楼层
多谢分享了,正需要呢
发表于 2008-8-8 08:30:42 | 显示全部楼层
能支持本地就不错了,脚本你还指望做网络服务器?
发表于 2008-8-8 11:00:27 | 显示全部楼层
多个同姓名记录呢?楼主这个只支持查找并显示一个记录。。
希望楼主指点~~~谢谢
 楼主| 发表于 2008-8-13 09:46:22 | 显示全部楼层

回复 5# boyhong 的帖子

同名同姓的记录其实道理是一样的,用_SQLite_Query,相关例子可以参照帮助里面的例子。

[ 本帖最后由 zplinux 于 2008-8-13 10:28 编辑 ]
发表于 2008-8-29 17:50:38 | 显示全部楼层
谢谢楼主的提供这么全的代码。
发表于 2008-9-5 13:42:38 | 显示全部楼层
多谢分享,昨天就想找了,今天终于找到了
发表于 2008-9-5 15:07:31 | 显示全部楼层
我还是直接用TXT吧
发表于 2008-9-22 14:40:12 | 显示全部楼层
更新数据呢
发表于 2008-9-22 19:55:27 | 显示全部楼层
公式计算能做吗
发表于 2008-9-23 17:12:41 | 显示全部楼层
楼主可真是强人
学习了 这是好东西啊
发表于 2008-9-23 18:54:24 | 显示全部楼层
学习一下。多谢!
发表于 2008-10-23 14:01:56 | 显示全部楼层
感谢LZ分享
 楼主| 发表于 2008-10-27 15:01:11 | 显示全部楼层
原帖由 netegg 于 2008-9-22 19:55 发表
公式计算能做吗


公式计算当然可以做到。可以用参数传递、函数结合起来,实现很简单的。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-8-16 00:18 , Processed in 0.118890 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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