Как конвертировать DBNull в другой тип с помощью C #? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь написать код, который проверяет, является ли ячейка в выбранной строке в 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 уже имеетvalue, введите значение в textBox1 и нажмите Tilføj ansatID til vagten, чтобы получить сообщение об ошибке: «В ячейке уже есть значение».Если он выберет строку, в которой ячейка под столбцом ansatID пуста, напишите значение в textBox1 и нажмите Tilføj ansatID til vagten, то запрос SQL будет выполнен, и он получит сообщение «Ячейка обновлена».Кроме того, столбец ansatID имеет тип данных "int".Это также показано на следующем рисунке: enter image description here

Ответы [ 2 ]

1 голос
/ 06 мая 2019
(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

Или, в зависимости от того, как вы читаете его из базы данных, вы можете использовать метод расширения , чтобы сэкономить при наборе

dataRow.Field<string>("Column Name")
0 голосов
/ 06 мая 2019

Чтобы ответить на ваш вопрос, он выглядит , как DBNull можно преобразовать двумя способами:

Во-первых, как вы можете см. , DBNull можно преобразовать встрока с использованием DBNull.ToString(), которая просто возвращает пустую строку.

Во-вторых, поскольку DBNull реализует интерфейс IConvertible, вы можете использовать DBNull.ToType(Type, IFormatProvider) для преобразования в другой тип, предоставивреализация интерфейса IFormatProvider.

В вашем случае, единственное место, где вы видите преобразование значения ячейки в строку, это условие if.

Вы используете его, чтобы определить, имеет ли ячейка значение или нет.Если это все, что вы хотите сделать, вам, вероятно, лучше ответит здесь: Как проверить пустые и нулевые ячейки в datagridview, используя C #

...