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在程序中使用相同的方法时,它可以正常工作。我希望我写下一切,你可以帮忙。
蒂博尔
答案 0 :(得分:0)
根据我的评论,我可以提供改进的代码示例:
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
块现在包含一行 - 数据库调用。它可能会产生不受我们控制的错误。
此外,SqlConnection
和SqlCommand
实施Disposable Pattern因此需要在using
块中使用,以防止memory leak。