我正在尝试编写代码,该代码将在用值更新单元格之前检查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”。这也显示在下图:
答案 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#