c#和存储过程,每个SProc的唯一代码?

时间:2012-05-19 10:54:19

标签: c# sql-server c#-4.0 stored-procedures

我正在编写一个应用程序,它首先连接到数据库并检索包含所有存储过程,输入及其相关数据类型的列表的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;
    }

1 个答案:

答案 0 :(得分: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);


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

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