C#- 更新刚刚更新的列

本文关键字:更新 C#- | 更新日期: 2023-09-27 18:31:10

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

UPDATE TABLE1 SET BIRHDATE=NEWVALUE WHERE ID=1111

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

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

我认为这将是对资源的浪费。我错了吗?我认为数据适配器是为此目的,但我不确定。

C#- 更新刚刚更新的列

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

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工具),那么您需要保留用于最初填充字段的原始数据源(数据表,数据集?然后更新相关行并使用 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,并将命令的文本更改为 StoredProcess 的名称)。然后,存储过程将选择需要更新的字段。