我得到的例外是“0号位没有行”:
我将消息框存根放在那里以验证我实际上是从数据库中获取结果。尝试了不同的查询,它似乎工作正常。但是,当我尝试从结果集中检索该信息时,我不断收到该错误。我究竟做错了什么?这是我加载的当前代码,它返回1个结果。我试图取一个结果并将其作为双精度返回到程序中。但无论我正在做什么,我仍然得到的错误是“在0位没有行”。我已尝试过位置1和2,结果相同。
查询是:“从productInfo中选择distinct sweetTarget,其中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;
}
}
}
答案 0 :(得分:1)
da.Fill(dataTable)
用于向DataSet添加行。所以考虑到dataTable是一个DataSet,试试这个:
value = dataTable.Tables[0].Rows[0][0]
OR
value = dataTable.Tables[0].Rows[0][ColumnName]
答案 1 :(得分:1)
问题是您的DataSet不包含您尝试执行的查询的定义,并且数据最终在另一个表上。也就是说,select distinct ... from productInfo
不会填充productInfo
内的cokeDatabaseSQLDataSet
数据表。你需要写这样的东西来提取值:
value = (double) dataTable.Tables[dataTable.Tables.Count - 1].Rows[0][0];
现在,如果不是将dataTable声明为cokeDatabaseSQLDataSet,而是执行此操作:
static DataTable dataTable = new DataTable();
然后你就能用这一行得到你所追求的价值:
value = (double) dataTable.Rows[0][0];
答案 2 :(得分:0)
您必须从数据集中读取表格。
示例:
foreach (DataRow dRow in affectedRows.Tables[0].Rows)
{
var retval = dRow["Keyword"].ToString();
MessageBox.Show(retval );
}
答案 3 :(得分:0)
检查表计数和行计数
dataTable.Tables.Count
dataTable.Tables[0].Rows.Count