#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)