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

时间:2019-05-06 19:05:59

标签: c# winforms datagridview sql-update dbnull

我正在尝试编写代码,该代码将在用值更新单元格之前检查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øjansatID til vagten”,得到错误:“单元格中已经有一个值。”。如果他将选择一行,而其在ansatID列下的单元格为空,则在textBox1中写入一个值,然后按“TilføjansatID til vagten”,则将执行SQL查询,并且他将收到消息“该单元格已更新”。此外,ansatID列的数据类型为“ int”。这也显示在下图:enter image description here

2 个答案:

答案 0 :(得分:1)

(string)dataGridView1.SelectedCells[0].OwningRow.Cells[1].Value == null

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

类似

if (dataGridView1.SelectedCells[0].OwningRow.Cells[1].Value == DBNull.Value)
//dosomething
else
//do something else

或者根据您从数据库中读取信息的方式,可以使用extension method来节省输入时间

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

答案 1 :(得分:0)

要回答您的问题,looks就像DBNull可以通过两种方式转换:

首先,您可以see进行操作,可以使用DBNull.ToString()将DBNull转换为字符串,该字符串仅返回一个空字符串。

第二,由于DBNull实现了IConvertible接口,因此可以通过提供DBNull.ToType(Type, IFormatProvider)接口的实现来将IFormatProvider to convert用于另一种类型。

在您的情况下,我看到的唯一将单元格值转换为字符串的地方是if条件。

您正在使用它来确定单元格是否具有值。如果您只想这样做,那么这里的答案可能会更好地为您服务:How to check empty and null cells in datagridview using C#