0

我正在编写一个应用程序,它首先连接到数据库并检索一个包含所有存储过程、输入及其相关数据类型列表的 dt。然后,用户从组合框中选择了一个 SProc,并且必须输入必要的输入。然后,应用程序将连接到数据库并使用用户指定的输入运行选定的 SProc,并在数据表中返回结果。

我不确定是否需要为每个 SProc 编写特定的方法。我假设是这样,因为我不知道如何说明其他参数是什么。

很抱歉第一次没有说清楚。如果这还不够清楚,请告诉我。

示例如下(这是别人的代码)

public static GetDaysDTO GetDays(int offset)
    {
        GetDaysDTO ret = new GetDaysDTO { TODAY = DateTime.Now, TOMORROW = new DateTime(2012, 01, 01) };
        SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Server = FrazMan-pc\Programming; Database = master; Trusted_Connection = True");
        SqlCommand cmd = new System.Data.SqlClient.SqlCommand
        {
            CommandText = "GetDays",
            CommandType = System.Data.CommandType.StoredProcedure,
            CommandTimeout = 1,
            Connection = con,
            Parameters = { new System.Data.SqlClient.SqlParameter("@offset", System.Data.SqlDbType.Int) { Value = offset } }
        };
        using (con)
        {
            con.Open();
            using (System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    ret.TODAY = DateTime.Parse(reader[0].ToString());
                    ret.TOMORROW = DateTime.Parse(reader["TOMORROW"].ToString());
                }
            }
        }

        return ret;
    }
4

1 回答 1

2

您正在寻找的是一种名为 Factory 的设计模式,以及一种告诉在每个 SP 调用上创建哪个类型的数据表的方法 如果您有每个过程的参数列表,您可以通过循环实例 化
Parameters 对象:
类将用于填充从 db 接收到的 sp 的参数

class ParamData
{
  public object Data;
  public SqlDbType type;
  public string ParamName;
}


然后稍后,在调用 sp 时,您还应该将您的 ParamData 对象传递给该方法,并使用它在循环中动态填充您的 sp 的参数:

List<ParamData> list = new List<ParamData>();
//initialize command here as u did
SqlCommand cmd;
foreach (ParamData param in list)
{
  SqlParameter sqlParam = new SqlParameter(param.ParamName, param.type);
  sqlParam.Value = param.Data;
  cmd.Parameters.Add(sqlParam);
}
//execute the command
//fill the datatable with result
DataTable dt = GetTableBySPName("GetDays");
SqlDataReader reader = cmd.ExecuteReader();
dt.Load(reader);


您唯一需要添加的是您的类型化数据表和过程返回的表之间的映射。
您可以添加一个方法来执行此操作:

private DataTable GetTableBySPName(string name)
{
  DataTable dt = null;
  switch (name)
  {
   case "GetDays":
   {
    dt = new GetDatsDTO();
    break;
   }
  }
 return dt;
}


于 2012-05-19T12:00:44.583 回答