【问题标题】:SqlDataReader not recognizing column ordinal valuesSqlDataReader 无法识别列序数值
【发布时间】:2013-06-26 18:08:27
【问题描述】:

我正在尝试通过 Silverlight 应用程序的 WCF 服务访问 SQL 数据库,但由于某种原因,我的 SqlDataReader 对象不断给我错误。我只是试图从数据库中检索一个值。

这是我现在的代码:

using(SqlConnection oConnection = new SqlConnection(ConnectionString))
{
   SqlCommand oCommand = new SqlCommand("SELECT SystemVersNo FROM dbo.CoPolicyPointer WHERE SystemAssignId = '58859700000000'");

   CompositeType oCustomer = new CompositeType();

   SqlDataReader oReader = null;
   oConnection.Open();
   oCommand.Connection = oConnection;
   oReader = oCommand.ExecuteReader();

   if (oReader.HasRows)
   {
      oCustomer.SRVNo = oReader.GetValue(0).ToString();
   }
   else
   {
      oCustomer.SRVNo = "No rows returned.";
   }

   oConnection.Close();

   return oCustomer;
}

oReader.HasRows 返回 true,但 oReader.GetValue(0)(或 oReader.GetAnythingElse,就此而言)抛出错误:

System.InvalidOperationException:不存在数据时尝试读取无效。

真正难倒我的是,如果我调用oReader.GetOrdinal("SystemVersNo") 或oReader.GetName(0),它们都会返回正确的值。序数位置如何返回零,但在该位置找不到要读取的值?如果我在 SQL Server Management Studio 中运行相同的查询,该值就没有问题,所以我知道它就在那里。

我对这一切都是全新的,我错过了一些基本的东西吗?或者发生了什么奇怪的事情。

谢谢!

【问题讨论】:

    标签: c# wcf silverlight sqldatareader


    【解决方案1】:

    问题是你当时还没有移动到集合中的第一条记录。

    if (oReader.HasRows)
    {
        oCustomer.SRVNo = oReader.GetValue(0).ToString();
    }
    

    应该是

    if (oReader.Read())
    {
        oCustomer.SRVNo = oReader.GetValue(0).ToString();
    }
    

    断言至少有一条记录要读取,同时移动到该记录以从中获取数据。

    【讨论】:

    • 啊,我明白了,我没有意识到 Read() 方法实际上推动了读者前进,而不是仅仅返回是否可以,我认为没有必要,因为我没有需要一个循环。谢谢!
    【解决方案2】:

    你忘了

    while(oReader.Read())
    { // do stuff}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多