0

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.HasRowstrue を返しますがoReader.GetValue(0)(または oReader.GetAnythingElse)、エラーをスローします。

System.InvalidOperationException: データが存在しない場合の無効な読み取り試行。

しかし、本当に困惑しているのは、oReader.GetOrdinal("SystemVersNo")、またはを呼び出すと、oReader.GetName(0)両方とも正しい値で返されることです。序数の位置がゼロで返されるのに、その位置で読み取る値が見つからないのはどうしてですか? SQL Server Management Studio で同じクエリを実行すると、値は問題なく表示されるので、そこにあることがわかります。

私はこれにまったく慣れていません。何か基本的なことが欠けていますか? それとも何かファンキーなことが起こっているのでしょうか。

ありがとう!

4

2 に答える 2

5

問題は、その時点でセットの最初のレコードに移動していないことです。

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

する必要があります

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

読み取るレコードが少なくとも 1 つあることをアサートし、同時にそのレコードに移動してデータを取得します。

于 2013-06-26T18:13:12.767 に答える
1

あなたは忘れた

while(oReader.Read())
{ // do stuff}
于 2013-06-26T18:10:56.130 に答える