找回密码
 加入
搜索
查看: 8541|回复: 18

[AU3基础] 【已解决】怎样执行变量字符中的语句??

 火.. [复制链接]
发表于 2014-11-27 18:27:44 | 显示全部楼层 |阅读模式
本帖最后由 meteor0330 于 2014-11-28 14:13 编辑

我设置了一个变量

$RS_Fields='$RS.Fields(0).value & "|" & $RS.Fields(1).value'

我现在想要在GUICtrlSetData中执行它怎么办?

$Item1= GUICtrlCreateListViewItem("|",$ListView1)
GUICtrlSetData($Item1,$RS_Fields)

我这样写完后,执行时,满ListView里都是$RS.Fields(0).value & "|" & $RS.Fields(1).value
并不是我从数据库里读到的数据,我应该怎么办呢?

不知我这样说清楚了没有!
拜托各位大神!!!

我想实现的功能如我3楼所说,
相关函数的源码如下:

Func DaKaiSQL()
        Local $conn, $RS
        Local $aArr[3]
        Local $ListViewBiaoTi
        $SQL_IP = GUICtrlRead($Input1) ;SQL服务器名
        $SQL_UID = GUICtrlRead($Input2);SQL服务器登录名
        $SQL_PW = GUICtrlRead($Input3) ;SQL服务器登录密码
        $SQL_Name = GUICtrlRead($Combo1) ;SQL数据库名
        $SQL_Table = GUICtrlRead($Combo2) ;SQL表名
        $conn = ObjCreate("ADODB.Connection")
        $conn.Open("driver={SQL Server};server=" & $SQL_IP & ";uid=" & $SQL_UID & ";pwd=" & $SQL_PW & ";database=" & $SQL_Name)
        $RS = ObjCreate("ADODB.Recordset")
        $RS.ActiveConnection = $conn
        $RS.Open("select column_name,data_type,CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '" & $SQL_Table & "'") ;关键SQL语句,获取表中所有字段的名称、类型和长度
        If @error = 0 Then ;判断数据库是否正常连接
                If ($RS.Fields(0).value) <> "" Then
                        Local $i = 0
                        While Not $RS.eof And Not $RS.bof
                                If @error = 1 Then ExitLoop
                                If $i > 0 Then ReDim $ArrZiduan[UBound($ArrZiduan) + 1][3] ;调整二维数组行数
                                For $j = 0 To 2
                                        $aArr[$j] = $RS.Fields($j).value ;读取单行值赋给一维数组
                                Next
                                $ArrZiduan[$i][0] = $aArr[0] ;将一维数组值赋给二维数组
                                $ArrZiduan[$i][1] = $aArr[1] ;将一维数组值赋给二维数组
                                $ArrZiduan[$i][2] = $aArr[2] ;将一维数组值赋给二维数组
                                $RS.movenext
                                $i = $i + 1
                        WEnd
                        ;_ArrayDisplay($ArrZiduan);显示数组数据
                        ;下面的循环用于设置ListView的标题
                        For $k = 0 To UBound($ArrZiduan) - 1
                                If $k = 0 Then
                                        $ListViewBiaoTi = $ArrZiduan[$k][0]
                                Else
                                        $ListViewBiaoTi = $ListViewBiaoTi & "|" & $ArrZiduan[$k][0]
                                EndIf
                        Next
                        GUICtrlSetState($ListView2, $GUI_HIDE) ;隐藏程序启动时创建的ListView2
                        $ListView1 = GUICtrlCreateListView($ListViewBiaoTi, 32, 168, 817, 481) ;创建ListView
                Else
                        GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ;发送消息,清空listview1控件
                        _GUICtrlStatusBar_SetText($StatusBar1, "ERROR!!!!    数据库“" & $SQL_Name & "”上没有找到用户表,请检查。", 2)
                EndIf
        Else
                ;_GUICtrlStatusBar_SetText($StatusBar1, "ERROR!!!!数据库打开错误。", 2)
        EndIf
        $conn.Close
        $RS.close
EndFunc   ;==>DaKaiSQL

Func DuSQL20()
        Local $conn, $RS, $Cb1
        Local $FenGeFu = ""
        ;计算“|”的数量
        For $k = 0 To UBound($ArrZiduan) - 2
                $FenGeFu = $FenGeFu & "|"
        Next
        ;得到$RS.Fields(0).value语句
        Local $RS_Fields_value = ""
        For $m = 0 To UBound($ArrZiduan) - 1
                If $m = 0 Then
                        $RS_Fields_value = "$RS.Fields(" & $m & ").value"
                Else
                        $RS_Fields_value = $RS_Fields_value & ' & "|" & $RS.Fields(' & $m & ').value'
                EndIf
        Next

        GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ;发送消息,清空listview1控件
        $SQL_IP = GUICtrlRead($Input1) ;SQL服务器名
        $SQL_UID = GUICtrlRead($Input2);SQL服务器登录名
        $SQL_PW = GUICtrlRead($Input3) ;SQL服务器登录密码
        $SQL_Name = GUICtrlRead($Combo1) ;SQL数据库名
        $SQL_Table = GUICtrlRead($Combo2) ;SQL表名
        $conn = ObjCreate("ADODB.Connection")
        $conn.Open("driver={SQL Server};server=" & $SQL_IP & ";uid=" & $SQL_UID & ";pwd=" & $SQL_PW & ";database=" & $SQL_Name)
        $RS = ObjCreate("ADODB.Recordset")
        $RS.ActiveConnection = $conn
        $RS.Open("select TOP 20 * from " & $SQL_Table);读取前20个值
        If @error = 0 Then ;判断数据库是否正常连接
                While Not $RS.eof And Not $RS.bof
                        If @error = 1 Then ExitLoop
                        $Item1 = GUICtrlCreateListViewItem($FenGeFu, $ListView1)
                        GUICtrlSetData($Item1, $RS_Fields_value)
                        $RS.movenext
                WEnd
        Else
                _GUICtrlStatusBar_SetText($StatusBar1, "ERROR!!!!    数据库打开错误。", 2)
        EndIf
        $conn.Close
        $RS.close
EndFunc   ;==>DuSQL20
现在就是GUICtrlSetData($Item1, $RS_Fields_value)这句有问题!
我应该怎么办呢?
发表于 2014-11-27 20:29:22 | 显示全部楼层
回复 1# meteor0330

搜索下关键字"数据库",好好看看别人是怎样操作数据库的.

你那变量只是普通的变量赋值,跟数据库查询还差了十万八千里呢!
 楼主| 发表于 2014-11-27 23:50:50 | 显示全部楼层
二楼没有理解我的意思,我现在正在写一个通用的数据库查询程序。
        已经写到了用户输入sql数据库的服务器地址和登录名、密码后,程序自动读出服务器上的所有数据库,当用户选择了需要操作的数据库后,程序自动读出该库下的所有用户表,用户选择好表后,程序自动读出该表下的所有字段名及类型和长度,并根据字段名创建一个listview。
前面这些都能正常运行了,现在我要读出这个表中的数据并填入这个listview中时遇到了问题。因为每个库中的各个表的字段都会有多有少,所以那个$RS.Fields(0).value & "|" & $RS.Fields(1).value的语句也会有长有短。我就想着把它们放到一个字符变量中,然后再把这个变量中的字符当成语句来执行。
        现在这一步实现不了了。所以想请各位帮帮忙!
发表于 2014-11-28 01:00:44 | 显示全部楼层
本帖最后由 netegg 于 2014-11-28 01:02 编辑

$RS_Fields=$RS.Fields(0).value & "|" & $RS.Fields(1).value
$Item1= GUICtrlCreateListViewItem($RS_Fields,$ListView1)
发表于 2014-11-28 05:42:17 | 显示全部楼层
去掉引号啊。为什么家引号呢?
发表于 2014-11-28 09:20:34 | 显示全部楼层
一句就可以了

$Item1= GUICtrlCreateListViewItem($RS.Fields(0).value & "|" &$RS.Fields(1).value,$ListView1)
 楼主| 发表于 2014-11-28 13:04:18 | 显示全部楼层
回复 4# netegg

谢谢4楼的元老,不过我的问题还是没有解决,可能是我想弯了。
我把相关函数源码贴上了,我想实现的功能就如我3楼所说,请帮帮忙,不胜感激!!!
发表于 2014-11-28 13:09:24 | 显示全部楼层
本帖最后由 netegg 于 2014-11-28 13:11 编辑

先countcolume,或者直接读出来,转成一个二维数组$array[0][$n(根据你当时读出的数据)],_guilistview_addarray就行了
 楼主| 发表于 2014-11-28 13:21:37 | 显示全部楼层
回复 8# netegg


谢谢!!!

那有没有一个方法能像我做的这样,把一部分语句先放到一个变量中,然后需要执行的时候再从此变量中调出来用?

我记得以前用ASP写网站的时候是可以这样的,不知道AU3能不能做到呢?
发表于 2014-11-28 13:29:53 | 显示全部楼层
可以是可以
发表于 2014-11-28 13:30:24 | 显示全部楼层
帮助里有关于autoit单步执行语句的方法
 楼主| 发表于 2014-11-28 13:30:42 | 显示全部楼层
回复 10# netegg


    呃——!!

怎么做呢?
发表于 2014-11-28 13:31:36 | 显示全部楼层
格式4: AutoIt3.exe [/ErrorStdOut] /AutoIt3ExecuteLine "脚本代码"
                执行一行代码.
 楼主| 发表于 2014-11-28 13:47:08 | 显示全部楼层
回复 13# netegg

不好意思,刚才没看到你11楼的帖子!

刚看了看帮助文档的介绍,看来是我想得太天真了!!

还是按你8楼的方法先试一下了!
发表于 2014-11-28 14:06:26 | 显示全部楼层
格式4: AutoIt3.exe [/ErrorStdOut] /AutoIt3ExecuteLine "脚本代码"
                执行一行代码.
netegg 发表于 2014-11-28 13:31



    Execute(字符串)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-19 18:16 , Processed in 0.088088 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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