C# System.Data.StrongTypingException: значение для столбца '<columnName>' в таблице '<tableName>' равно DBNull в запросе LINQ. - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно управлять 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

К сожалению, я не могу изменить значения в базах данных, мне нужно управлять ими как есть.

Мои вопросы:

  1. как я могу решить эту проблему 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 в каждом поле и для каждого типа данных?

1 Ответ

0 голосов
/ 24 апреля 2020

Хорошо, пока проблема кажется решенной. Я имею в виду часть «чтение данных», я могу правильно извлечь информацию и успешно выполнить мой запрос.

То, что я сделал, просто происходит:

двойной щелчок на xsd stockDataSet в Панель «Решение» -> выберите поле idTypePart в таблице spareParts Панель свойств ->

, поэтому

(1.) : Datatype -> System.String (вместо предустановки по умолчанию System.Int32)

, а затем

(2.) : NullValue -> (Null)

Я сделал это еще до вчерашнего дня, но по какой-то причине я не могу понять, что это не сработает вовремя.

В любом случае, теперь проблема чтения решена, и этот ответ на этот вопрос.

Интересно, что произойдет, когда я запишу данные, так как это поле в базе данных - int, в то время как в наборе данных есть строка.

...