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];
da.Fill(dataTable)
用于添加行到数据集。因此,考虑到数据表上一个DataSet,试试这个:
value = dataTable.Tables[0].Rows[0][0]
OR
value = dataTable.Tables[0].Rows[0][ColumnName]
得到相同的错误 – Sinaesthetic 2011-05-10 04:25:36
您在受影响的行中获得了多少行?尝试调试并查看dataTable对象中的值。你在哪里以及如何定义dataTable?此查询为 – Tushar 2011-05-10 04:29:08
,我得到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
cokeDatabaseSQLDataSet是我在添加数据源时由IDE创建的,因此模式与数据库本身完全相同。它如何不包含查询的定义? – Sinaesthetic 2011-05-12 20:26:55
根据MSDN文档,“当使用后续填充调用刷新DataSet的内容时,必须满足两个条件:(1)SQL语句应该与最初用于填充DataSet的SQL语句相匹配。(2)Key列信息必须存在。“ 我的猜测是,因为数据适配器上使用的动态查询与生成的DataSet上的查询不匹配,所以会创建一个新表。如果您检查文件cokeDatabaseSQLDataSet.Designer.css,您会在InitCommandCollection()方法中找到生成的查询。 – Leonardo 2011-05-17 06:15:55