1

我有一个网络表格。有 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

我认为这会浪费资源。我错了吗?我认为 DataAdapters 就是为此目的,但我不确定。

4

1 回答 1

2

您可以通过这种方式向 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 工具),那么您需要保留最初用于填充字段的原始 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 将选择需要更新哪些字段。

于 2012-04-14T08:01:10.200 回答