c# - 带有可选参数的 SQL 更新命令?

标签 c# sql

我将大约 500 000 个对象插入到数据库中,其中许多对象是相同的(在数据库中具有相同的主键表示),但其他字段可能不同,所以我使用方法“更新 - 如果没有行受影响 - 插入” .问题是有时一个对象的某些字段设置为 null(无法从文件中读取)并且已经在数据库中设置了一些值,因此我将其更新为 null = 删除它。)如何实现场景,您将只更新字段不为空?

这是我现在如何做的一个简单示例:

private const string UpdateKun = "UPDATE pde.Kun SET Jmeno=@Jmeno WHERE Licence=@Licence";
private const string InsertKun = "INSERT INTO pde.Kun ([Licence], [Jmeno], [VykonnostniStupen]) VALUES (@Licence, @Jmeno, @VykonnostniStupen)";

var cmd = new SqlCommand(UpdateKun, conn, tran);
cmd.Parameters.AddWithValue("@Licence", kun.Licence);
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno);
RepairNulls(cmd.Parameters);
if (cmd.ExecuteNonQuery() > 0) return;

cmd = new SqlCommand(InsertKun, conn, tran);
cmd.Parameters.AddWithValue("@Licence", kun.Licence);
cmd.Parameters.AddWithValue("@Jmeno", kun.Jmeno);
cmd.Parameters.AddWithValue("@VykonnostniStupen", 0);
RepairNulls(cmd.Parameters);
cmd.ExecuteNonQuery();


private void RepairNulls(SqlParameterCollection col)
    {
        foreach (SqlParameter param in col.Cast<SqlParameter>().Where(param =>  param.Value == null))
        {
            param.Value = DBNull.Value;
        }
    }

最佳答案

将更新更改为:

UPDATE pde.Kun 
SET Jmeno=@Jmeno 
WHERE Licence=@Licence
  AND @Jmeno IS NOT NULL

如果您有多个列要更新:

UPDATE pde.Kun 
SET Jmeno = COALESCE(@Jmeno, Jmeno)
  , ColumnB = COALESCE(@ColumnB, ColumnB) 
WHERE Licence=@Licence

关于c# - 带有可选参数的 SQL 更新命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995754/

相关文章:

php - 如何在 MYSQL 中正确选择最高分?

C# 无法从 Excel 电子表格导入所有单元格

c# - 先制作 Asp.Net 核心路由,然后再制作 React 路由

c# - VS2012 在 x64 操作系统中编译为 x86,值为 "Any CPU"

SQL DATEPART(dw,date) 需要星期一 = 1 和星期日 = 7

mysql - 仅当 MySQL 中尚不存在时插入行

MySQL 一个查询中的多个联接?

c# - 条件运算符,验证问题

c# - MVC 4 中的等待屏幕

php - 将月份和年份存储在mysql数据库中