2011-02-07 4 views
0

DataGridのデータソースとして使用するDataTableを入力するためにSqlDataAdapterを使用しようとしています。少なくともSSMSEで手動で実行すると、クエリは正常です。塗りつぶし操作を実行すると、テーブルには右の列が取得されますが、行は取得されません。これの最も不満足な部分は、コードが別のページ上で(別のクエリで)同一であることです。私は、クエリを投稿することはできませんが、私の初期化コードは次のようになります。SqlDataAdapter.Fill(DataTable)No行を返す

SqlCommand areaDAC = new SqlCommand (areaQuery, connection); 
areaDAC.Parameters.Add (new SqlParameter ("@param", System.Data.SqlDbType.NVarChar, 50)); 
m_areaDataAdapter = new SqlDataAdapter (areaDAC); 

そして、それを使用する:

m_areaDataAdapter.SelectCommand.Parameters["@param"].Value = "Filter Val"; 
DataTable table = new DataTable(); 
m_areaDataAdapter.Fill (table); 

この時点で、テーブルが列なし正しい行数をしています。私はパラメータが正しく追加されていることを知っている、私はデータが特定のクエリのために存在することを知っている。

更新(コメントにニックによって提供されるように):あなたが試みることができる

SELECT * FROM 
    (SELECT 
     ROW_NUMBER() OVER(ORDER BY DateAndTime DESC) AS rowNum, 
     areaName, stationName, lineName, DateAndTime, 
     Element, Description 
    FROM 
     sdrReportArea, sdrReportStation, sdrReportTLine, 
     SDRSequenceEvents, SDRSequenceStates 
    WHERE 
     sdrReportArea.areaID = sdrReportStation.stationID 
     AND sdrReportStation.stationID = sdrReportTLine.stationID 
     AND sdrReportTLine.lineID = SDRSequenceEvents.LineID 
     AND SDRSequenceEvents.StateID = SDRSequenceStates.StateID 
     AND DateAndTime >= @startDate AND DateAndTime <= @endDate 
     AND areaName = @area) AS TempTbl 
WHERE 
    rowNum BETWEEN @startRow AND @endRow; 
+1

SQLマネージャで直接SQLクエリをテストしましたか?あなたは例外をキャッチして手がかりを調べていますか? –

+1

接続文字列も確認することをお勧めします。動作しているクエリが、探しているデータを持たない別のバージョンのデータベースに移動している可能性はありますか? –

+0

クエリは手動で正常に動作します。接続文字列はOKで、手動でテストしたサーバーと一致します。私はC#コードを実行するときに例外はありません。 rowNum列の目的は、一度に50行しかデータをウィンドウに表示しないことです。これも手動でうまく動作します。 – Nik

答えて

2
  1. 再びwhere句とテストで日付型パラメータを削除してください。
  2. そして私はこのような問題に直面していました。「オーバー」が動作しないタイプのデータセット(IMO)では、ここでもうまくいきません。可能であれば、代わりにSPを使用してください。
+0

私はあなたのコメントを理解していません。私はクエリとSPの違いについて知っていますが、SPはどのように私をここで助けますか?私のテーブルは右の列で終わり、データはまったくありません。 – Nik

+0

実際の問題は、Row_Number And Overを使用するプレーンなSQLクエリにあると思います。そして私は、カスタムページネーションを行う際に、型付きデータセットでこのような問題に直面しました。だから、後で私はそのクエリを移動してもストアドプロシージャとそれが働いた。可能であれば私はSPにそれを置くように言いました。 – paragy

+0

ストアドプロシージャの作成は終了しましたが、日付と時刻のパラメータを文字列として渡してSPの内部に変換する必要もありました。 – Nik

1

ことの一つは、のExecuteReaderを実行し、結果を反復処理するかもしれません。

IDataReader reader = m_areaDataAdapter.SelectCommand.ExecuteReader(); 
while(reader.Read()) 
{ 
    ... 
} 

これは、問題がコマンドまたはDataTableにあるかどうかを確認するのに役立ちます。私はパラメータが正しく追加されている知っている

、私はあなたがデバッグしているとき、データが特定のクエリ

のために存在することを知って、あなたはこの1を含むすべてのあなたの前提を、疑問視すべきです。また、SSMSEを使用して手動でクエリを実行すると、接続が異なる設定(ANSI NULL、ANSI PADDINGなど)で異なる結果が得られることにも注意してください。

EDIT

ニックさんのコメントを受けて、ここではこれをデバッグするためのいくつかの提案があります。

  1. 実行同様のコードが、それは、任意のパラメータ(開始/終了日付すなわちハードワイヤード値、面積、開始/終了行)を有しないようにクエリを変更します。これで問題が解決しない場合は、接続がSSMSEとは異なる設定になっている可能性があります。それがうまくいく場合は...

  2. クエリが失敗するまで、パラメータを1つずつ追加します。その結果、どのパラメーターが失敗したのかを特定することができます。おそらくペニーがドロップし、その理由(たとえば、パラメータ名のミスペルト)が表示されます。そうでない場合は、ここにコードを投稿します。

+0

ANSI NULLのようなものをチェックするには?データ・リーダーはデータを戻していません。私は、ものが実行される前に、私はパラメータとその値をメモリでチェックし、正しく設定されているので、パラメータが正しく追加されていると言います。パラメータを使用するために明示的に言わなければならないことはありますか? – Nik

0

ADO.NET呼び出しを実行するWebサービスを通じてクエリにアクセスしていますか?サーバーのタイムゾーンが異なる場合、@StartDateと@ EndDateの値が期待どおりにならないことがあります。

0

複数のWHERE句による結合の間に問題が発生することがあります。あなたは、特定のIDにどのテーブルが結合されていても、あなたのデータベースのテーブルやデータと同じかどうかを調べなければなりません。

1

OracleDataAdapterと同様の問題がありました。私も簡単な

select * from table

を行うにしようとしていたし、それは働いていませんでした。私は

DbCommand.CommandTimeout

プロパティを設定してしまった、それが仕事を始めました。これまで私はこれらのプロパティを設定する必要がなかったので、私はまだ混乱しています。

+0

あなたのネットワーク接続が、帯域幅/スループットが不十分であるか、DBサーバーがビジー状態になってコマンドを取得および/または処理できなかったために、時間切れになっていました。あなたは正しいことをしました。 – vapcguy

0

私はそれはOPの質問に対処している場合かわからない、誰かを助けるかもしれませんが、私は、同様の問題があった:

を私は似て使用して、私は行が戻されなかっ取得し、例外Cannot find table 0た問題がありましたアダプタを使用してデータセット(データセット内にテーブルを自動的に作成する)を埋め込むコード。

(簡単にするために、OracleCommandの、接続口を示していない)コードの

関連スニペット:私はOracleCommandのを経由して送信されたクエリは、塗りつぶしを行って、結果を得ている必要があります知っていた

DataSet ds = new DataSet(); 
OracleDataAdapter oraAdp = new OracleDataAdapter(); 

oraAdp.Fill(ds); 
return ds.Tables[0]; 

- かそこら私は思った。 Oracle SQL Developerで問合せを実行したとき、実際の例外が発生しました。これは、フィールドの1つに対して問合せに間違ったフィールド名が付いていたことです。私が質問を修正したとき、すべてがうまくいった。

関連する問題