2

我有一种情况,每分钟我需要从 SQL Server 处理它获取大约 200 条记录,并将状态字段更新为 1 表示成功,不变/0 表示 200 条记录失败,然后写回 DB。在这种情况下,我应该通过 .net 方法对数据表进行更改,然后在循环结束时根据处理状态调用更新方法。

还是我应该采用直接的方法来制作这样的循环

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 方法还是有其他建议的方法。

4

3 回答 3

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,它逐行执行查询。

但是尝试在数据库端有这个更新逻辑,比如......

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

于 2013-02-21T19:25:33.883 回答
0

只要您的对象没有数百个属性,性能上的差异就会非常微不足道。您将花费更多的时间编写代码以使用与您的对象交互的 DataSet 或 SQL Query,而不是这些方法之间可能产生的差异。

编辑

至于“如何在后端执行”,RDBMSes 将为即将运行的查询生成一个“执行计划”。服务器为 100 个不同的查询生成执行计划所花费的时间比运行相同的查询(带有冗余/无用信息)100 次所花费的时间更多。

于 2012-11-19T05:47:13.397 回答
0

以下代码将删除使用的给定字段(“testfield”)中带有 1 的记录。如果您正在测试的字段是日期,那么查询会变得更加复杂:

        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()
于 2013-01-03T20:47:57.553 回答