- #cs
- 闲的无聊,写一篇关于操作mssql数据库的文章。
- 水平不高,只为给新手一点借鉴学习的资料,欢迎高手拍砖。
- -By Crossdoor
- #ce
- #Include <Array.au3>
- ;~ 要操作数据库,第一件事就是必须连接上数据库,连接MsSql可以使用Ado,AU3提供了函数ObjCreate来创建Com指定对象
- ;~ 具体如何操作看实例
- $Err = ObjEvent("AutoIt.Error", "ODBCJET_ErroHandler") ;定义一个函数ODBCJET_ErroHandler收集对象的错误
- Dim $sServer = '127.0.0.1', $sUsername = 'sa', $sPassword = '1234567' ;三个变量分别是连接数据库用的地址、账号、密码
- $Conn = ObjCreate("ADODB.Connection");首先要建立ADODB.Connection类
- $Conn.open("DRIVER={SQL Server};SERVER=" & $sServer &
";UID=" & $sUsername & ";PWD=" & $sPassword &
";");使用open方法连接数据库
- If @error Then Exit
- ;如果程序没有退出,说明成功连接上了数据库
- ;连接成功后我们来读取数据
- $Conn.Execute("use master") ;首先要指定一个需要操作的库,这里用系统自带的master库来操作
- $RS = ObjCreate("ADODB.Recordset");创建记录集对象
- $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
- $RS.Open("Select * from sysdatabases ORDER BY Name");执行Sql语句,这个语句是查询数据库中所有的库属性,并且按Name字段的数据进行排序
- Dim $Select_Db[1][1] = {0};定义一个数组来接收查询到的数据
- Dim $Count = 1;定义一个变量用来记录查询到的数据行数
- While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
- If @error = 1 Then ExitLoop
- If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
- ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
- Next
- EndIf
- ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
- $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
- Next
- $Count += 1;行数加1
- $RS.movenext;将记录指针从当前的位置向下移一行
- WEnd
- $RS.Close;关闭记录集对象
- _ArrayDisplay($Select_Db, "数据库所有库属性");显示数组
- #cs 查询数据的时候,如果不指定要操作的数据库,还可以使用下面的方法。具体区别就在于查询的sql语句上,想多了解的朋友可以看一下下面的代码
- $RS = ObjCreate("ADODB.Recordset");创建记录集对象
- $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
- $RS.Open("Select * from Master.dbo.sysdatabases ORDER BY Name");执行Sql语句
- Dim $Select_Db[1][1] = {0};定义一个数组来接收查询到的数据
- Dim $Count = 1;定义一个变量用来记录查询到的数据行数
- While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
- If @error = 1 Then ExitLoop
- If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
- ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
- Next
- EndIf
- ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
- $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
- Next
- $Count += 1;行数加1
- $RS.movenext;将记录指针从当前的位置向下移一行
- WEnd
- $RS.close;关闭记录集
- _ArrayDisplay($Select_Db);显示数组
- #ce
- ;~ 知道如何读取数据后,再来试试写入数据,不过为了不破坏master系统库的数据,在此之前我们来创建一个测试表test
- $Conn.Execute("use master");首先依旧是先指定要操作的库
- $Conn.Execute("CREATE TABLE test(F_id int identity(1, 1) primary key,Name varchar(50),Tel char(50))");执行建表的sql语句
- ;上面的sql语句,在test表中创建了三个字段int型的F_id、varchar型的Name、char型的Tel,其中F_id被定义为主键,且启用了标识
- $read = ReabTableDb($conn, "select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 ORDER BY Name")
- _ArrayDisplay($read, "Test表建立后操作库所有的表名称")
- ;test表建立后,我们就可以来测试写入数据了。看下面的代码,给Name字段写入张三,Tel字段写入13911931773
- $Conn.Execute("insert into test (Name,Tel) values ('张三','13911931773')")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表写入张三")
- ;再写入李四 13614441525
- $Conn.Execute("insert into test (Name,Tel) values ('李四','13614441525')")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表写入李四")
- ;再写入王五 13000074125
- $Conn.Execute("insert into test (Name,Tel) values ('王五','13000074125')")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表写入王五")
- ;从上面执行建表和写入数据可以看出,因为不需要获取数据,所以我们没有建立记录集
- ;成功写入数据后,我们来尝试更新数据。看下面的代码,把张三的Tel字段数据从13911931773改成119
- $Conn.Execute("UPDATE test set Tel = '119' WHERE Name = '张三'")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表更新张三")
- ;上面是有条件修改,我们再试试无条件修改。把Tel字段的所有数据改成9个0
- $Conn.Execute("UPDATE test set Tel = '000000000'")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表更新所有")
- ;更新数据后,再试试删除数据。首先删除张三
- $Conn.Execute("DELETE FROM test WHERE Name = '张三'")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表删除张三")
- ;再来删除test表的全部数据
- $Conn.Execute("DELETE FROM test")
- $read = ReabTableDb($conn, "Select * from test")
- _ArrayDisplay($read, "Test表删除所有")
- ;既然可以清理表中的数据,那当然要试试删除表了。我们来把刚才建立的Test表删掉
- $Conn.Execute("DROP TABLE test")
- $read = ReabTableDb($conn, "select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 ORDER BY Name")
- _ArrayDisplay($read, "Test表删除后操作库所有的表名称")
- $Conn.Close;所有的操作都结束后,关闭数据库连接
- #cs 结束语
- 乱七八糟的写了一大通,果然不出乎意料,烂的可以。不过权当抛砖引玉好了,希望高手能多写点好的教程出来。
- 通过上面的一大堆例子,其实不难看出,使用Au3操作数据库的话,真正考验的还是对sql脚本的熟悉。
- 写不出sql语句的话,那想干点什么恐怕会比较麻烦。不过还有百度和谷歌,所以我们还可以加油!
- -By Crossdoor 2010-05-07
- #ce
- Func ReabTableDb($conn, $Sql);读取数据
- $RS = ObjCreate("ADODB.Recordset");创建记录集对象
- $RS.ActiveConnection = $conn;设置记录集的激活链接属性来自$Conn
- $RS.Open($Sql);执行Sql语句
- Dim $Select_Db[1][1] = {0};定义一个数组来接收查询到的数据
- Dim $Count = 1;定义一个变量用来记录查询到的数据行数
- While Not $RS.eof And Not $RS.bof;当记录指针处于第一条记录和最后一条记录之间时,执行while循环
- If @error = 1 Then ExitLoop
- If $Select_Db[0][0] = 0 Then;当数组二维$Select_Db[0][0]为0时,重定义数组的第二维大小等于记录集查询到的字段数
- ReDim $Select_Db[1][$RS.Fields.Count + 1];$RS.Fields.Count为记录集查询到的字段数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[0][$i + 1] = $RS.Fields($i).Name;$RS.Fields($i).Name为字段名,把字段名存入数组
- Next
- EndIf
- ReDim $Select_Db[$Count + 1][$RS.Fields.Count + 1];数组第一维大小加1,用于存放数据
- $Select_Db[0][0] = $Count;$Select_Db[0][0]存放查询到的数据行数
- For $i = 0 To $RS.Fields.Count - 1
- $Select_Db[$Count][$i + 1] = $RS.Fields($i).Value;$RS.Fields($i).Value字段数据
- Next
- $Count += 1;行数加1
- $RS.movenext;将记录指针从当前的位置向下移一行
- WEnd
- $RS.Close;关闭记录集对象
- Return $Select_Db
- EndFunc
- Func ODBCJET_ErroHandler();Com对象错误信息收集函数
- MsgBox(0,"Intercepted Sql Error !", @CRLF &"Intercepted Sql Error !" & @CRLF & _
- "err.description is: " & @TAB & $Err.description & @CRLF & _
- "err.windescription:" & @TAB & $Err.windescription & @CRLF & _
- "err.number is: " & @TAB & hex($Err.number,8) & @CRLF & _
- "err.lastdllerror is: " & @TAB & $Err.lastdllerror & @CRLF & _
- "err.source is: " & @TAB & $Err.source & @CRLF & _
- "err.helpfile is: " & @TAB & $Err.helpfile & @CRLF & _
- "err.helpcontext is: " & @TAB & $Err.helpcontext & @CRLF)
- SetError(1)
- EndFunc ;==>ODBCJET_ErroHandler
|