【问题标题】:My Table Adapter is returning null even after checking that the query is correct即使在检查查询是否正确后,我的表适配器仍返回 null
【发布时间】:2019-12-25 12:41:26
【问题描述】:

我使用创建的查询从键返回一行值,我检查了查询执行器,但是在运行程序时它返回 null。请帮帮我,我开始失去理智了。

我已经尝试调试,但问题来自填充数据查询,它返回 null。

        // Add ref. to the Dataset
        ViewMedia viewMediaSetInstance = new ViewMedia();
        // Create an empty Table
        ViewMedia.ViewMediaDataTable viewMediaTable = new ViewMedia.ViewMediaDataTable();
        // Create the Adapter we are going to use to populate the Table
        Model.ViewMediaTableAdapters.ViewMediaTableAdapter MediaTableAdapter = new Model.ViewMediaTableAdapters.ViewMediaTableAdapter();

        //Use query
        MediaTableAdapter.findByPublishYear(viewMediaTable, publishYear);

        //It doesn't find the row
        //I don't seem to find a solution even when the query returns the values in the executer.
        //viewMediaTable.Rows.Count == null so doesn't get inside
        if (viewMediaTable.Rows.Count > 0)
        {
            DataRow selectedUser = viewMediaTable.Rows[0];
            media = new Media(Int32.Parse(selectedUser["MediaID"].ToString()), selectedUser["Title"].ToString(), Int32.Parse(selectedUser["PublishYear"].ToString()));
            return media;
        }
        else
        {
            return null;
        }

我希望返回该行数据以显示在书籍显示中。

【问题讨论】:

  • 跑题评论为什么你使用Int32.Parse(selectedUser["MediaID"].ToString()而不是(int)selectedUser["MediaID"]

标签: c# visual-studio model-view-controller dataset


【解决方案1】:

这很奇怪;您已经拥有具有适当类型属性的强类型数据行,但您将它们视为具有字符串列名称的通用数据行,保存您要字符串()处理和解析的对象。它从未打算以这种方式使用。

您的代码应该看起来更像这样:

    ViewMedia viewMediaSetInstance = new ViewMedia();
    ViewMedia.ViewMediaDataTable viewMediaTable = new ViewMedia.ViewMediaDataTable();
    Model.ViewMediaTableAdapters.ViewMediaTableAdapter MediaTableAdapter = new Model.ViewMediaTableAdapters.ViewMediaTableAdapter();

    MediaTableAdapter.findByPublishYear(viewMediaTable, publishYear);

    //don't need to access the .Rows property to get the count
    if (viewMediaTable.Count > 0)
    {
        //don't need to access the .Rows property to get the data
        ViewMediaRow selectedUser = viewMediaTable[0];
        media = new Media(selectedUser.MediaID, selectedUser.Title, selectedUser.PublishYear);
        return media;
    }
    else
    {
        return null;
    }

我也不同意您在代码 cmets 中关于 datatable.Rows.Count 为空的断言。数据表的.Count 属性是一个整数,无论​​使用的是强类型数据表还是弱类型数据表;它永远不能为空

如果您启用创建返回数据表的方法,则无需创建数据集。通常这些方法称为GetDataByXXX,填充方法称为FillByXXX(您已将填充方法称为findByPublishYear)。它在 TA 向导的以下屏幕上进行配置:

图片由 nullskull.com 提供

这可以将您的代码简化为以下内容(添加对 Model.ViewMediaTableAdapters 的引用):

    var mDT = new ViewMediaTableAdapter().GetDataByPublishYear(publishYear);

    Media m = null;
    if (mDT.Count > 0)
        media = new Media(mDT[0].MediaID, mDT[0].Title, mDT[0].PublishYear);

    return m;

这里最关键的是,不要通过.Rows 集合访问第一行 (viewMediaDataTable.Rows[0]),因为这会返回基本类型DataRow。通过强类型数据表 (viewMediaDataTable[0]) 上的默认属性索引器直接访问它,因为这将返回一个 ViewMediaRow 类型的对象,该对象又为数据表中的所有列提供了很好命名的类型属性

viewMediaDataTable[0].PublishYear; //ViewMediaRow is a strongly typed class that has this property as an int
viewMediaDataTable.Rows[0].PublishYear; //"DataRow does not contain a definition for 'PublishYear'"

现在,如果行中的任何数据项为 null,并且在 null 时列的设置为“抛出异常”,您将看到 StrongTypingException 类型的异常 - 当您有一些列时会发生这种情况不能为空的类型(例如 int),但它为空,因为数据库查询没有返回该行的值。您在代码中遇到了这个问题,因为 som int 列(例如)是 DBNull.Value 并且当您尝试访问作为 DBNull 的 int 列时,数据行唯一会做的事情就是抛出异常。通过在查询中指定SELECT *,您使查询返回列的值;通过不选择列,数据表将始终将其视为空。如果数据库中数据的值也为空,您仍然会遇到强类型异常。在这些情况下,请在尝试访问该属性之前使用IsXXXNull() 方法确定该属性是否为空(导致强类型异常)

【讨论】:

    【解决方案2】:

    编辑:发现错误,我应该从查询中获取所有列(使用 *),然后在代码中获取我需要的内容,否则会返回空值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2019-03-01
      相关资源
      最近更新 更多