C# 如何使用C将DBNull转换为另一种类型?
我正在尝试编写一段代码,在使用值更新单元格之前,检查DataGridView中选定行中的单元格是否为空/空。我编写的代码不起作用,因为我遇到了一个错误: System.InvalidCastException:类型为“System.DBNull”的对象无法转换为“System.String”类型 我已使用以下代码进行了尝试: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
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")