2009-08-28 70 views
2

由于某些原因,我的存储过程全部执行两次!我有一个静态函数,根据名称和参数运行SP并填充数据表。存储过程执行两次!

Public Shared Function RunSP(ByVal spName As String, ByRef spParams As Dictionary(Of String, String), ByRef pDataTable As DataTable) As Integer 
    Dim cmd As New SqlCommand 
    Dim lAdapter As SqlDataAdapter 
    Try 
     cmd.Connection = New SqlConnection(ConnectionString) 
     cmd.Connection.Open() 
     cmd.CommandType = CommandType.StoredProcedure 
     cmd.CommandText = spName 

     For Each item As KeyValuePair(Of String, String) In spParams 
      cmd.Parameters.AddWithValue(item.Key, item.Value) 
     Next 

     cmd.ExecuteNonQuery() 
     If Not pDataTable Is Nothing Then 
      lAdapter = New SqlDataAdapter(cmd) 
      lAdapter.Fill(pDataTable) 
     End If 
     RunSP = 0 
    Catch ex As Exception 
     If (Not cmd Is Nothing) Then 
      cmd.Dispose() 
     End If 
     RunSP = -1 
    End Try 
End Function 

代码有问题吗?我使用调试器进行了检查,并且相应的SP肯定只被调用过一次,即该函数仅对特定的插入函数运行一次,但将两件事插入表中。

回答

11

您正在手动执行一次(cmd.ExecuteNonQuery()),则适配器将执行一次(New SqlDataAdapter(cmd)... Fill(...))。因此两次。你是否想要为适配器使用不同的命令?

+0

我想返回一个DataTable,有没有办法再次执行查询,或者我应该放弃“ExecuteNonQuery”部分? – DisgruntledGoat 2009-08-28 11:15:26

+2

废弃ExecuteNonQuery部分。这通常用于运行不返回行的代码,例如更新和删除。 – MartW 2009-08-28 11:16:22

5

您正在运行存储过程两次,一次是cmd.ExecuteNonQuery,然后是第二次运行lAdapter.Fill。