【问题标题】:C#: Unable to retrieve data from a record setC#:无法从记录集中检索数据
【发布时间】:2011-08-22 03:41:09
【问题描述】:

我得到的例外是“位置0没有行”:

我将消息框存根放在那里以验证我实际上从数据库中获得了结果。尝试了不同的查询,它似乎工作正常。但是,当我尝试从结果集中检索该信息时,我不断收到该错误。我究竟做错了什么?这是我加载的当前代码,它返回 1 个结果。我正在尝试获取一个结果并将其作为双精度返回给程序。但不管我用它做什么,我仍然得到的错误是“位置 0 没有行”。我试过位置 1 和 2,结果相同。

查询是:“select distinct sweetTarget from productInfo where flavor = 'Classic Coke'”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

    namespace DatasetTest1
    {
        class dataLayer
        {

            static string connectionString = "Data Source=HALEY;Initial Catalog=cokeDatabaseSQL;Integrated Security=True";
            static SqlConnection conn = new SqlConnection(connectionString);
            static string sql = "select distinct sweetTarget from productInfo where flavor = 'Classic Coke'";
            static SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            static cokeDatabaseSQLDataSet dataTable = new cokeDatabaseSQLDataSet();

            public static double getTargetBrix()
            {
                double value = 0.00;
                try
                {

                    conn.Open();
                    int affectedRows = da.Fill(dataTable);

                    if (affectedRows > 0)
                    {
                        MessageBox.Show("Rows Returned: " + affectedRows);
                        value = dataTable.productInfo[0].sweetTarget;
                    }
                    else
                        MessageBox.Show("Empty Set");

                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                finally
                {
                    conn.Close();
                }



                return value;
            }
        }
    }

【问题讨论】:

    标签: c# database dataset


    【解决方案1】:

    问题是您的 DataSet 不包含您尝试执行的查询的定义,并且数据最终位于不同的表中。也就是说,select distinct ... from productInfo 不会填充cokeDatabaseSQLDataSet 内的productInfo 数据表。你需要写这样的东西来提取值:

    value = (double) dataTable.Tables[dataTable.Tables.Count - 1].Rows[0][0];
    

    现在,如果您不将 dataTable 声明为 cokeDatabaseSQLDataSet,您可以这样做:

    static DataTable dataTable = new DataTable();
    

    那么你就可以通过这行得到你想要的值了:

    value = (double) dataTable.Rows[0][0];
    

    【讨论】:

    • cokeDatabaseSQLDataSet 是在我添加数据源时由 IDE 创建的,因此架构与数据库本身相同。它怎么会不包含查询的定义?
    • 根据 MSDN 文档,“当使用后续的 Fill 调用来刷新 DataSet 的内容时,必须满足两个条件:(1) SQL 语句应该与最初用于填充 DataSet 的语句相匹配. (2) Key 列信息必须存在。”我的猜测是,因为数据适配器上使用的动态查询与生成的 DataSet 上的动态查询不匹配,所以会创建一个新表。如果您检查文件 cokeDatabaseSQLDataSet.Designer.css,您会发现在 InitCommandCollection() 方法上生成的查询。
    【解决方案2】:

    da.Fill(dataTable) 用于向 DataSet 添加行。所以考虑到 dataTable 是一个 DataSet,试试这个:

    value = dataTable.Tables[0].Rows[0][0]
    

    value = dataTable.Tables[0].Rows[0][ColumnName]
    

    【讨论】:

    • 受影响的行中有多少行?尝试调试并查看 dataTable 对象中的值。您在哪里以及如何定义 dataTable 的?
    • 对于这个查询,我得到 1 个受影响的行。当我将查询更改为选择 * 时,我得到 87 个受影响的行。我更新了我的帖子以显示整个静态类的代码。
    • 试试这个:value = dataTable.productInfo.Rows[0].sweetTarget;
    • 'System.Data.DataRow' 不包含 'sweetTarget' 的定义,并且找不到接受类型为 'System.Data.DataRow' 的第一个参数的扩展方法 'sweetTarget'(你是缺少 using 指令或程序集引用?)
    • dataTable.productInfo.Rows[0][0] 或 dataTable.productInfo.Rows[0].Columns[0]
    【解决方案3】:

    检查表数和行数

    dataTable.Tables.Count
    
    dataTable.Tables[0].Rows.Count
    

    【讨论】:

      【解决方案4】:

      喂!代码错误

      您必须从数据集中读取表格。

      例子:

      foreach (DataRow dRow in affectedRows.Tables[0].Rows)
      {
          var retval   = dRow["Keyword"].ToString();
          MessageBox.Show(retval );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-09
        • 2011-08-20
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        相关资源
        最近更新 更多