SqlDataReader无法识别列序数值

时间:2013-06-26 18:08:27

标签: c# wcf silverlight sqldatareader

我正在尝试通过WCF服务为Silverlight应用程序访问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中运行相同的查询,那么值就没问题了,所以我知道它就在那里。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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

应该是

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

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

答案 1 :(得分:1)

你忘记了

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