我有一种情况,我需要在每分钟从SQL Server处理大约200条记录并处理它并更新状态字段,其中1表示成功,未更改/ 0表示200条记录失败,然后写回DB。在这种情况下,我应该通过.net方法对数据表进行更改,然后在循环结束时根据处理状态调用update方法。
或者我应该像这样制作循环的直接方法
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 :(得分: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 ....
答案 1 :(得分:0)
只要您的对象没有数百个属性,性能上的差异就会非常微不足道。您将花费更多时间编写代码以使用与您的对象交互的DataSet或SQL Query,而不是这些方法之间的差异。
修改强>
至于"如何在后端执行",RDBMSes将生成一个"执行计划"对于它即将运行的查询。服务器需要花费更多时间来生成100个不同查询的执行计划,而不是运行相同查询(带有冗余/无用信息)100次。
答案 2 :(得分: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()