Fahim ullah Ответов: 3

Как передать обнуляемые данные с сервера mssql


Привет, Дорогие!
у меня есть проблема системного использования неназначенной локальной переменной "плата";
если comboBox SelectedValueChanged и форма значения comboBox недоступна в базе данных то появится сообщение о том что вы выбрали класс у которого нет платы сохраненной в базе данных

мой код

эта строка в ComboBox_SelectedValueChanged
FeeLabel.Text = GetFee().ToString();


а метод GetFee () - это

private int GetFee()
        {
            int fee;

            using (DbSQLServer db = new DbSQLServer(AppSetting.ConnectionString()))
            {
                fee = (int)db.GetScalarValue("GetFeePaymentByClass", new DbParameter { Parameter = "Class", Value = FindStudentComboBox.Text });
            }
            return fee;
        }


Это мой код для вызова скалярного значения из базы данных
public object GetScalarValue(string storedProceName, DbParameter parameter)
       {
           object value = null;

           using (SqlCommand cmd = new SqlCommand(storedProceName, conn))
           {
               cmd.CommandType = System.Data.CommandType.StoredProcedure;

               if (conn.State != ConnectionState.Open)
               {
                   conn.Open();
               }

               cmd.Parameters.AddWithValue(parameter.Parameter, parameter.Value);

               value = cmd.ExecuteScalar();
           }

           return value;
       }


Как мне решить эту проблему?

Что я уже пробовал:

Я искал в google но не решил свою проблему поэтому пожалуйста сделайте более ясным потому что у меня есть студент инженер программист а не разработчик или профессионал

3 Ответов

Рейтинг:
21

RickZeeland

Ваше соединение с помощью DbSQLServer выглядит очень странно, может быть, вам стоит использовать более стандартный способ подключения, смотрите: https://www.guru99.com/c-sharp-access-database.html[^]
А также: Получение одного значения из базы данных | Microsoft Docs[^]

Если ваш код работает, вы можете изменить его следующим образом:

int? fee;

     using (DbSQLServer db = new DbSQLServer(AppSetting.ConnectionString()))
      {
          fee = (int)db.GetScalarValue("GetFeePaymentByClass", new DbParameter { Parameter = "Class", Value = FindStudentComboBox.Text });
      }

      If (fee.HasValue)
         return fee;
      else
         return 0;

Обратите внимание на int? объяснение см. здесь: Операторы Null-conditional - Справочник по C# | Microsoft Docs[^]


Fahim ullah

Это моя библиотека, и я был pass ExecuteScalar() value ervry вещь правильная, но только не pass null value

Fahim ullah

Пожалуйста проверьте еще раз я публикую свой скалярный метод на котором я вызываю скалярное значение из базы данных

Fahim ullah

Не решить

Рейтинг:
2

Wendelius

Насколько я понимаю у вас есть две потенциальные проблемы:
- Запись найдена, но возвращаемое значение из базы данных равно NULL
- Запись не найдена.

В последнем случае с# null возвращается значение, но в первом случае a Значение dbnull.Поле Значения (Система) | Microsoft Docs[^] будет возвращен.

Если в обоих случаях вы хотите вернуть null, вы можете изменить метод GetScalarValue на следующий

return value == DBNull.Value ? null : value ;


Тогда что же происходит с обработкой нулевого значения в методе GetFee, если плата будет равна нулю, я бы предположил, что вы хотите показать пустую строку. Ведь плата 0 отличается от ситуации, когда плата не найдена.

Если предположение верно, вы можете использовать nullable int. Иначе говоря
private int? GetFee()
        {
            int? fee;
...
fee = (int?)db.GetScalarValue...
...
            return fee;
        }

Кроме того, вам нужно будет изменить вызывающий код на следующий, чтобы избежать исключения нулевой ссылки
FeeLabel.Text = GetFee();


Немного не по теме, но кажется, что вы храните соединение в какой-то переменной, возможно, даже в открытом состоянии. Я бы рекомендовал этого не делать. Вместо этого, держать соединение открытым как можно меньше, и пусть пул соединений для обработки повторного подключения открывает, для получения дополнительной информации см. Подключение к SQL-сервер пула (ADO.NET) | Майкрософт документы[^]


Рейтинг:
1

Member 11830457

Не могли бы вы написать код что-то вроде:

var fee = null; 
fee = GetFee();
if (string.IsNullOrEmpty(fee))
{
    otherClass.OtherRoutine();
    FeeLabel.Text = "<T.B.D.>"
}
else
{
    Feelabel.Text = fee.ToString();
}

Где T. B. D означает "быть определенным" или что-то еще, что имело бы смысл в случае отсутствия данных.


Fahim ullah

Пожалуйста, определите другой класс.OtherRoutine(); а также существует ошибка не может присвоить null неявно типизированной переменной.
мой метод-целочисленный

Member 11830457

Ну а к какому другому классу, вы сказали:
>>затем покажите сообщение о том, что вы выбрали класс, который не имеет платы, сохраненной в базе данных
Если вы не имели в виду, что вам следует выбрать "альтернативный" класс, который обрабатывает "нет данных", просто оставьте эту строку и подпишите сообщение, которое кажется подходящим, то есть FeeLabel.Текст = "все, что вам нравится";
Что касается неявно типизированной переменной-мой плохой забыл об этом. Как упоминает Венделиус, затем верните его в nullable int.

инт? плата = GetFee();
если (строка.IsNullOrEmpty(плата))
{
Почувствуй себя лучше.Text = "<t.b.d.>";
}
еще
{
Почувствуй себя лучше.Текст = гонорар.Метод toString();
}