使用 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有什么区别