5

Visual Studio 2008 でデータリーダーから結果を取得できません。同じデータベースに複数の Proc が保存されています。入力パラメータを受け取っていないものから値を取得できます。ただし、入力パラメーターを使用してストアド プロシージャで executreReader() メソッドを使用すると、空のデータリーダーが取得されます。結果コレクションを調べると、「IEnumerable が結果を返しませんでした」というメッセージが表示されます。SQLサーバー内でストアドプロシージャを実行して結果セットを返すことができるので、私は困惑しています。以前は、Visual Studio 内でこれらのストアド プロシージャから行を取得できましたが、ある日、機能しなくなったようです。

dataadapter を使用してデータセットに結果を入力し、executereader() メソッドを使用して sqldatareader を取得しようとしましたが、まだ結果が得られません。例外もスローされません。私のパラメーターはすべて適切に命名されていますが、これらのストアド プロシージャをパラメーターなしで呼び出して、フィルター処理されていない結果セットを返すことができるはずです。現在使用しているコードは次のとおりです。

string connStr = ConfigurationManager.ConnectionStrings["MyConnectionString"]
                                     .ConnectionString;

SqlConnection connCactus = new SqlConnection(connStr);
SqlCommand cmdPopulateFilterDropDowns = new SqlCommand( "dbo.MyStoredProc",
                                                        connCactus);
SqlDataReader rdrFilterSearch = null;
cmdPopulateFilterDropDowns.CommandType = CommandType.StoredProcedure;

connCactus.Open();
rdrFilterSearch = cmdPopulateFilterDropDowns
                      .ExecuteReader(CommandBehavior.CloseConnection);

return (rdrFilterSearch);

助けてください!

4

8 に答える 8

5

私の愚かな間違い。これに数時間苦労した後、使用していたストアドプロシージャが複数の結果セットを返し、最初の結果セットが常に空であることに気付きました。したがって、結果の欠如。

于 2008-12-23T20:44:55.517 に答える
5

パラメータを SqlCommand の Parameter コレクションに追加したことはありますか? 機能していないのは入力パラメーターを取るものだと言いましたが、コードには次のようなものはありません。

cmdPopulateFilterDropDowns.Parameters.AddWithValue(...);
于 2008-12-16T01:27:17.313 に答える
2

私は似たような、しかし同一ではない問題を抱えていたので、それが誰かを助けてくれる場合に備えて、これを投げます。

ManagementStudioを使用してSQLServerでSQLを実行するか、同じSQLでストアドプロシージャを呼び出して、入力された結果セットを取得することができます。しかし、ASP.NetWebアプリケーションプロジェクトのVisualStudioコードから同じSQLインラインを使用するか、それを含むsprocを呼び出すと、空のDataReaderが取得されました。

同じSQLがManagementStudioで結果セットを返すが、Visual Studioでは空のDataReaderを返すにはどうすればよいでしょうか?答えは、2つのツールで異なる権限を持つ別のユーザーとして実行していたということでした。Management Studioでは、多くのアクセス許可を持つ特定のSQLロールで開発者として実行していました。しかし、Visual Studioでは、クエリを実行しているテーブルに対するアクセス許可が付与されていないサービスアカウントとして実行していました。

実際、私の問題はもう一歩複雑でした。SQL / sprocを変更し、テーブルJOINをもう1つのテーブルに追加するまではすべて問題なく、そのテーブルには必要なサービスアカウントのアクセス許可がありませんでした。ただし、原則は同じです。データベース呼び出しを行うユーザーのすべての権限を調べます。

于 2010-04-28T15:36:31.397 に答える
2

コマンドを実行していると思われるサーバーに対して SQL サーバー トレースを実行します。実際にサーバーに送信されているのは何ですか? そこに決定的な手がかりが見つかると思います。

BFree には、AddWtihValue() と Add() を比較する良い点があります。また、明示的に SqlParameter オブジェクトをインスタンス化している場合は、.Add() で発生するのと同じ問題が発生する可能性があることを確認してください。(int)0 の値を渡すと、Parameters.Add() に設計上の欠陥があることに注意してください。値ではなく列挙型として取得されます...

于 2008-12-16T01:32:31.450 に答える
2

これは明白に思えるかもしれませんが、.Read() メソッドを呼び出していることを教えてください。私はそのような質問をするのは嫌いですが、私たちが問題に頭を悩ませているとき、それは私たちが忘れている最も明白なことです.

于 2008-12-16T01:34:54.317 に答える
1

sqlParam で parameterdirection を設定すると、問題が解決するはずです。

mySqlParam.Direction = ParameterDirection.ReturnValue;

複数の値が返されることが予想される場合は、param を追加して方向を設定します。

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@ID";
    mySqlParam.SqlDbType = SqlDbType.int;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Name";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;


    SqlParameter mySqlParam = new SqlParameter();
    mySqlParam.ParameterName = "@Address";
    mySqlParam.SqlDbType = SqlDbType.NVarChar;
    mySqlParam.Direction = ParameterDirection.ReturnValue;

ストアド プロシージャのmySqlParam.ParameterName名前とまったく同じである必要はありません。

次に、次のように値を読み取ることができます (完全な例ではありません)。

int.Parse(dataReader["ID"]);
dataReader["name"].ToString();
dataReader["address"].ToString();

の値はdataReader[""].ToString();、ストアド プロシージャの列名と一致する必要があります。

于 2009-12-07T12:11:38.733 に答える
0

使用する

reader.ExecuteNonQuery() 

ハッピーコーディング

于 2010-11-03T13:05:44.617 に答える
0

「IEnumerable が結果を返しませんでした」というエラーが発生するのはいつですか? DataReader にアクセスする方法の例を示していただけますか?

戻る前にブレークポイントを設定して実行するとどうなりますか

rdrFilterSearch.GetString(0);

即時ウィンドウで?

于 2008-12-16T00:29:27.990 に答える