找回密码  加入

AUTOIT CN

搜索
查看: 49465|回复: 171

[原创] 操作Mssql数据库教程

[复制链接]
发表于 2010-5-7 16:46:40 | 显示全部楼层 |阅读模式

  1. #cs
  2.         闲的无聊,写一篇关于操作mssql数据库的文章。
  3.         水平不高,只为给新手一点借鉴学习的资料,欢迎高手拍砖。
  4.         -By Crossdoor
  5. #ce
  6. #Include <Array.au3>
  7. ;~ 要操作数据库,第一件事就是必须连接上数据库,连接MsSql可以使用Ado,AU3提供了函数ObjCreate来创建Com指定对象
  8. ;~ 具体如何操作看实例
  9. $Err = ObjEvent("AutoIt.Error", "ODBCJET_ErroHandler") ;定义一个函数ODBCJET_ErroHandler收集对象的错误

  10. Dim $sServer = '127.0.0.1', $sUsername = 'sa', $sPassword = '1234567' ;三个变量分别是连接数据库用的地址、账号、密码
  11. $Conn = ObjCreate("ADODB.Connection");首先要建立ADODB.Connection类
  12. $Conn.open("DRIVER={SQL Server};SERVER=" & $sServer & ";UID=" & $sUsername & ";PWD=" & $sPassword & ";");使用open方法连接数据库
  13. If @error Then Exit
  14. ;如果程序没有退出,说明成功连接上了数据库

  15. ;连接成功后我们来读取数据
  16. $Conn.Execute("use master") ;首先要指定一个需要操作的库,这里用系统自带的master库来操作
  17. $RS = ObjCreate("ADODB.Recordset");创建记录集对象
  18. $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
  19. $RS.Open("Select * from sysdatabases ORDER BY Name");执行Sql语句,这个语句是查询数据库中所有的库属性,并且按Name字段的数据进行排序
  20. Dim $Select_Db[1][1] = [[0]];定义一个数组来接收查询到的数据
  21. Dim $Count = 1;定义一个变量用来记录查询到的数据行数
  22. While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
  23.         If @error = 1 Then ExitLoop
  24.         If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
  25.                 ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
  26.                 For $i = 0 To $RS.Fields.Count - 1
  27.                         $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
  28.                 Next
  29.         EndIf
  30.         ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
  31.         $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
  32.         For $i = 0 To $RS.Fields.Count - 1
  33.                 $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
  34.         Next
  35.         $Count += 1;行数加1
  36.         $RS.movenext;将记录指针从当前的位置向下移一行
  37. WEnd
  38. $RS.Close;关闭记录集对象
  39. _ArrayDisplay($Select_Db, "数据库所有库属性");显示数组

  40. #cs    查询数据的时候,如果不指定要操作的数据库,还可以使用下面的方法。具体区别就在于查询的sql语句上,想多了解的朋友可以看一下下面的代码
  41. $RS = ObjCreate("ADODB.Recordset");创建记录集对象
  42. $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
  43. $RS.Open("Select * from Master.dbo.sysdatabases ORDER BY Name");执行Sql语句
  44. Dim $Select_Db[1][1] = [[0]];定义一个数组来接收查询到的数据
  45. Dim $Count = 1;定义一个变量用来记录查询到的数据行数
  46. While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
  47.         If @error = 1 Then ExitLoop
  48.         If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
  49.                 ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
  50.                 For $i = 0 To $RS.Fields.Count - 1
  51.                         $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
  52.                 Next
  53.         EndIf
  54.         ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
  55.         $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
  56.         For $i = 0 To $RS.Fields.Count - 1
  57.                 $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
  58.         Next
  59.         $Count += 1;行数加1
  60.         $RS.movenext;将记录指针从当前的位置向下移一行
  61. WEnd
  62. $RS.close;关闭记录集
  63. _ArrayDisplay($Select_Db);显示数组
  64. #ce

  65. ;~ 知道如何读取数据后,再来试试写入数据,不过为了不破坏master系统库的数据,在此之前我们来创建一个测试表test
  66. $Conn.Execute("use master");首先依旧是先指定要操作的库
  67. $Conn.Execute("CREATE TABLE test(F_id int identity(1, 1) primary key,Name varchar(50),Tel char(50))");执行建表的sql语句
  68. ;上面的sql语句,在test表中创建了三个字段int型的F_id、varchar型的Name、char型的Tel,其中F_id被定义为主键,且启用了标识
  69. $read = ReabTableDb($conn, "select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 ORDER BY Name")
  70. _ArrayDisplay($read, "Test表建立后操作库所有的表名称")

  71. ;test表建立后,我们就可以来测试写入数据了。看下面的代码,给Name字段写入张三,Tel字段写入13911931773
  72. $Conn.Execute("insert into test (Name,Tel) values ('张三','13911931773')")
  73. $read = ReabTableDb($conn, "Select * from test")
  74. _ArrayDisplay($read, "Test表写入张三")
  75. ;再写入李四 13614441525
  76. $Conn.Execute("insert into test (Name,Tel) values ('李四','13614441525')")
  77. $read = ReabTableDb($conn, "Select * from test")
  78. _ArrayDisplay($read, "Test表写入李四")
  79. ;再写入王五 13000074125
  80. $Conn.Execute("insert into test (Name,Tel) values ('王五','13000074125')")
  81. $read = ReabTableDb($conn, "Select * from test")
  82. _ArrayDisplay($read, "Test表写入王五")
  83. ;从上面执行建表和写入数据可以看出,因为不需要获取数据,所以我们没有建立记录集


  84. ;成功写入数据后,我们来尝试更新数据。看下面的代码,把张三的Tel字段数据从13911931773改成119
  85. $Conn.Execute("UPDATE test set Tel = '119' WHERE Name = '张三'")
  86. $read = ReabTableDb($conn, "Select * from test")
  87. _ArrayDisplay($read, "Test表更新张三")
  88. ;上面是有条件修改,我们再试试无条件修改。把Tel字段的所有数据改成9个0
  89. $Conn.Execute("UPDATE test set Tel = '000000000'")
  90. $read = ReabTableDb($conn, "Select * from test")
  91. _ArrayDisplay($read, "Test表更新所有")


  92. ;更新数据后,再试试删除数据。首先删除张三
  93. $Conn.Execute("DELETE FROM test WHERE Name = '张三'")
  94. $read = ReabTableDb($conn, "Select * from test")
  95. _ArrayDisplay($read, "Test表删除张三")
  96. ;再来删除test表的全部数据
  97. $Conn.Execute("DELETE FROM test")
  98. $read = ReabTableDb($conn, "Select * from test")
  99. _ArrayDisplay($read, "Test表删除所有")


  100. ;既然可以清理表中的数据,那当然要试试删除表了。我们来把刚才建立的Test表删掉
  101. $Conn.Execute("DROP TABLE test")
  102. $read = ReabTableDb($conn, "select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 ORDER BY Name")
  103. _ArrayDisplay($read, "Test表删除后操作库所有的表名称")


  104. $Conn.Close;所有的操作都结束后,关闭数据库连接



  105. #cs 结束语
  106.         乱七八糟的写了一大通,果然不出乎意料,烂的可以。不过权当抛砖引玉好了,希望高手能多写点好的教程出来。
  107.         通过上面的一大堆例子,其实不难看出,使用Au3操作数据库的话,真正考验的还是对sql脚本的熟悉。
  108.         写不出sql语句的话,那想干点什么恐怕会比较麻烦。不过还有百度和谷歌,所以我们还可以加油!
  109.         -By Crossdoor 2010-05-07
  110. #ce



  111. Func ReabTableDb($conn, $Sql);读取数据
  112.         $RS = ObjCreate("ADODB.Recordset");创建记录集对象
  113.         $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
  114.         $RS.Open($Sql);执行Sql语句
  115.         Dim $Select_Db[1][1] = [[0]];定义一个数组来接收查询到的数据
  116.         Dim $Count = 1;定义一个变量用来记录查询到的数据行数
  117.         While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
  118.                 If @error = 1 Then ExitLoop
  119.                 If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
  120.                         ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
  121.                         For $i = 0 To $RS.Fields.Count - 1
  122.                                 $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
  123.                         Next
  124.                 EndIf
  125.                 ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
  126.                 $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
  127.                 For $i = 0 To $RS.Fields.Count - 1
  128.                         $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
  129.                 Next
  130.                 $Count += 1;行数加1
  131.                 $RS.movenext;将记录指针从当前的位置向下移一行
  132.         WEnd
  133.         $RS.Close;关闭记录集对象
  134.         Return $Select_Db
  135. EndFunc

  136. Func ODBCJET_ErroHandler();Com对象错误信息收集函数
  137.         MsgBox(0,"Intercepted Sql Error !", @CRLF &"Intercepted Sql Error !"      & @CRLF  & _
  138.              "err.description is: "    & @TAB & $Err.description    & @CRLF & _
  139.              "err.windescription:"     & @TAB & $Err.windescription & @CRLF & _
  140.              "err.number is: "         & @TAB & hex($Err.number,8)  & @CRLF & _
  141.              "err.lastdllerror is: "   & @TAB & $Err.lastdllerror   & @CRLF & _
  142.              "err.source is: "         & @TAB & $Err.source         & @CRLF & _
  143.              "err.helpfile is: "       & @TAB & $Err.helpfile       & @CRLF & _
  144.              "err.helpcontext is: "    & @TAB & $Err.helpcontext & @CRLF)
  145.         SetError(1)
  146. EndFunc   ;==>ODBCJET_ErroHandler
复制代码

评分

7

查看全部评分

 楼主| 发表于 2010-5-7 16:48:59 | 显示全部楼层

看了不回,男的木有小JJ,女的有小JJ
发表于 2010-5-7 17:54:40 | 显示全部楼层
事例比较多,让我受益匪浅!楼主辛苦了!

请问软件中定义的连接数据库的参数(数据库IP,用户名,密码)容易被别人获取到吗?
发表于 2010-5-7 19:08:50 | 显示全部楼层
学习下lz高招!
发表于 2010-5-9 00:00:33 | 显示全部楼层
最近正要用到,学习了,多谢
发表于 2010-5-13 21:23:25 | 显示全部楼层
好东西,多谢了,收下了!!
发表于 2010-5-14 18:37:05 | 显示全部楼层
用到这一块了,学习,晚上消化~~~论坛因为有您更精彩~~~~
发表于 2010-5-15 20:32:12 | 显示全部楼层
KAO,不错,不错,不错
发表于 2010-5-24 04:15:50 | 显示全部楼层
哇,前段时间我来论坛找都只找到08年的一篇MSSQL的UDF,今天上GOOGLE搜索居然搜索到楼主的高文,正好学习,非常感激!!!
发表于 2010-5-24 04:32:04 | 显示全部楼层
原来之前的那个MSSQL也是楼主写的,不过那个只是发出来UDF,这次是详细的教程,谢谢分享!
发表于 2010-5-24 08:16:05 | 显示全部楼层
谢谢分享!
发表于 2010-5-30 20:10:27 | 显示全部楼层
确实不错!
发表于 2010-5-31 09:57:50 | 显示全部楼层
昨天怎么没搜到这个帖子啊!走了弯路!
发表于 2010-5-31 12:41:04 | 显示全部楼层
回复 1# 298311657
太OK了,太棒了,非常感谢!
要是楼主再写一份前台是IE操作,后台是Mssql管理的教程就更OK了,呵呵!
发表于 2010-5-31 14:53:28 | 显示全部楼层
好难 不错收藏了 慢慢研究
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-5-20 03:49 , Processed in 0.078125 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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