ОБНОВЛЕНИЕ SQL COALESCE в функции C #

#c# #sql-server #methods #coalesce

#c# #sql-сервер #методы #coalesce

Вопрос:

У меня есть функция в C #, с помощью которой я хочу обновить свою базу данных. Это связано с формой Windows с текстовыми полями. Я хочу убедиться, что если кто-то захочет ОБНОВИТЬ только одно или два значения, остальные не будут заменены пустыми строками, а скорее сохранят то, что уже есть.

 sqlStr = "UPDATE [CRONUS Sverige AB$Employee] SET [First Name] = COALESCE(@param2, [First Name]), [Last Name] = COALESCE(@param3, [Last Name]), "  
    "[Address] = COALESCE(@param4, [Address]), [E-Mail] = COALESCE(@param5, [E-Mail]), [Social Security No_] = COALESCE(@param6, [Social Security No_]) WHERE [No_] = @param1";

sqlCom = new SqlCommand(sqlStr, con);
sqlCom.Parameters.AddWithValue("@param1", id);
sqlCom.Parameters.AddWithValue("@param2", fName);
sqlCom.Parameters.AddWithValue("@param3", lName);
sqlCom.Parameters.AddWithValue("@param4", adress);
sqlCom.Parameters.AddWithValue("@param5", email);
sqlCom.Parameters.AddWithValue("@param6", ssn);
sqlCom.ExecuteNonQuery();
  

Проблема в том, что если я сейчас попытаюсь ввести нулевое значение, например, в fName, я получу эту ошибку:

System.Data.SqlClient.SQLException (0x80131904): параметризованный запрос ‘(@param1 nvarchar(2),@param2 nvarchar(4000),@param3 nvarchar(11)’ ожидает параметр ‘@param2’, который не был предоставлен.

Есть идеи о том, как это решить? Я очень благодарен за любую помощь :).

Комментарии:

1.Пожалуйста, прекратите использовать AddWithValue()

Ответ №1:

Проблема здесь в том, что null значение в C # — это не то же самое, что NULL значение в SQL Server. Одним из вариантов здесь может быть использование оператора объединения null ?? при добавлении параметров, например

 sqlStr = "UPDATE [CRONUS Sverige AB$Employee] SET [First Name] = COALESCE(@param2, [First Name]), [Last Name] = COALESCE(@param3, [Last Name]), "  
    "[Address] = COALESCE(@param4, [Address]), [E-Mail] = COALESCE(@param5, [E-Mail]), [Social Security No_] = COALESCE(@param6, [Social Security No_]) WHERE [No_] = @param1";

sqlCom = new SqlCommand(sqlStr, con);
sqlCom.Parameters.AddWithValue("@param1", ((object)id) ?? DBNull.Value);
sqlCom.Parameters.AddWithValue("@param2", ((object)fName) ?? DBNull.Value);
sqlCom.Parameters.AddWithValue("@param3", ((object)lName) ?? DBNull.Value);
sqlCom.Parameters.AddWithValue("@param4", ((object)adress) ?? DBNull.Value);
sqlCom.Parameters.AddWithValue("@param5", ((object)email) ?? DBNull.Value);
sqlCom.Parameters.AddWithValue("@param6", ((object)ssn) ?? DBNull.Value);
sqlCom.ExecuteNonQuery();
  

Измененная логика, приведенная выше, теперь будет сопоставлять null значение в C # с фактическим NULL значением в SQL Server.