[Gambas-user] Succesful multiple Insert return a failed Result
Yeshua Rodas
yrodas at upnfm.edu.hn
Tue Apr 7 11:27:51 CEST 2020
Hello people.
I'm having an issue working with SQLite.
I have a particular function for insert a batch of data and return the
number of affected rows:
Public Function myInsert() as Integer
' I have another function for create the connection, so
Dim conn as Connection = getMyConnection()
' I prepare a SQL with multiple INSERT, like:
Dim sQuery As String[] = []
sQuery.Push("INSERT INTO table (col1, col2, col3) VALUES (val11, val12,
val13)")
sQuery.Push("INSERT INTO table (col1, col2, col3) VALUES (val21, val22,
val23)");
sQuery.Push("INSERT INTO table (col1, col2, col3) VALUES (val31, val32,
val33)");
' Since I have already a valid and opened connection, I just execute all my
inserts in a single query call:
conn.Begin()
Dim insertResult As Result = conn.Exec(sQuery.Join(";"))
conn.Commit()
Return insertResult.Count
Catch
conn.Rollback()
Return -1
End
So, what I expect is that my function returns 3 and sees those 3 rows on my
table. However, what I'm getting is, on the table, the 3 inserted rows; but
on other hand, the "Catch" part is executed, returning my function -1
value.
I executed my program with a breakpoint just on "conn.Begin()" call to see
what is happening, and found that insertResult has the property Available
as False, and the Count as 0.
Also, instead of returning the 0 from insertResult, as I said, the Catch
part is executed, BUT the 3 inserted rows remain on the database.
I'm getting a bit confused with that.
Why could it be that if the Query is executed successfully, the Result is
not?
Should I reconsider to use the "Result way" via the Connection.Create()
call?
I try it.
Public Function myInsert() as Integer
' I have another function for create the connection, so
Dim conn as Connection = getMyConnection()
' I prepare a SQL with multiple INSERT, like:
Dim data as Collection[] = []
data.Push(["col1": val11, "col2": val12, "col3": val13])
data.Push(["col1": val21, "col2": val22, "col3": val23])
data.Push(["col1": val31, "col2": val32, "col3": val33])
conn.Begin()
Dim insertResult As Result = conn.Create("table")
For Each coll as Collection in data
For Each val as Variant in coll
insertResult[data.Key] = val
Next
insertResult.Update()
Next
conn.Commit()
Return insertResult.Count
Catch
conn.Rollback()
Return -1
End
By this approach the function returns 1. However, I think that this is
calling an INSERT CALL for each iteration. With 3 rows its OK, but what if
I have 10000 rows to insert? Can be the performance down by that way
instead of a single .Exec() call? Or doesn't matter since it is inside a
transaction?
Why the .Count property does not change?
Thank you all for your time and answers. :)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gambas-basic.org/pipermail/user/attachments/20200407/40faea3e/attachment.html>
More information about the User
mailing list