Jump to content

Unable to retrieve inserted row count in MySQL using ADO from AutoIT


Recommended Posts

From AutoIT script (Pretty much same syntax as VBA), Tried connecting to MySQL Server. While i am able to insert a new row successfully, unable to verify the rowcount (# of inserted row - to verify success or failure).

Have tried two different methods -

  1. to use the RecordsAffected variable from Connection Execute function
  2. to use the RecordSet and retrieve the rowcount

But have been missing something and none of these methods return the actual row count.

Any help would be appreciated.!!!

Cross-posted in http://stackoverflow.com/questions/27411599/unable-to-retrieve-inserted-row-count-in-mysql-using-ado-from-autoit

MySQLConnect()

$EVENT_TIME= "2014-12-12 12:12:12"
$LSMCName='LSMC1'
$NEType='MME0001'
$OMTarFile='A_MME0011-60MIN-20141212-12-v.tar'
$CSVFile='12-00-S1AP.csv'
$KPIType='S1AP_HO'
$UpdateStatus='NotUpdated'
$ReTries='0'

If Not (InsertFileUpdateLog($EVENT_TIME,$LSMCName,$NEType,$OMTarFile,$CSVFile,$KPIType,$UpdateStatus,$ReTries)=1) Then
WriteLog("[Error] Record insertion failed for " & $EVENT_TIME & '" ' & $LSMCName & ' ' & $NEType & ' ' & $OMTarFile & ' ' & $CSVFile & ' ' & $KPIType & ' ' & ' NotUpdated 0')
EndIf
MysqlDisconnect()

;~ ####################### Sub Function Definitions

Func MySQLConnect()
Local $sDriver="MySQL ODBC 5.3 ANSI Driver"
Local $key = "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers", $val = RegRead($key, $sDriver)
If @error or $val = "" Then
SetError(2)
Return -1
EndIf

$constrim="DRIVER={MySQL ODBC 5.3 ANSI Driver};SERVER=localhost;DATABASE=pmdemo;uid=rootuser;pwd=rootpass;"
$oDBConnect = ObjCreate ("ADODB.Connection") ; <== Create SQL connection
$oDBConnect.Open ($constrim) ; <== Connect with required credentials

if @error Then
WriteLog("[Error] Failed to connect to the database")
SetError(2)
Return -2
Else
;MsgBox(0, "Success!", "Connection to database successful!")
Return 1
EndIf
EndFunc

Func MySQLDisConnect()
$oDBConnect.Close ; ==> Close the database
EndFunc

Func InsertFileUpdateLog($EVENT_TIME,$LSMCName,$NEType,$OMTarFile,$CSVFile,$KPIType,$UpdateStatus,$ReTries)
Local $RowCount = 0
Local $result = ObjCreate("ADODB.Recordset")

$sQuery = "INSERT INTO 4gc_fileupdatelog (id,EVENT_TIME,LSMC,NEType,TarFile,CSVFile,KPIFile,UpdateStatus,ReTries) VALUES ('0'," & _
"'" & $EVENT_TIME & "'," & _
"'" & $LSMCName & "'," & _
"'" & $NEType & "'," & _

"'" & $OMTarFile & "'," & _
"'" & $CSVFile & "'," & _
"'" & $KPIType & "'," & _
"'" & $UpdateStatus & "'," & _
"'" & $ReTries & "'" & _
") ON DUPLICATE KEY UPDATE ReTries=ReTries+1,UpdateStatus='" & $UpdateStatus & "';"

$result = $oDBConnect.Execute($sQuery,$RowCount)
If @error Then
MsgBox(1,1,"Error executing query...")
Return -2
EndIf

;# Method-1 : To use records affected from Execute function
If $RowCount >= 1 Then
MsgBox(1,1,"Success")
Else
MsgBox(1,1,"Failed, rowcount is:" & $RowCount )
EndIf

If Not ($result.bof AND $result.eof) Then
WriteLog("[Error] No Rows found")
Return 0
EndIf

;# Method-2 : To use recordsset object and retrieve the rows/columns count
If IsObj($result) And $result.EOF=False Then
$myarray=$result.GetRows()
$rows = UBound($myarray,1)
$cols = UBound($myarray,2)
MsgBox(1,1," rows: " & $rows & " cols: " & $cols)

If ($rows = 1) Then
WriteLog("[Info] Record inserted successfully")
Return 1
ElseIf ($rows = 2) Then
WriteLog("[Alert] Record updated successfully. affected row(s) is " & $rows)
Return $rows
Else

> Blockquote

WriteLog("[Error] Record insertion failed. affected row(s) is " & $rows)
Return 0
EndIf
EndIf

EndFunc
Edited by sivaramanm
Link to comment
Share on other sites

I had almost the same problem, Rowcount and shit didnt work, no matter what I tried.
When you do an .GetRows on your executed statement, you will get a 2-dimensional array back.

UBound($Array) gets you the # of rows

UBound($Array, 2) gets you the # of columns

I ended up using this method since it would give me the same result as rowcount would.

Edited by Radiance
Link to comment
Share on other sites

Thanks for that info. But as mentioned in my post, i am trying that GetRows option also.

That doesnt work either. PFA the error im getting.

BTW as i said, i am trying to insert a new row. Did GetRows work for you for an insert statement? if so would you mind sharing the code to cross check if i am missing anything?

Appreciate your help!

post-79561-0-89296800-1418324502_thumb.j

Edited by sivaramanm
Link to comment
Share on other sites

Pretty much yes, except that im trying to do an "insert into table... on duplicate key update " query which means it can be 1 inserted or 2 rows updated. And thats the value what i wanted to check for.

P.S. To be more specific - in this situation, row count will return 1 if a row was inserted, 2 if a row was updated and 0 if it was an identical match to an existing record (so neither insert nor update).

Link to comment
Share on other sites

I don't have enough knowledge of MySQL capabilities/bugs but maybe there exists something similar to SQLite's sqlite3_changes() which returns the number of DB changes within the last terminated statement over the current DB connection.

Edited by jchd

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...