在调用read()函数之前访问字段的尝试无效。

7
我已经搜索了好几个小时,寻找解决这个问题的方法。我正在尝试使用以下代码和正确的查询从我的��据库中获取信息。我知道这些查询有效,因为我已经在MySQL Workbench中测试过它们。但是,我不���收到以下错误消息:

未调用read()前尝试访问字段是无效的

正如您所看到的,我确实调用了read()方法,但是我的研究只发现我没有使用正确的数据库,但我已经验证过它是正确的了。请问有什么想法可以解决这个问题吗?非常感谢您的帮助。
public static string ExecuteSelect(string query)
{
    //Example query is: SELECT entity_id FROM catalog_product_flat_1 WHERE sku='itemSku';
    string statement = "";

    MySqlCommand myCommand = new MySqlCommand(query, _conn);

    MySqlDataReader myReader;
    myReader = myCommand.ExecuteReader();
    myReader.Read();

    statement = myReader.GetString(0);
    myReader.Close();

    return statement;
}

你是否检查了Read()的返回值,它是否返回true(表示有结果可读)或false(表示没有结果可读)? - CodingGorilla
2个回答

11

我不确定这是否是你遇到的问题,但你应该始终检查Read()方法的结果。例如:

if (myReader.Read())
{
  statement = myReader.GetString(0);
}

编辑: 另外,您实际上正在检索标量,因此可以使用ExecuteScalar()

return (myCommand.ExecuteScalar() ?? string.Empty).ToString();
//also rename your method appropriately

这是一个很好的观点。我已经添加了它并将保留它,但不幸的是它没有解决我的问题。 - SubxZero
@SubxZero 所以它通过了 if() 但仍然抛出错误?你确定第0列实际上是字符串类型吗?尝试执行 statement = myReader.GetValue(0).ToString() 看看是否成功。 - CodingGorilla
实际上,我把你的第一个建议加到了代码的错误位置,并进行了更正,结果它起作用了。非常感谢! - SubxZero

0

我刚走出了与你类似的问题。我的解决方案是使用一个

if (!myReader.HasRows)
                {

                }

在遍历数据集之前。

while(myRead.Read()
{
 //read tuples
}

这意味着对于你的代码而言:
public static string ExecuteSelect(string query)
{
//Example query is: SELECT entity_id FROM catalog_product_flat_1 WHERE 
sku='itemSku';
string statement = "";

MySqlCommand myCommand = new MySqlCommand(query, _conn);

MySqlDataReader myReader;
myReader = myCommand.ExecuteReader();
myReader.Read();
if(!myReader.HasRows)
{
 //set your statement variable to some generic value
 statement="abracadabra";
}

while(myReader.Read())
{
statement = myReader[0].ToString();
}
myReader.Close();

return statement;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接