【autoit中文论坛】操作Mssql数据库教程 - 『 中文资料 』 - AUTOIT CN AutoIt中文论坛|acn|au3|软件汉化

461
 

#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

相关专题

autoit中文论坛kegg数据库中文教程gsea数据库中文教程
 

内容版权声明:除非注明,否则皆为本站转载文章。文章及图片版权归原作者所有,如有侵权请联系我们,我们立刻删除。

转载注明出处:https://www.361478.com/a/1675.html