Мне нужно управлять 3 базами данных со многими таблицами и значениями NULL, которые могут быть почти везде. В некоторых случаях я нашел решение, но теперь мне нужна помощь.
Код на данный момент:
public DataTable queryResults()
{
stockDataSet stockDS = new stockDataSet();
extensionStockDataSet extensionStockDS = new extensionStockDataSet(); administrationDataSet administrationDS = new administrationDataSet();
stockDataSetTableAdapters.sparePartsTableAdapter sparePartsAdapter = new stockDataSet TableAdapters.sparePartsTableAdapter();
sparePartsAdapter.Fill(stockDS.spareParts);
administrationDataSetTableAdapters.usersTableAdapter usersAdapter = new administrationDataSetTableAdapters.usersTableAdapter();
usersAdapter.Fill(administrationDS.users);
extensionStockDataSetTableAdapters.dataPartsTableAdapter dataPartsAdapter = new extensionStockDataSetTableAdapters.dataPartsTableAdapter();
dataPartsAdapter.Fill(extensionStockDS.dataParts);
var query = from sp in stockDS.spareParts
join ad in administrationDS.users
on sp.idUser equals ad.idUser
join ext in extensionStockDS.dataParts
on sp.idStock equals ext.idStock
into joined
from j in joined.DefaultIfEmpty()
where sp.idTypePart != 7
orderby sp.idUser
select new { namePart = sp.namePart,
idPartInExtStock = (j == null ? 0 : j.idPart),
notes = sp.notes,
parNo = ad.parno,
descr = ma.description,
idBrand = (j == null || j.idBrand == null ? "NOT AVAILABLE”: j.idBrand),
idModel = (j == null || j.idModel == null ? " NOT AVAILABLE " : j.idModel),
idVersion = (j == null || j.idVersion == null ? "NOT AVAILABLE" : j.idVersion)
};
DataTable results = new DataTable();
results = LINQToDataTable(query); //converts LINQ results to DataTable with System.Reflection
return results;
}
Переход double click on every xsd DataSet file in Explore Soluzion panel in Visual Studio -> select a field of any table -> Properties panel -> NullValue -> (Null)
Я могу разрешить значение Null
для каждого Строка, это то, что я сделал для
notes = sp.notes
parNo = ad.parno
descr = ma.description
Это невозможно сделать для каждого типа данных, например, для типов System.Int32
и System.DateTime
: если вы попытаетесь установить для них NullValue -> (Null)
или NullValue -> (Empty)
возвращает сообщение:
Property value not valid
Итак, для idPartInExtStock
типа System.Int32 я нашел это решение:
idPartInExtStock = (j == null ? 0 : j.idPart)
, то есть работает, и я реализовал это (только для попытки) также для полей String
idBrand = (j == null || j.idBrand == null ? "NOT AVAILABLE”: j.idBrand),
idModel = (j == null || j.idModel == null ? " NOT AVAILABLE " : j.idModel),
idVersion = (j == null || j.idVersion == null ? "NOT AVAILABLE" : j.idVersion)
Теперь я получаю еще одну проблему Null со строкой:
where sp.idTypePart != 7
, она возвращается в Во время выполнения возникает следующая ошибка: stockDataSet.Designer.cs
:
System.Data.StrongTypingException: Value for column idTypePart in spareParts table is DBNull
К сожалению, я не могу изменить значения в базах данных, мне нужно управлять ими как есть.
Мои вопросы:
- как я могу решить эту проблему
System.Data.StrongTypingException: Value of column idTypePart in spareParts table is DBNull
, учитывая, что sp.idTypePart
имеет тип System.Int32
, приведение к нему не работает и невозможно установить значение (Null)
или (Empty)
для этого?
Пока я пробовал:
1A. (int?)sp.idTypePart != 7
==> там написано 'The cast is redundant'
, так что это бесполезно
1B. sp?.idTypePart != 7
==> компилирует, запускает, но возвращает снова System.Data.StrongTypingException: Value for column idTypePart in spareParts table is DBNull
1 C. where (sp.idTypePart != 7 && sp.idTypePart != null)
==> возвращает предупреждение 'expression value is always true'
, так что это бесполезно
Есть ли какой-нибудь способ избежать всех определений этих исключений для управления значениями Null в каждом поле и для каждого типа данных?