6

SQLデータベースに接続するASP.NET2.0Webサイトがあります。SQL Serverを2000から2008にアップグレードしましたが、それ以降、1ページが機能しなくなりました。

私は問題を解決しました。データセットが空でなくてもSqlDataReader.HasRowsの呼び出しがfalseを返し、チェックを削除すると、reader.Read()を介したループが期待されるデータにアクセスできるようになります。

    _connectionString = WebConfigurationManager.ConnectionStrings["SQLServer"].ConnectionString;
    SqlConnection connection = new SqlConnection(_connectionString);
    SqlCommand command = new SqlCommand(searchtype, connection);
    SqlParameter _parSeachTerm = new SqlParameter("@searchterm", SqlDbType.VarChar, 255);
    _parSeachTerm.Value = searchterm;
    command.Parameters.Add(_parSeachTerm);
    command.CommandType = CommandType.StoredProcedure;
    try
    {
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        if (reader.HasRows) //this always returns false!?
        {
            while (reader.Read())
            {...

誰かが何が起こっているのか分かりますか?HasRowsが正しい値を返す他のページにも同様のコードブロックがあります。

編集-明確にするために、HasRowsチェックを削除するとループが正常に実行されるため、ストアドプロシージャは確認した結果を返します。接続文字列内のSQLサーバーの名前だけを、SQL 2000で実行されている同一のデータベースに変更すると、問題は解決します。NOCOUNTがオフになっていることを確認しましたが、そうでない場合にHasRowsがfalseを返す原因は他にありますか?

編集2-これがSPです

CREATE PROCEDURE StaffEnquirySurnameSearch

@searchterm varchar(255)

AS

SELECT  AD.Name, AD.Company, AD.telephoneNumber, AD.manager, CVS.Position, CVS.CompanyArea, CVS.Location, CVS.Title, AD.guid AS guid,
AD.firstname, AD.surname
FROM ADCVS AD
LEFT OUTER JOIN CVS ON
AD.Guid=CVS.Guid 
WHERE AD.SurName LIKE @searchterm
ORDER BY AD.Surname, AD.Firstname
GO

よろしくお願いします。

4

7 に答える 7

1

ストアドプロシージャは、SSMSなどで直接呼び出すと機能しますか?私はそれがすることを確認することから始めます。

于 2008-10-13T11:26:45.287 に答える
1

HasRowsスクロール可能なカーソルが必要です。

戻す行に大きなimage/BLOBデータが含まれていますか?

他の誰かが示唆したように、投稿するとStored Procedure問題が明らかになる可能性があると思います...

于 2008-10-13T15:19:54.553 に答える
0

まず、@tvanfossonが言うように手順を確認します。次に、コードスニペットではHasRows()のチェックは実際には不要です。

于 2008-10-13T11:30:55.623 に答える
0

たまたま RAISEERROR を使用していませんか? 上記と同じパターンを使用していくつかの問題を発見し (HasRows をチェックしてから、reader.Read() をチェック)、RAISEERROR が特定のエラー コード (16 を超えると思います) で使用された場合、HasRows が false返すことがわかりました。例外をキャッチする際の問題。

于 2008-10-13T15:10:07.240 に答える
0

これは、接続文字列、ストアド プロシージャ、または SQL ドライバーのバグのいずれかです。ほとんどの人は、ストアド プロシージャを推測しています。それでは、コードを示してください。その間、接続文字列と searchtype 変数の内容を表示してください。

于 2008-10-13T15:11:22.043 に答える
0

NOCOUNT 後方に持っていると思います。これが機能するには、NOCOUNT がオンになっている必要があると思います。

ストアド プロシージャで、AS の後、コードの前に SET NOCOUNT ON を追加します。それ以外の場合は、2 つの結果セットが返されます。1 つはカウント、もう 1 つは実際のデータです。実際のデータを含む結果セットのみが必要です。

于 2008-10-13T22:17:12.510 に答える
0

また推測です。
ひょっとしてデータリーダーを複数開いていませんか?

MARS_Connection=yes; を追加します。または MultipleActiveResultSets=true を接続文字列に追加すると、それが役立つ場合があります。
また、接続とデータリーダーの使用は、推奨される方法ではありません

それを書くためのより簡単な方法は


using (connection cnn = new Connection(...)
{
using (SqlDataReader rdr = ....
{
//some code which deals with datareader
}
}

これにより、操作が完了すると、接続とデータリーダーが閉じられます。

于 2008-10-13T16:10:42.203 に答える