2012-11-19 104 views
2

我有一種情況,在每分鐘需要從SQL Server處理大約200條記錄來處理它並更新狀態字段爲1成功和不變/ 0爲200記錄失敗,然後寫回到DB。在這種情況下,我應該通過.net方法對數據表進行更改,然後在循環結束時根據處理狀態調用更新方法。數據集更新與SQL查詢

或者我應該去製作這樣

String sql = "update customer set status = 1 where id in (" 
while records in dataset 
    sql = sql + dataset.getId + "," 
end while 
and the execute sql; 

循環哪種方法更有效的直接的方法?我真正想知道的是,如果我只對dataTable中的一列進行更改並更新,那麼在後端將如何執行該查詢?它是每行只有一個sql或多個?如果它的倍數那麼我應該通過舊的SQL方法還是有其他一些建議的方法。

+0

究竟你的過程是什麼意思?如果這是對數據的更改,並且您將更改寫回數據庫,則可能需要考慮觸發器。 – Raj

+0

@Raj過程是別的。我沒有改變任何其他列。只是假設我想根據通過連接到其他服務器獲取的細節來檢查某些內容,並且如果成功,我將不得不在狀態列中用1更新該行。否則不會改變。 –

+0

您的第二個方法將會高效,因爲它將作爲單個查詢來執行。但是yourDataAdapter.Update(datatable)將一次執行單個行,因此會執行200個查詢(最差情況)。 但嘗試有一些更好的解決方案,就像我在存儲過程中的數據庫級別所做的那樣。 – Kash

回答

0

只要你的對象沒有數百個屬性,性能的差異就會很小。您將花更多時間編寫代碼來使用將與您的對象交互的DataSet或SQL Query,而不是這些方法之間的差異。

編輯

至於「它是如何在後臺執行」,RDBMS中會生成一個「執行計劃」,爲查詢它即將運行。這將花費更多的時間爲100個不同的查詢生成執行計劃,而不是運行相同的查詢(使用冗餘/無用信息)100次。

+0

那麼在我的情況下,建議的方法究竟是什麼。我想知道如何在後端實現DataTable.update。當多行中的同一列被更新時,它是一個查詢還是不同的一個? –

0

以下代碼將刪除在給定字段中使用1(「testfield」)的記錄。如果您正在測試領域是一個日期,然後查詢變得更加複雜:

 Dim MyValue as Byte 
     Dim TableName, FieldName As String 

     Dim ConnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="c:\mydata\myfile.mdb" 
     Dim cn As New OleDbConnection(ConnString) 
     cn.Open() 

     Dim qry As String 
     Dim cmd As New OleDbCommand(qry, cn) 
     TableName="salary" 
     FieldName = "testfield" 
     myvalue = 1 
     qry = " DELETE from " & TableName & " WHERE (" & FieldName & " = '" & myvalue & "')" 
     Dim cmd As New OleDbCommand(qry, cn) 
     recordsadded = cmd.ExecuteNonQuery() 
1

你的第二個方法將是有效的,因爲它會作爲一個單獨的查詢執行。 但是,yourDataAdapter.Update(datatable)將一次執行單個行,因此會執行200個查詢(最壞的情況)。

檢查這個 http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update(v=vs.80).aspx

它說:

Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified DataSet from a DataTable named "Table."

注:for each inserted, updated, or deleted row

我已經2年前測試了這個dataAdapter.Update,它由行執行的查詢行。

但是儘量在有最終DB這樣的更新邏輯...

update c set status = 1 from customer as c inner join yourOtherTable as t on c.id = t.id where ....