3

我有一个 WCF 服务(服务)。服务管理数据。但是现在我在 LINQ 查询中选择数据时遇到了问题。我收到一条消息“无法将空值分配给 System.Int32 类型的成员,该类型是不可为空的值类型。”

通过第一次调试,我将完成该方法,您将完成异常行。当我将调试器行(黄色标记的行)放回“// 08”行时,然后我遍历该方法一切正常。

    private static ResultClass Geselecteerd(int AID_Artiest)  // 01
    { // 02
        ResultClass _Result = new ResultClass(); // 03
        string sMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name;// 04
        // 05
        try // 06
        { // 07
            var recArtiest = (from artiest in DatabaseControl.GetDatabeheer.DataContext.ARTIESTs  // 08
                           where artiest.ID_ARTIEST == AID_Artiest
                           select artiest).SingleOrDefault();

            if (recArtiest != null)
            {
                ArtiestDataType.ID_Artiest = recArtiest.ID_ARTIEST;
                ArtiestDataType.Artiestnaam = recArtiest.ARTIESTNAAM;
                ArtiestDataType.Voorvoegsel = recArtiest.VOORVOEGSEL;
                ArtiestDataType.Product = recArtiest.PRODUCT;
                ArtiestDataType.ID_Categorie = recArtiest.ID_CATEGORIE;
                ArtiestDataType.ID_Genre = recArtiest.ID_GENRE;
                ArtiestDataType.Is_Band = BasisDataType.GetBoolString(recArtiest.IS_BAND);
                ArtiestDataType.Land = recArtiest.LAND;
                ArtiestDataType.Plaats = recArtiest.PLAATS;
                ArtiestDataType.Website = recArtiest.WEBSITE;
                ArtiestDataType.DatumInvoer = recArtiest.DATUM_INVOER;
                ArtiestDataType.DatumMutatie = recArtiest.DATUM_MUTATIE;
            }
        }
        catch (Exception ex)
        {
            string sFoutmelding = "Kan geen selectie maken.";
            FLogboek.AddFoutmelding(FClassName, sMethodName, sFoutmelding, ex.Message);

            _Result.Code = ResultCode.FATAAL;
            _Result.Melding = sFoutmelding;
        }

        return _Result;
    }

ID_ARTIEST 是一个整数字段,它也是一个主键。该字段的值是必需的,不能使用 NULL 值。

这种方法一直有效。当我添加新服务时,问题就开始了。

我的问题是:我做错了什么?跟服务有关系吗?我必须延迟这个过程吗? 有人可以给我一些提示吗?我有 8 个服务参考。如果您缺少一些重要来源,我可以添加它。

我现在只有一个解决方法。我在 try-catch 区域内添加了 try-catch。然后我没有得到任何异常。它与性能有关。我需要异步解决方案吗?

谢谢。

4

6 回答 6

5

几乎可以肯定正在发生的事情是类型的属性之一ARTIESTsDatabaseControl.GetDatabeheer.DataContext.ARTIESTs类型int?(这意味着可为空的整数)。

我猜我会说要么是ID_CATEGORIE要么ID_GENRE

您需要将类型的等效属性修改ArtiestDataType为 type int?

这将解决您的问题。

于 2012-12-19T14:17:58.827 回答
4

我错了什么?

除了将 null 分配给不可为空的元素(结构)?

您的代码毫无意义(发布大量不如实际发布您错过的相关部分)。

我可能是数据库中的字段可以为空并且包含为空,但是您的字段不是int?(int 可以为空)所以它不能在那里分配 null。

我会看看数据库映射表的方向是错误的。检查字段,检查所有可为空的列在类中实际上是可为空的。

于 2012-12-19T13:00:13.343 回答
2

改变

where artiest.ID_ARTIEST == AID_Artiest

where artiest.ID_ARTIEST.HasValue && artiest.ID_ARTIEST.Value == AID_Artiest

您的一个或多个艺术家没有ID_ARTIEST集合(您应该修复它,它看起来确实像应该始终存在的主键),因此在比较时(int?)null == int会引发异常。

于 2012-12-19T13:01:35.340 回答
0

将变量/属性声明为可为空的 int

public int? myInt
于 2012-12-19T13:26:56.847 回答
0

我有同样的问题,我在表格设计中有一个忽略重复的列。

在提交时插入,插入后将返回表格行。但是这里由于重复而忽略了该行,它没有返回具有标识值的表行(不可为空)。

所以预期值不存在,它会抛出“ Non nullable excecption ”。

在插入之前检查基于忽略重复列的行是否存在。它将解决问题

于 2014-01-17T06:13:02.150 回答
-2

在我的情况下,ID 是一个 INT64,修复它的方法是使用 ToString()

..... 
group t2 by t1 into gr
select new {t1 = gr.Key, id = gr.First().ID.ToString()}
于 2018-04-26T00:02:36.533 回答