【问题标题】:How to show DataColumns in Dataset DataTable如何在数据集 DataTable 中显示 DataColumns
【发布时间】:2013-02-08 21:31:31
【问题描述】:

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

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”功能之外如何完成查询...

【问题讨论】:

  • 什么意思它没有在DataColumn中列出任何东西?
  • 你能告诉我们你的编译代码吗?
  • 在数据集中你有一个“数据表”和一个“tableadapter”。在 tableadapter 里面通常是“Fill,GetData()”,任何参数都放在 () 里面。对于数据表,它通常显示通常对应于“选择”列的“数据列”。但是,没有任何“数据列”,它只是空白......因此,如果我尝试使用报表查看器创建报表,它不会显示任何要报告的内容。
  • @Love2Learn 我不确定你的意思。几乎没有任何代码,因为它不会创建 .rdlc。
  • @Shmewnix,将 SQL 移动到 Storedprocedure 并使用它来填充您的 dataset

标签: c# sql sql-server vb.net sql-server-2005


【解决方案1】:

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

请注意,这些代码 sn-ps 有很大一部分未经测试。

【讨论】:

    【解决方案2】:

    我认为不要使用拖放界面来创建 tableAdapter,因为您的查询包含 OVER SQL 构造(就像错误所说的那样),您必须创建 tableAdapter 并在代码中填充数据表.

    【讨论】:

    • 我不知道该怎么做。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多