【问题标题】:SqlCommand UPDATE not update the database [duplicate]SqlCommand UPDATE 不更新数据库[重复]
【发布时间】:2017-09-27 20:10:11
【问题描述】:

Edit1:“您不能在 sql 中参数化标识符。SET @Column = @Value 将不起作用。”

所以如果我修改了datagridview,我不能在告诉sql server 哪些列应该更新的地方进行迭代?我需要更新行的每个元素吗?也感谢其他建议。

我正在尝试使用此 C# 代码更新我的 SQL Server 数据库:

try 
{
    string parancs = "UPDATE Equipment SET @Column = @Value, Modifier = @Modifier, Modified = @Modified " +
                     "WHERE Description = @Description AND [Plane_A/C] = @Plane";

    SqlCommand sqlComm = new SqlCommand(parancs, connection);
    DateTime time = DateTime.Now;

    foreach (DataGridViewRow row in dataGridView.Rows) 
    {
        foreach (DataGridViewCell cell in row.Cells) 
        {
            if (cell.Value == null) 
            {
                cell.Value = DBNull.Value;
            }
        }
    }

    sqlComm.Connection.Open();

    for (int i = 0; i < rowIndexes.Count; i++) 
    {
        sqlComm.Parameters.Clear();
        sqlComm.Parameters.AddWithValue("@Column", dataGridView.Columns[columnIndexes[i]].HeaderText);
        sqlComm.Parameters.AddWithValue("@Value", dataGridView.Rows[rowIndexes[i]].Cells[columnIndexes[i]].Value);
        sqlComm.Parameters.AddWithValue("@Description", dataGridView.Rows[rowIndexes[i]].Cells["Description"].Value);
        sqlComm.Parameters.AddWithValue("@Plane", ChoosenAC);
        sqlComm.Parameters.AddWithValue("@Modifier", "TesztAdmin");
        sqlComm.Parameters.AddWithValue("@Modified", time);

        sqlComm.ExecuteNonQuery();
    }

    sqlComm.Connection.Close();
    MessageBox.Show("Sikeres módosítás!");
}
catch (Exception ex) 
{
    MessageBox.Show(ex.ToString());
}

rowIndexes.Count 是修改的行数,columnIndexes 是它们的位置。代码运行无异常,但数据不会更新。在 SQL Server Profiler 中,我得到了这个:

exec sp_executesql N'UPDATE Equipment SET @Column = @Value, Modifier = @Modifier, Modified = @Modified WHERE Description = @Description AND [Plane_A/C] = @Plane',N'@Column nvarchar(11),@Value float,@Description nvarchar(6),@Plane nvarchar(8),@Modifier nvarchar(10),@Modified datetime',@Column=N'InspectHour',@Value=800,@Description=N'Engine',@Plane=N'TEST-REP',@Modifier=N'TesztAdmin',@Modified='2017-09-27 12:44:14.773'

所以所有的参数都有值。如果我将 UPDATE 命令复制到 SSMS 并使用精确值而不是参数,它可以正常工作并更新。

当我在程序中使用 INSERT 命令而不是 UPDATE 使用相同的方法时,它可以正常工作。我希望我把所有的东西都写下来了,你可以帮忙。

提伯尔

【问题讨论】:

  • 你不能在 sql 中参数化标识符。 SET @Column = @Value 将不起作用。
  • @Column有什么用?您肯定不能将要更新的列作为命令中的参数传递。尝试删除该参数并将特定列名放入命令中。然后看看它工作正常。
  • 我认为他们有一个名为“Column”的表格列。桌子是一个财产袋。这与列标识符的参数化无关。至于为什么@Column 的分配在分析器输出中显示为@,是另一回事。请注意以下分配不是。
  • 为什么不一次更新所有列?
  • 他正在迭代。 @Tibor,请显示您的表架构,为什么更新语句文本中的第一列名称有 @ 前缀?

标签: c# sql sql-server parameters sql-update


【解决方案1】:

根据我的评论,我可以提供一个改进的代码示例:

const string parancs = 
    "UPDATE Equipment SET {column-name} = @Value, Modifier = @Modifier, Modified = @Modified " +
    "WHERE Description = @Description AND [Plane_A/C] = @Plane";

DateTime time = DateTime.Now;

foreach (DataGridViewRow row in dataGridView.Rows)
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (cell.Value == null)
        {
            cell.Value = DBNull.Value;
        }
    }
}

using (connection)
using (var sqlComm = connection.CreateCommand())
{
    connection.Open();

    for (int i = 0; i < rowIndexes.Count; i++)
    {
        sqlComm.Parameters.Clear();
        sqlComm.Parameters.AddWithValue("@Value", dataGridView.Rows[rowIndexes[i]].Cells[columnIndexes[i]].Value);
        sqlComm.Parameters.AddWithValue("@Description", dataGridView.Rows[rowIndexes[i]].Cells["Description"].Value);
        sqlComm.Parameters.AddWithValue("@Plane", ChoosenAC);
        sqlComm.Parameters.AddWithValue("@Modifier", "TesztAdmin");
        sqlComm.Parameters.AddWithValue("@Modified", time);

        sqlComm.CommandText = parancs.Replace("{column-name}", dataGridView.Columns[columnIndexes[i]].HeaderText);

        try
        {
            sqlComm.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            throw;
        }
    }

    sqlComm.Connection.Close();
}

MessageBox.Show("Sikeres módosítás!");

请注意,try/catch 块现在包含一行 - 数据库调用。它可能会产生我们无法控制的错误。

此外,SqlConnectionSqlCommand 实现了Disposable Pattern,因此它们需要在using 块中使用,以防止memory leak

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多