Автоматически сгенерированный код набора данных вызывает исключение StrongTypingException

#c# #sql-server #dataset #dbnull

Вопрос:

(Мне очень трудно сформулировать вопрос, поэтому я делаю все возможное. Я знаю обходной путь, но каждый раз, когда я что-то меняю в структуре SQL (например, добавляю столбец), мне приходится изменять автоматически созданный код в myDataSet.Designer.)

—Некоторая предыстория; Я изучил материал о базах данных C# еще в 2008 году, так что я мог бы сделать это по старинке, а я всего лишь случайный программист..

Мой рабочий процесс:

  • Создание базы данных в управлении MS SQL
  • Создайте приложение на языке C#
  • Установите соединение с источником данных
  • Перетащите нужные мне таблицы в форму для автоматической генерации кода
  • Добавьте код …

Является ли мой рабочий процесс неправильным или устаревшим? (Возможно, я пропустил некоторые шаги, но я думаю, вы поняли идею)

—Проблема; Сейчас пока все работает хорошо, проблемы возникают, когда я пытаюсь читать целочисленные или десятичные данные, содержащие значения DBNull, с помощью запросов.

Нравится:

         public decimal GetAnimalWeight(int animalId)
        {
            var query = from a in this.myDataSet.Animals
                        where a.Id == animalId
                        select a.Weight;

            return Convert.ToDecimal(query.ToList()[0]);
        }
 

Я обнаружил, что исключение создается в запросе, а не в преобразовании.ToDecimal(). Так что я мало что могу сделать.

Исключение возникает в автоматически сгенерированном коде myDataSet.Designer:

             [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")]
            public decimal Weight {
                get {
                    try {
                        return ((decimal)(this[this.tableAnimals.WeightColumn]));
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("The value for column 'Weight' in table 'Animals' is DBNull.", e);
                    }
                }
                set {
                    this[this.tableAnimals.WeightColumn] = value;
                }
            }
 

Мой обходной путь: (Я должен делать это для всех целых и десятичных чисел каждый раз, когда набор данных меняется):

             [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")]
            public decimal Weight {
                get {
                    try {
                        return ((decimal)(this[this.tableAnimals.WeightColumn]));
                    }
                    catch (global::System.InvalidCastException e) {
                        return (decimal)this.tableAnimals.WeightColumn.DefaultValue;
                        // I leave next line alone since it is not executed and its the original code:
                        throw new global::System.Data.StrongTypingException("The value for column 'Weight' in table 'Animals' is DBNull.", e);
                    }
                }
                set {
                    this[this.tableAnimals.WeightColumn] = value;
                }
            }
 

What is weird is that I did not recall having this issue in the past, no clue what I did wrong.
Also I had problems after altering a decimals precision in SQL, since I also fixed this by altering the auto generated code in DataSet I think it is the same kind of problem. I can’t seem to replicate the problem, I might start a new question if this doesn’t solve the problem.

This question may already have been answered but after looking for an answer quite a while I didn’t find a solution (I understand? lol).

(I am a long time reader of this website and found so many help, but never needed to ask a question)