调用类中的方法,将参数传递给DAL方法中的存储过程

时间:2017-11-21 15:48:51

标签: c# sql-server stored-procedures methods parameters

我有两个班级Program.csDataAccessLayer.cs

我有一个“生活”在DataAccessLayer中的存储过程。

我想要做的是当Program.cs运行时,我需要它将两个参数(@Department1@Department2)传递给DAL中的存储过程。

Program中调用DAL方法后,我需要将存储过程结果存储在一个文件中。我知道我必须两次调用DAL方法(一次用于Dept1,第二次用于Dept2)。

我的问题是:如何格式化Program方法以传递Dept1的参数,然后将这些结果存储在Excel文件中?

我假设一旦我在Dept1的Program类中获得了该方法,我可以为Dept2复制并粘贴它,然后只需更改需要传递的参数(@ Department2)。

我并不担心@ StartDate / @ EndDate参数,因为每次运行存储过程都不会改变这些参数。

应该注意,我的变量(@DepartmentID)是存储过程中的静态变量。

基本上这个存储过程的目的是获取Dept1的参数,返回应用程序将放入文件的结果。

然后我再次使用Dept2参数调用有问题的方法,并返回这些结果。希望这有道理......

这就是我目前在DAL中所拥有的......

public bool GetDeptData(SqlConnection Conn, string StartDate,string EndDate, out DataTable DTDepartmentData)
{
    SqlDataAdapter adapter = null;
    SqlCommand cmd = null;

    DateTime startDate = new DateTime();
    DateTime endDate = new DateTime();

    SqlDbType DepartmentID = new SqlDbType();
    DTDepartmentData = new DataTable();

    try
    {
        // Set our start date and end date for last month
        startDate = DateTime.Parse(
            DateTime.Now.AddMonths(-1).Year.ToString() + "-" +
            DateTime.Now.AddMonths(-1).Month.ToString() + "-01 00:00:00");
        endDate = DateTime.Parse(
            DateTime.Now.AddMonths(-1).Year.ToString() + "-" +
            DateTime.Now.AddMonths(-1).Month.ToString() + "-" +
            DateTime.DaysInMonth(DateTime.Now.AddMonths(-1).Year,  DateTime.Now.AddMonths(-1).Month) + " 23:59:59");



        // Call our stored procedure and populate the datatable with the Dept data
        adapter = new SqlDataAdapter();
        cmd = new SqlCommand("sp_EXAMPLESP", Conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
        cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;
        cmd.Parameters.Add("@DepartmentID", SqlDbType.VarChar).Value = "departmentID"; 
        adapter.SelectCommand = cmd;
        adapter.Fill(DTDepartmentData);

        return true;
    }
    catch (Exception CaughtError)
    {
        this.ErrorMsg = "An error occurred in the GetDeptData method: " + CaughtError.ToString() + " || " + Environment.NewLine;
        return false;
    }

1 个答案:

答案 0 :(得分:2)

要将 departmentID 的值从main传递到DAL方法,请将GetDeptData方法的签名更改为此

public bool GetDeptData(string StartDate,string EndDate, string deptId, out DataTable DTDepartmentData)
{

     // The SqlConnection should be created here and destroyed 
     // here, everytime you call this method

     using(SqlConnection con = new SqlConnection(....connectionstring....))
     {
        // then use the deptId value in the creation 
        // of the parameter @DepartmentId
       .....
       cmd.Parameters.Add("@DepartmentID", SqlDbType.VarChar).Value = deptId; 
       adapter.Fill(DTDepartmentData);
       return true;

    }
 }
 catch(Exception ....)
 {
     ...
 }  

现在在Program.cs中,你应该创建一个DAL类的实例并调用传递所需值的方法

 DataTable dtResult = null;
 string startDate = SomeCodeToGetTheStartDate();
 string endDate = SomeCodeToGetTheEndDate();
 string deptId = SomeCodeToGetTheDeptId();
 MyDALClass cs = new MyDALClass();
 if(cs.GetDeptData(startDate, endDate, deptId, out dtResult)
     .... success ....

旁注:您确定departmentId是字符串值而不是整数吗?