SQL COALESCE ОБНОВЛЕНИЕ в функции C # - PullRequest
0 голосов
/ 02 марта 2019

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

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 Ответ

0 голосов
/ 02 марта 2019

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

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.

...