why is this sql command executed twice?

B

Bob

Hi,

i wrote code for inserting data into a table, but it runs twice. If i remove
the line: "comd.ExecuteNonQuery()", then it runs once; but i thought that
line was necessary for executing the sql command ... if i remove "
oConnection.Open()", then error: "connection is not open".

see my code:
Dim oConnection As SqlConnection
Dim comd As SqlCommand
Dim sConnectionString As String
Dim sql, na As String
Dim iden As Integer

sConnectionString =
ConfigurationManager.ConnectionStrings("myconn").ConnectionString.ToString()
sql = "INSERT INTO table(...) VALUES (...);"
oConnection = New SqlConnection(sConnectionString)
comd = New SqlCommand(sql, oConnection)
comd.Parameters.Add("@var1", SqlDbType.NVarChar, 10).value="ok"
oConnection.Open()
comd.ExecuteNonQuery()

Thanks
Bob
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

Bob said:
Hi,

i wrote code for inserting data into a table, but it runs twice. If i remove
the line: "comd.ExecuteNonQuery()", then it runs once; but i thought that
line was necessary for executing the sql command ... if i remove "
oConnection.Open()", then error: "connection is not open".

see my code:
Dim oConnection As SqlConnection
Dim comd As SqlCommand
Dim sConnectionString As String
Dim sql, na As String
Dim iden As Integer

sConnectionString =
ConfigurationManager.ConnectionStrings("myconn").ConnectionString.ToString()
sql = "INSERT INTO table(...) VALUES (...);"
oConnection = New SqlConnection(sConnectionString)
comd = New SqlCommand(sql, oConnection)
comd.Parameters.Add("@var1", SqlDbType.NVarChar, 10).value="ok"
oConnection.Open()
comd.ExecuteNonQuery()

Thanks
Bob

That code only runs the query once. What does the rest of the code do?

Also, I see that you edited out part of the SQL query. Anything else you
edited out?
 
B

Bob

Thanks for replying.

There is indeed more code: here is the whole code:
--------------------------------------------------
Dim trans As SqlTransaction = Nothing 'new
Dim oConnection As SqlConnection
Dim comd As SqlCommand
Dim sConnectionString As String
Dim sql, na As String
Dim iden As Integer
sConnectionString =
ConfigurationManager.ConnectionStrings("myconn").ConnectionString.ToString()
sql = "INSERT INTO table(...) VALUES (...); SELECT
SCOPE_IDENTITY();"
oConnection = New SqlConnection(sConnectionString)
comd = New SqlCommand(sql, oConnection)
comd.Parameters.Add("@var1", SqlDbType.NVarChar, 10).value="ok"

Try 'new

oConnection.Open()
comd.ExecuteNonQuery()

trans = connection.BeginTransaction 'new
comd.Transaction = trans 'new

'here another insert sqlcommand but even if i remove this part, it still
executes twice ...

trans.Commit() 'new
Catch sqlEx As SqlException
If trans IsNot Nothing Then
trans.Rollback()
End If
Throw New Exception("error!", sqlEx)
Return

Finally
If connection IsNot Nothing Then
connection.Close()
End If
End Try
Response.Redirect("fin.aspx")
End Sub
 
B

Bob

I think it has to do with the second part of the query: SELECT
SCOPE_IDENTITY()"

How can i then make that the insert only executes once?
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

Bob said:
Thanks for replying.

There is indeed more code: here is the whole code:
--------------------------------------------------
Dim trans As SqlTransaction = Nothing 'new
Dim oConnection As SqlConnection
Dim comd As SqlCommand
Dim sConnectionString As String
Dim sql, na As String
Dim iden As Integer
sConnectionString =
ConfigurationManager.ConnectionStrings("myconn").ConnectionString.ToString()
sql = "INSERT INTO table(...) VALUES (...); SELECT
SCOPE_IDENTITY();"
oConnection = New SqlConnection(sConnectionString)
comd = New SqlCommand(sql, oConnection)
comd.Parameters.Add("@var1", SqlDbType.NVarChar, 10).value="ok"

Try 'new

oConnection.Open()
comd.ExecuteNonQuery()

trans = connection.BeginTransaction 'new
comd.Transaction = trans 'new

'here another insert sqlcommand but even if i remove this part, it still
executes twice ...

trans.Commit() 'new
Catch sqlEx As SqlException
If trans IsNot Nothing Then
trans.Rollback()
End If
Throw New Exception("error!", sqlEx)
Return

Finally
If connection IsNot Nothing Then
connection.Close()
End If
End Try
Response.Redirect("fin.aspx")
End Sub

I see that you use the same command object for the second query. It
still contains the query and parameters from the first call, do you
replace them?

Although unlikely to be the cause, you can try to remove the "select
scope_identity()" part of the query. You are not using that anyway.
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

How do you use the result from scope_identity in the second insert, as
you don't accept any result from the first query?
the parameters are replaced, and i use the SCOPE_IDENTITY() for the second
insert
 
B

Bob

i forgot this line which gets the value of the scope_identity:
iden = Convert.ToInt32(comd.ExecuteScalar())



"Göran Andersson said:
How do you use the result from scope_identity in the second insert, as you
don't accept any result from the first query?
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

Oh, so you execute the query again to get the identity?

Guess why it's executed twice? ;)

That line will add another record, but it will not get the identity of
either of the records added. The result of the query contains two record
sets. The first set is returned by the insert query and is empty. The
second set contains the identity returned by the select query.
i forgot this line which gets the value of the scope_identity:
iden = Convert.ToInt32(comd.ExecuteScalar())
 
B

Bob

That's what i suspected in my earlier message in this thread.
The only solution i found is removing "comd.ExecuteNonQuery()".
Is that a good thing? If not, what can i do?
Thanks



Göran Andersson said:
Oh, so you execute the query again to get the identity?

Guess why it's executed twice? ;)

That line will add another record, but it will not get the identity of
either of the records added. The result of the query contains two record
sets. The first set is returned by the insert query and is empty. The
second set contains the identity returned by the select query.
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

Yes, if you only want to execute the query once, you should only execute
the query once.

I get the feeling that you just pasted together some code from different
examples, not knowing what the code really does. If so, I suggest that
you look up the commands in the documentation and read what they really
do. Guessing is not really a good way to write stable code.
That's what i suspected in my earlier message in this thread.
The only solution i found is removing "comd.ExecuteNonQuery()".
Is that a good thing? If not, what can i do?
Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top