SqlDataReader无法识别列序号值

本文关键字:识别 SqlDataReader | 更新日期: 2023-09-27 18:19:57

我正试图通过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),它们都会返回正确的值。为什么序数位置返回为零,但在该位置找不到可读取的值?如果我在SQLServerManagementStudio中运行相同的查询,那么值会立即出现,没有问题,所以我知道它就在那里。

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

谢谢!

SqlDataReader无法识别列序号值

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

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

应该是

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

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

您忘记了

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