2013-02-08 48 views
2

我有一个查询,我把数据集作为一个数据表。查询运行良好,但在数据表中,它没有列出数据列中的任何内容,因为我无法报告它...任何想法,为什么这不起作用?我的查询如下。如何显示数据集DataTable中的DataColumns

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 

enter image description here

当创建在威泽德表适配器......我得到一个错误信息:

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”功能...

+1

你是什么意思,它没有列出DataColumn中的任何东西? – Taryn 2013-02-08 21:38:18

+0

你能告诉我们你的编译代码吗? – 2013-02-08 21:42:25

+0

在数据集中您有一个“数据表”和一个“表适配器”。在tableadapter里面通常是“Fill,GetData()”任何参数放在()里面。对于数据表,它通常显示通常对应于“选择”列的“数据列”。但是,没有任何“数据列”只是空白的...因此,如果我尝试使用报表查看器创建报表,它不会显示任何报表。 – Shmewnix 2013-02-08 21:44:51

回答

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); 

请注意,这些代码段的很大一部分是未经检验的。

+0

这里编辑了一些东西:'SELECT A. * FROM(...)A ...' – Sachin 2013-02-18 10:30:27

6

我认为,而不是使用拖放界面来创建tableAdapter,因为您的查询包含OVER SQL构造(如错误说,)你会有创建你的tableAdapter并在代码中填充你的数据表。

+0

我不知道该怎么做。 – Shmewnix 2013-02-12 17:04:49

3

你可以从你的查询创建一个视图,然后从你的视图中简单地选择,这应该从tableAdapter隐藏OVER SQL。

相关问题