DataSet Update与SQL查询

时间:2012-11-19 03:32:53

标签: c# .net sql-server vb.net

我有一种情况,我需要在每分钟从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方法还是其他一些建议的方法。

3 个答案:

答案 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()