#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:
Проблема здесь в том, что 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.