2009-08-28 97 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。