C# 如何使用C将DBNull转换为另一种类型?

C# 如何使用C将DBNull转换为另一种类型?,c#,winforms,datagridview,sql-update,dbnull,C#,Winforms,Datagridview,Sql Update,Dbnull,我正在尝试编写一段代码,在使用值更新单元格之前,检查DataGridView中选定行中的单元格是否为空/空。我编写的代码不起作用,因为我遇到了一个错误: System.InvalidCastException:类型为“System.DBNull”的对象无法转换为“System.String”类型 我已使用以下代码进行了尝试: if ((string)dataGridView1.SelectedCells[0].OwningRow.Cells[1].Value == null) { try

我正在尝试编写一段代码,在使用值更新单元格之前,检查DataGridView中选定行中的单元格是否为空/空。我编写的代码不起作用,因为我遇到了一个错误:

System.InvalidCastException:类型为“System.DBNull”的对象无法转换为“System.String”类型

我已使用以下代码进行了尝试:

if ((string)dataGridView1.SelectedCells[0].OwningRow.Cells[1].Value == null)
{
    try
    {
        String ConnectionString = @"Data Source=.\SQLEXPRESS01;Initial Catalog=Vagtplan;Integrated Security=True";
        SqlConnection myconnection = new SqlConnection(ConnectionString);
        myconnection.Open();
        DateTime primaryKey = Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value);
        SqlCommand AddNumbeCommand = myconnection.CreateCommand();
        AddNumbeCommand.CommandText = "UPDATE dbo.Vagter SET [ansatID] = @ansatID WHERE [Dato] = @dato";
        AddNumbeCommand.Parameters.AddWithValue("@ansatID", SqlDbType.Int).Value = textBox1.Text;
        AddNumbeCommand.Parameters.Add("@dato", SqlDbType.DateTime).Value = primaryKey;
        AddNumbeCommand.ExecuteNonQuery();
        myconnection.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        MessageBox.Show("The cell is updated.");
    }
}
else
{
    MessageBox.Show("The cell has already a value.");
}
预期结果是,当用户在DataGridView中选择一行时,其中列ansatID下的单元格已经有一个值,在textBox1中写入一个值,然后按Tilføj ansatID直到vagten,他得到的错误是:单元格中已经有一个值。。如果他选择一行,其中列ansatID下的单元格为空,在textBox1中写入一个值,然后按Tilføj ansatID直到vagten,那么SQL查询将被执行,他将收到消息“单元格已更新”。此外,列ansatID的数据类型为int。下图中也显示了这一点:

DBNull不能直接转换为任何数据类型,因此在进行转换之前,您需要检查它是否为DBNull

差不多

if (dataGridView1.SelectedCells[0].OwningRow.Cells[1].Value == DBNull.Value)
//dosomething
else
//do something else
或者,根据您从数据库中读取的方式,您可以使用来保存一些键入

dataRow.Field<string>("Column Name")

要回答您的问题,可以通过以下两种方式转换它:

首先,可以使用DBNull.ToString将DBNull转换为字符串,它只返回一个空字符串

其次,由于DBNull实现IConvertible接口,因此可以通过提供IFormatProvider接口的实现,将DBNull.ToTypeType、IFormatProvider用于另一种类型

在您的例子中,我看到您将单元格值转换为字符串的唯一位置是if条件


您使用它来确定单元格是否有值。如果这就是您想要做的,那么这里的答案可能会更好:

使用数据绑定和DataAdapter,您可以不用所有这些代码,只需一行代码,它就会打开连接并更新数据库。我很确定AddWithValue是错误的和/或将失败,或者不是您的意思。它正在尝试将DBNull.Value转换为字符串吗?这是哪条语句?@NatPongjardenlarp,那么代码会是什么样子?@ScottHannen,我想这就是我缺少的dataGridView1.SelectedCells[0]。OwningRow.Cells[1]。Value==DBNull。Value正是我需要的,它现在可以工作了,谢谢:我已经找到了解决方案,只是dataGridView1.SelectedCells[0]。OwningRow.Cells[1].Value==DBNull。值:
dataRow.Field<string>("Column Name")