【问题标题】:The code is running, but UPDATE statement does not update data代码正在运行,但 UPDATE 语句不更新数据
【发布时间】:2019-05-02 20:53:50
【问题描述】:

我尝试将数据插入到图片所示表格中的ansatID 列。

用户有

  • DataGridView 中标记一行
  • 在左侧的 textBox1 中插入他的 ID
  • 然后按下按钮Tilføj ansat til vagten

并且他的 ID 应该插入到 ansatID 列中 DataGridView 和数据库中。

但问题是,尽管代码正在运行,但数据并未插入数据库中的列 ansatIDDataGridView 中。我试过以下代码:

private void button5_Click(object sender, EventArgs e)
{
    try
    {
        String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
        SqlConnection myconnection = new SqlConnection(ConnectionString);

        myconnection.Open();

        DateTime id= Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value);
        SqlCommand AddNumberCommand = myconnection.CreateCommand();
        AddNumberCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE [Dato] = '" + id + "'";

        AddNumberCommand.Parameters.Add("@ansatID", SqlDbType.Int).Value = textBox1.Text;

        AddNumberCommand.ExecuteNonQuery();

        myconnection.Close();
        MessageBox.Show("Du har valgt vagten.");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

预期结果是ansatID 应该同时插入到数据库中的ansatID 列和DataGridView 中。数据库中的表格和图片上的DataGridView 显示了实际结果。

【问题讨论】:

  • WHERE 子句中的变量也可以并且应该是参数。
  • 您需要始终使用参数,而不仅仅是某些时候。你为 ansatID 使用一个参数做得很好,为什么你不为 Dato 使用一个参数?它没有更新您的 gridview 的原因是您需要再次绑定网格。
  • 在处理涉及时间组件的更新时,您可能会在尝试解析毫秒(或更小增量)时遇到问题。而是让您的网格公开一个主键并在 ADO.NET 中使用它来执行更新。您不需要在网格上显示主键。

标签: c# sql-server winforms datagridview sql-update


【解决方案1】:

日期时间值会导致问题。在 where 子句中的查询中,日期值不返回任何值,因此未完成更新。您可以在查询中的 id 上使用日期时间对象的 ToString 方法,如下所示:

 AddNumberCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE [Dato] = '" + id.ToString("yyyy-MM-dd HH:mm:ss") + "'";

但是你应该使用参数来避免注入攻击。所以我建议你使用下面的代码段:

AddNumberCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE [Dato] = @value";
AddNumberCommand.Parameters.Add("@ansatID", SqlDbType.Int).Value = textBox1.Text;
AddNumberCommand.Parameters.Add("@value",SqlDbType.DateTime).Value=id;
AddNumberCommand.ExecuteNonQuery();

【讨论】:

  • 日期时间值不要会导致问题。 NET DB 提供程序对象完全能够传递 DateTime 并将其存储到 Date
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
相关资源
最近更新 更多