找回密码
 加入
搜索
查看: 4312|回复: 13

[AU3基础] [已解决]答案见11楼---有没有函数能够实现复位功能或者批处理中的Goto功能?

  [复制链接]
发表于 2010-12-27 14:40:48 | 显示全部楼层 |阅读模式
本帖最后由 kingfirekkk 于 2011-1-13 10:42 编辑

像有些自己定义的UDF函数,如果执行一遍是没有问题,但再执行第二遍的时候,就会提示错误,如何解决这类问题?代码附后:
错误代码为:
C:\Users\Administrator\Desktop\GUISQL.au3 (66) : ==> ???????????.:
$data = $data & $array[$rows][$fields - 1]
$data = $data & $array^ ERROR

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <MYSQL.AU3>
Global $SERVER = '192.168.0.1'
Global $Dll, $today = today()

__MySQL_ExtractEmbeddedDLL()
_MySQL_InitLibrary()
$MysqlConn = _MySQL_Init()
Global $pass = "test"
Global $connected = _MySQL_Real_Connect($MysqlConn, $SERVER, "root", $pass, "test")
If $connected = 0 Then
        $errno = _MySQL_errno($MysqlConn)
;~         MsgBox(0, "Error:", $errno & @LF & _MySQL_error($MysqlConn))
        If $errno = $CR_UNKNOWN_HOST Then MsgBox(0, "Error:", "$CR_UNKNOWN_HOST" & @LF & $CR_UNKNOWN_HOST)
        _MySQL_Close($MysqlConn)
        _MySQL_EndLibrary()
;~         Exit
EndIf

$Form1 = GUICreate("数据库状态统计", 615, 438, 227, 160)
$Button1 = GUICtrlCreateButton("统计", 200, 296, 193, 49)
$Label1 = GUICtrlCreateLabel("今日写入数据总笔数:", 112, 120, 124, 17)
$Label2 = GUICtrlCreateLabel("", 240, 120, 36, 17)
$Label3 = GUICtrlCreateLabel("今日张三写入数据总笔数:", 88, 144, 148, 17)
$Label4 = GUICtrlCreateLabel("今日李四写入数据总笔数:", 88, 168, 148, 17)
$Label5 = GUICtrlCreateLabel("", 240, 144, 36, 17)
$Label6 = GUICtrlCreateLabel("", 240, 168, 36, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        Sleep(1000)
                                GUICtrlSetData($Label2,p_L1())
                                GUICtrlSetData($Label5,c_zs())
                                GUICtrlSetData($Label6,c_ls())
        EndSwitch
WEnd




Func P_L1()
        ;****************统计今日数据;****************
        _MySQL_Real_Query($MysqlConn, "SELECT count(DISTINCT name) FROM mbtest WHERE 'timedate' like '2010-12-27%';")
        $res = _MySQL_Store_Result($MysqlConn)
        _MySQL_Store_Result($MysqlConn)
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)
        $array = _MySQL_Fetch_Result_StringArray($res)
        $data = ""
        $data = $data & $array[$rows][$fields - 1]
        Return $data
EndFunc   ;==>P_L1

Func C_Zs()
        ;****************统计今日数据;****************
        _MySQL_Real_Query($MysqlConn, "SELECT count( DISTINCT `name` ) FROM mbtest where `Timedate` like '" & $today & "%' and `name` like 张三';")
        $res = _MySQL_Store_Result($MysqlConn)
        _MySQL_Store_Result($MysqlConn)
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)
        $array = _MySQL_Fetch_Result_StringArray($res)
        $data = ""
        $data = $data & $array[$rows][$fields - 1]
        Return $data        
EndFunc   ;==>C_Zs

Func C_ls()
        ;****************统计今日数据;****************
        _MySQL_Real_Query($MysqlConn, "SELECT count( DISTINCT `name` ) FROM mbtest where `Timedate` like '" & $today & "%' and `name` like '李四';")
        $res = _MySQL_Store_Result($MysqlConn)
        _MySQL_Store_Result($MysqlConn)
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)
        $array = _MySQL_Fetch_Result_StringArray($res)
        $data = ""
        $data = $data & $array[$rows][$fields - 1]
;~         GUICtrlSetData($Label6, $data)
        Return $data
EndFunc   ;==>C_ls

Func today()
        Return @YEAR & "-" & @MON & "-" & @MDAY
EndFunc   ;==>today


另外:有没有函数或者代码能够实现复位的功能,让代码重新从头开始执行或者像批处理那样,能够定义到任何标签定位的位置?
发表于 2010-12-27 15:43:31 | 显示全部楼层
把要重复执行的代码定义为函数调用即可
一些必需的变量先全局声明下
发表于 2010-12-27 16:02:57 | 显示全部楼层
执行第一次没有问题,执行第二次出问题,肯定是语法不严谨造成的,仔细检查检查。举个例子,你扫描目录生成一个数组,在基由这个数组进行一个For 循环,正常情况下不会出错,但是如果扫描的目录内没有文件,而你的命令中没有检查这种错误的话,就执行不下去了。
发表于 2010-12-27 16:15:53 | 显示全部楼层
用中断输出查看下出错行相关的变量值
        $fields = _MySQL_Num_Fields($res) ;是不是返回数字
        $rows = _MySQL_Num_Rows($res) ;是不是返回数字
        $array = _MySQL_Fetch_Result_StringArray($res) ;是不是返回数组
        $data = ""
        $data = $data & $array[$rows][$fields - 1] ; $array[$rows][$fields - 1] 数组引用是不是超边界
                
发表于 2010-12-27 17:18:45 | 显示全部楼层
Goto(函数)功能
Call("函数名","参数...")
 楼主| 发表于 2010-12-28 08:52:46 | 显示全部楼层
谢谢5楼的兄弟,还是对F1帮助内容不熟啊....另外,3楼4楼的高手,能否给个例子...文字的始终没有例子有说服力啊。
发表于 2010-12-29 21:03:39 | 显示全部楼层
本帖最后由 nbmpe 于 2010-12-29 21:55 编辑

我也遇到过此类问题,花费近一天时间才搞定,我处理的方法是这样的.举个例子.

$A = _MYSQL_REAL_QUERY($MYSQLCONN, "DESC TEST")
当执行第一次的时候为 $A 和@ERROR 都为0, 第二次时就$A=1 以至于后面的语句都执行出错.
我解决的方法是这一句后面跟一句
$res = _MySQL_Store_Result($MysqlConn)
_MySQL_Free_Result($res)

这样就没事了. 我是放在FOR NEXT   中.  用的,   
为的是写一千万条不同记录,验证数据过多,读取速问题. 这种方法待重新验证.  没具体验证多次.  只是我这样这样可用. 你可以试下
期侍楼下更好的办法.

关于GOTO 我也不会, 补充一下.
IF MSGBOX(0,0,"FDSFDS") = 1 THEN
          ;JKJK;L
ELSE
      MSGBOX(0,0,"FDSFDS")    这样写当然不行的,我要达到是,不选确确定再出来这个窗品,直到他的值为1,用批处理可以达到,但用AU3怎么达到,谁写个例子.期待高手.
ENDIF
发表于 2010-12-31 13:45:19 | 显示全部楼层
今天看了你的代码 ,可以缩写成一个自定义函数 ,这样写太过于麻烦 .
发表于 2010-12-31 13:53:29 | 显示全部楼层
_MySQL_Store_Result取得的结果是存放在客户端的内存当中,如果不释放,结果就一直都有效.
较早前就在另一个贴子中提醒过你了.
另外,我想请教下
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)

        $array = _MySQL_Fetch_Result_StringArray($res)
做的不是同样的事吗?
发表于 2010-12-31 15:50:26 | 显示全部楼层
楼上 ,正解 ,学习了 .研究下数组 ,再简化一下代码 .
发表于 2010-12-31 22:37:56 | 显示全部楼层
本帖最后由 netegg 于 2010-12-31 22:41 编辑

帮助里的原话------>
4. Where is the "goto" command?
Gone.  It's evil.  No, you can't ask why - it just is.  It's like that lump of rock they find in the microwave at the end of the film Time Bandits :)

AutoIt v3 features most of the common "loops" in use today and with these Goto is no longer required.  Look up While, Do, For, ExitLoop, ContinueLoop and Functions for the modern way of doing things :)  And while you are looking at help file sections check out these on loops, conditional statements and functions.  I promise you, once you have got the hang of such things you will be able to script in virtually any other language within a couple of minutes.

Just to get you started, the most basic use of Goto in version 2.64 was an infinite loop like:

:mylabel
...do something...
...and something else...
goto, mylabel

A simple v3 version of that is a While loop that is always "true".

While 1 = 1
   ...do something...
   ...do something else...
Wend
大概翻译:google翻译的,凑合看吧
4。哪里是“转到“命令?
走了。它的邪恶。不,你不能问为什么 -它只是。它的岩石块这样在他们的电影时光大盗结束微波找到:)

AutoIt的v3的特点常见的“循环“今天在使用这些转到最重要的是不再需要。查一查虽然,做,ExitLoop,ContinueLoop和做事的现代方式的功能:)虽然你是在寻找帮助文件的部分检查出循环,条件语句和函数这些。我答应你,一旦你得到了你这样的事情挂将在几乎任何其他脚本语言能够在几分钟的时间。

只是让你起步,转到最基本的版本2.64是一个无限循环使用,如:

:MyLabel的
做什么......
和别的东西......
后藤MyLabel的

一个简单的v3的该版本是一个while循环,它永远是“真“。

而1= 1
   做什么......
   做其他事......
蜿蜒
发表于 2011-1-6 05:03:05 | 显示全部楼层
看了楼上明白了,用循环代替GOTO.
WHILE 1 
IF MSG(0,0,"FDSA") = 1 THEN EXITLOOP 
WEND
发表于 2011-1-6 05:44:37 | 显示全部楼层
回复 9# ceoguang
再请教一下,我看过 _MySQL_Fetch_Result_StringArray,好像Local $ResultArr[$rows + 1][$fields]声明过,但执行的返回值为什么不能直接写入指定列表,须再重新用$DATA3[$I][%I]这样的格式再读一下.   还有 写入指定LISTVIEW是否可以多条查询结一次性写入.???
Func _last($number)
        
        $query = "select * from abc04 limit 1,8"
        _MySQL_Real_Query($MysqlConn, $query) 
        $res = _MySQL_Store_Result($MysqlConn);记录查询回来的结果
        
        #cs
        $fields = _MySQL_Num_Fields($res)
        $rows = _MySQL_Num_Rows($res)
        MsgBox(0, 0, $fields & @CRLF & $rows)
        #ce
        
        $data3 = _MySQL_Fetch_Result_StringArray($res)
        ;MsgBox(0,0,UBound ($data3)-1)
        GUICtrlCreateListViewItem($data3, $List)
        _MySQL_Free_Result($res)
EndFunc   ;==>_last
发表于 2011-1-7 19:10:34 | 显示全部楼层
如果我没记错,_MySQL_Fetch_Result_StringArray返回的是一个多维数组,你当然只能用数组方式来取值.
LISTVIEW当然可以一次性写入.因为没有这方面的限制.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-22 04:15 , Processed in 0.087330 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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