2

データセットにデータテーブルとして入れたクエリがあります。クエリはうまく実行されますが、データテーブルではデータ列に何も表示されません。レポートできないためです...これが機能しない理由はありますか? 私のクエリは以下です。

SELECT * FROM (
    SELECT timeclock.dtTimeIn, timeclock.dtTimeOut, employees.sfirstname,
       RANK() OVER ( ORDER BY dtTimeIn) rk1, --earliest record gets 1
       RANK() OVER (ORDER BY dtTimeOut DESC) rk2 --latest record gets 1

    FROM   TimeClock INNER JOIN
                         Employees ON TimeClock.lEmployeeID = Employees.lEmployeeID
    WHERE (dtTimeIn > dateadd(day, datediff(day, 0, getdate())-1, 0)) AND (dtTimeOut < dateadd(day, datediff(day, 0, getdate()), 0)) AND 
      (sDept IN ('1', '2', '3'))
) A
WHERE rk2=1 

クエリを実行したときの現在の出力:

  dtTimeIn                    dtTimeOut       sfirstname    rk1      rk2
2/7/2013 2:36:00 PM 2/7/2013 7:52:33 PM        Brian        10        1

ここに画像の説明を入力

ウィザードでテーブル アダプタを作成すると、次のエラー メッセージが表示されます。

The Wizard detected the following problems when configuring the TableAdapter:
"OpenTime":

Details:
Generated SELECT statement.
The OVER SQL construct or statement is not supported
To add these components to your dataset, click Finish.

クエリが気に入らないと思います...しかし、「OVER」関数を使用する以外にクエリを実行する方法がわかりません...

4

3 に答える 3

8

TableAdapterウィザードの制限により、DataTable使用するコードを作成する必要があります。

DataTable dataTable;

using (SqlConnection sqlConn = new SqlConnection())
{
    sqlConn.Open();

    using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter())
    using (sqlDataAdapter.SelectCommand = sqlConn.CreateCommand())
    {

        sqlDataAdapter.SelectCommand.CommandType = CommandType.Text;
        sqlDataAdapter.SelectCommand.CommandText = '
            SELECT * FROM (
                SELECT timeclock.dtTimeIn, timeclock.dtTimeOut, employees.sfirstname,
                    RANK() OVER ( ORDER BY dtTimeIn) rk1, --earliest record gets 1
                    RANK() OVER (ORDER BY dtTimeOut DESC) rk2 --latest record gets 1

                FROM TimeClock INNER JOIN
                    Employees ON TimeClock.lEmployeeID = Employees.lEmployeeID
                WHERE (dtTimeIn > dateadd(day, datediff(day, 0, getdate())-1, 0)) AND (dtTimeOut < dateadd(day, datediff(day, 0, getdate()), 0)) AND (sDept IN ('1', '2', '3'))
            ) A
            WHERE rk2=1';

        sqlDataAdapter.Fill(dataTable);
    }
}

入力したらdataTable、それを ReportViewer のDataSource

ReportDataSource rds = new ReportDataSource(dataTable.TableName, dataTable);
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(rds);

これらのコード スニペットの大部分はテストされていないことに注意してください。

于 2013-02-13T21:47:49.400 に答える
6

ドラッグ アンド ドロップ インターフェイスを使用して tableAdapter を作成する代わりに、クエリにOVER SQL構成が含まれているため (エラーが示すように)、tableAdapter を作成し、データ テーブルにコードを入力する必要があると思います。

于 2013-02-11T18:34:36.070 に答える
3

クエリからビューを作成し、ビューから選択するだけで、テーブルアダプターから OVER SQL を非表示にすることができます。

于 2013-02-13T21:11:42.000 に答える