C#:无法从记录中检索数据集

C#:无法从记录中检索数据集

问题描述:

,即时通讯越来越是唯一的例外“没有排在位置0”:C#:无法从记录中检索数据集

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

查询是:“选择从productInfo不同sweetTarget其中风味=‘经典可乐’”

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; 
      } 
     } 
    } 

的问题是,你的数据集不包含您要执行查询的定义,并在不同的表中的数据结束了。即,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]; 
+0

cokeDatabaseSQLDataSet是我在添加数据源时由IDE创建的,因此模式与数据库本身完全相同。它如何不包含查询的定义? – Sinaesthetic 2011-05-12 20:26:55

+0

根据MSDN文档,“当使用后续填充调用刷新DataSet的内容时,必须满足两个条件:(1)SQL语句应该与最初用于填充DataSet的SQL语句相匹配。(2)Key列信息必须存在。“ 我的猜测是,因为数据适配器上使用的动态查询与生成的DataSet上的查询不匹配,所以会创建一个新表。如果您检查文件cokeDatabaseSQLDataSet.Designer.css,您会在InitCommandCollection()方法中找到生成的查询。 – Leonardo 2011-05-17 06:15:55

da.Fill(dataTable)用于添加行到数据集。因此,考虑到数据表上一个DataSet,试试这个:

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

OR

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

得到相同的错误 – Sinaesthetic 2011-05-10 04:25:36

+0

您在受影响的行中获得了多少行?尝试调试并查看dataTable对象中的值。你在哪里以及如何定义dataTable?此查询为 – Tushar 2011-05-10 04:29:08

+0

,我得到1个受影响的行。当我更改查询来选择*,我得到87受影响的行。我更新了我的帖子以显示整个静态类的代码。 – Sinaesthetic 2011-05-10 04:31:52

嗝!错误代码

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

例子:

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

检查表计数和行数

dataTable.Tables.Count 

dataTable.Tables[0].Rows.Count