C# - 更新刚刚更新的列

时间:2012-04-14 07:49:52

标签: c# dataadapter

我有一个网络表单。有20个字段对应于数据库表中的列。假设有一条记录有一个BIRTHDATE列,我将它的值从2000年7月13日改为12-FEB-1985。但我不接触其余的栏目。在C#中是否有办法运行这样的更新语句:

UPDATE TABLE1 SET BIRHDATE=NEWVALUE WHERE ID=1111

而不是像这样更新行的所有列:

UPDATE TABLE1 SET COLUMN1=NEWVALUE1, COLUMN2=NEWVALUE2,......,BIRTHDATE=NEWVALU

我认为这会浪费资源。我错了吗?我认为DataAdapter就是出于这个目的,但我不确定。

1 个答案:

答案 0 :(得分:2)

您可以通过这种方式向Oracle Engine发送直接更新语句。

using (OracleConnection cnn = new OracleConnection(connString)) 
using (OracleCommand cmd = new OracleCommand("UPDATE TABLE1 SET BIRHDATE=:NewDate WHERE ID=:ID", cnn)) 
{ 
        cmd.Parameters.AddWithValue(":NewDate", YourDateTimeValue);
        cmd.Parameters.AddWithValue(":ID", 111);
        cnn.Open(); 
        cmd.ExecuteNonQuery(); 
}

编辑:

如果您不知道哪些字段已更改(并且不想使用ORM工具),那么您需要保留用于填充字段的原始DataSource(数据表,数据集?)。然后更新相关行并使用OracleDataAdapter。

using(OracleConnection cnn = new OracleConnection(connString)) 
using (OracleCommand cmd = new OracleCommand("SELECT * FROM TABLE1 WHERE 1=0", cnn))  
{
     OracleAdapter adp = new OracleDataAdapter();
     adp.SelectCommand = cmd;
     // The OracleDataAdapter will build the required string for the update command
     // and will act on the rows inside the datatable who have the  
     // RowState = RowState.Changed Or Inserted Or Deleted
     adp.Update(yourDataTable);
}

请记住,这种方法效率低下,因为它需要两次访问数据库。第一个发现你的表结构,第二个更新行更改。此外,要使OracleDataAdapter准备所需的UpdateCommand / InsertCommand / DeleteCommand,它需要表中的主键。

相反,如果要更新许多行,这很方便。

最后一个替代方案(可能是最快的)是StoredProcedure,但在这种情况下,您需要回到我的第一个示例并调整OracleCommand以使用StoredProcedure,(将所有字段添加为参数,将CommandType更改为CommandType。 StoredProcedure并将命令的文本更改为StoredProcedure的名称。然后StoredProcedure将选择需要更新的字段。