使用 sqlcommand 填充 reportviewer 但仅从一个表中填充选定的字段如何添加另一个表?

Posted

技术标签:

【中文标题】使用 sqlcommand 填充 reportviewer 但仅从一个表中填充选定的字段如何添加另一个表?【英文标题】:Using sqlcommand to fill reportviewer but only selected fields get filled in from one table how do i add another table? 【发布时间】:2014-11-06 18:59:47 【问题描述】:

我正在开发一个 etime 历史应用程序,数据从 adp 应用程序带入 sql。

要求

用户希望查看特定员工的旧考勤表信息

流程

用户点击 1) 下拉菜单中的工资组 2) 员工下拉菜单按工资组分组 3) 选择(从日期)和(到日期) 4) 单击运行报告并填写数据

完美地填写下拉列表的工作,当我单击运行报告时,仅填写 paygroup、empid 和 date 列,但未填写 DeptNo、WorkCenterID、JobCode、InPunch、OutPunch 列。哦,正在填写的列在 EtimePunchDetail 表中,其他列在 EtimeEmployees 中,我如何使用 EtimeEmployees 而我的 SqlCommand 中的字段是我的问题?这些字段不是参数,所以我很困惑,因为其他字段是参数...

我用来填充列的代码

private void button1_Click(object sender, EventArgs e) //run report button loads all the pieces onto the report.
        

            if (FromDate.Value > ToDate.Value)
            
                MessageBox.Show("From Date Must be Less Than To Date");
            
            else
                //fileexport
                using (MSSQL.SqlConnection connection = new MSSQL.SqlConnection(constr))
                
                    timepunchnew = new EtimeHistoryDataSet();
                    connection.Open();
                    MSSQL.SqlCommand command = new MSSQL.SqlCommand("SELECT * From EtimePunchDetail WHERE (EmpID = @empid) And  (Paygroup = @paygroup) And (TransDate >= @fromdate) And (TransDate <= @todate)", connection);
                    

                        MSSQL.SqlParameter parmEmp = new MSSQL.SqlParameter();
                        parmEmp.ParameterName = "@empid";
                        parmEmp.Value = Employee.SelectedValue;
                        command.Parameters.Add(parmEmp);

                        MSSQL.SqlParameter paramPayGroup = new MSSQL.SqlParameter();
                        paramPayGroup.ParameterName = "@paygroup";
                        paramPayGroup.Value = Paygroup.SelectedValue;
                        command.Parameters.Add(paramPayGroup);

                        MSSQL.SqlParameter paramFromDate = new MSSQL.SqlParameter();
                        paramFromDate.ParameterName = "@fromdate";
                        paramFromDate.DbType = DbType.DateTime;
                        paramFromDate.SqlDbType = SqlDbType.DateTime;
                        paramFromDate.Value = FromDate.Value.ToString("");
                        command.Parameters.Add(paramFromDate);

                        MSSQL.SqlParameter paramToDate = new MSSQL.SqlParameter();
                        paramToDate.ParameterName = "@todate";
                        paramToDate.DbType = DbType.DateTime;
                        paramToDate.SqlDbType = SqlDbType.DateTime;
                        paramToDate.Value = ToDate.Value;;
                        command.Parameters.Add(paramToDate);

                        MSSQL.SqlDataAdapter EtimePunchDetailTableAdapter = new System.Data.SqlClient.SqlDataAdapter();
                        EtimePunchDetailTableAdapter.SelectCommand = command;
                        EtimePunchDetailTableAdapter.Fill(timepunchnew, "Etime");

                        string exeFolder = Path.GetDirectoryName(Application.ExecutablePath);
                        string reportPath = exeFolder + @"\Report1.rdlc";

                        reportViewer1.LocalReport.DisplayName = MakeValidFileName(Employee.Text) + "-" + FromDate.Value.ToString("MM") + "!" + (FromDate.Value.ToString("dd")) + "!" + FromDate.Value.ToString("yyyy") + "-" + ToDate.Value.ToString("MM") + "!" + ToDate.Value.ToString("dd") + "!" + ToDate.Value.ToString("yyyy");

                        reportViewer1.LocalReport.ReportPath = reportPath;

                        reportViewer1.LocalReport.DataSources.Clear();

                        reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("EtimeHistoryDataSet_Etime", timepunchnew.Etime));

                        reportViewer1.RefreshReport();
                        reportViewer1.Refresh();
                        reportViewer1.Visible = true;

                    
                
        

【问题讨论】:

【参考方案1】:

您可以在 SQL 语句中添加连接以从其他表中获取记录。

你的情况……

SELECT pd.*, e.EmployeeNameOrWhateverFieldYouWant 
FROM EtimePunchDetail pd  INNER JOIN EtimeEmployee e ON e.EmpID = pd.EmpID   
WHERE (pd.EmpID = @empid) And  (pd.Paygroup = @paygroup) 
And (pd.TransDate >= @fromdate) And (pd.TransDate <= @todate)

注意表别名的添加使得引用表更加方便,因为您需要限定两个表中存在的任何字段(否则 SQL 无法判断您尝试从哪个表获取数据,并且抛出错误)。

如果您需要使用员工表中的字段来过滤结果,您只需将它们添加为参数。它们会在选择列表中正常工作。

【讨论】:

以上是关于使用 sqlcommand 填充 reportviewer 但仅从一个表中填充选定的字段如何添加另一个表?的主要内容,如果未能解决你的问题,请参考以下文章

使用相同的 SqlConnection 对 SqlCommand.BeginExecuteNonQuery 的多个并发调用

SqlCommand和SqlDataAdapter有什么区别

检测 SqlDataAdapter 填充方法何时完成

ADO.NET_SqlCommand类

SqlCommand.ExecuteReader() 啥时候返回 null?

如何使用 SqlCommand 返回多个结果集?