用一个按钮调用多个存储过程和Gridview单击

问题描述

| 背景:我正在转换访问运行时间,该运行时间将按邮政编码,计划类型和年龄搜索计划。 到目前为止,我已经进行了主搜索,正确显示了存储过程
get_zip_plan_age
,但是不确定我是否在C#代码后面正确地调用了存储过程
get_lowest_female_insurance_rate
,以及如何为显示最低的
get_lowest_female_rate
编写不同的代码每个年龄组的女性比率与显示所有数据的“ 0”比率。 题: 您如何在后面的代码中正确调用
get_lowest_female_rate
?我说的对吗? 您如何编写
get_lowest_female_rate
的存储过程代码,该代码显示每个年龄段(65、70、75、80)的最低女性比率? 这是访问运行时的屏幕截图: 这是我的default.aspx.cs代码:
    protected void Search_Zip_Plan_Age_Button_Click(object sender,EventArgs e)
    {                          
        using (SqlConnection cn = new SqlConnection())
        {
            cn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[\"PriceFinderConnectionString\"].ToString();
            cn.Open();

            using (SqlCommand cmd = cn.CreateCommand())
            {
                cmd.CommandText = \"get_zip_plan_age\";                    
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = \"get_lowest_female_rate\";
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = \"get_lowest_male_rate\";
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = \"get_carrier_info\";
                cmd.CommandType = CommandType.StoredProcedure;


                SqlParameter parm = cmd.CreateParameter(); 
                parm.ParameterName = \"@insur_age\";
                parm.DbType = DbType.Int64;
                parm.Value = Convert.ToInt64(this.insur_age.Text);
                cmd.Parameters.Add(parm);

                parm = cmd.CreateParameter(); 
                parm.ParameterName = \"@zip_code\";
                parm.DbType = DbType.String;
                parm.Value = this.ZipCode.Text;
                cmd.Parameters.Add(parm);

                parm = cmd.CreateParameter(); 
                parm.ParameterName = \"@plan_code\";
                parm.DbType = DbType.String;
                parm.Value = this.PlanCode.Text;
                cmd.Parameters.Add(parm);

                SqlDataReader reader = cmd.ExecuteReader();
                Zip_Plan_Age_GridView.DataSource = reader;
                Zip_Plan_Age_GridView.DataBind();
            }
        }
    }
这是显示所有数据的存储过程get_zip_plan_age的代码:
    ALTER PROCEDURE get_zip_plan_age 
-- Add the parameters for the stored procedure here
@zip_code nvarchar(16),@plan_code nvarchar(16),@insur_age int = 0 

    AS
    BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

IF @insur_age > 0 
BEGIN 

    SELECT 

      [state_code],[zip_code],[female_value],[male_value],[carrier_name],[update_date],[insur_age],[plan_code],[spousal_discount] 

      FROM [state_zipcode_plans] 

      WHERE (([insur_age] = @insur_age) 
      AND ([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)) 

      ORDER BY [male_value],[plan_code]

END  

    ELSE BEGIN

      SELECT 

      [state_code],[spousal_discount] 

      FROM [state_zipcode_plans] 

      WHERE (([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)) 

      ORDER BY [male_value],[plan_code]

END
 END
 GO
    

解决方法

在Search_Zip_Plan_Age_Button_Click方法中,您已多次设置cmd.CommandText和cmd.CommandType。在这种情况下,只能设置一次-它们的值将为cmd.CommandText = \“ get_carrier_info \”; cmd.CommandType = CommandType.StoredProcedure; 为了使您的代码更具可维护性,请考虑将命令创建与工厂命令模式分开。 就sp而言-我只能看到get_zip_plan_age的sp。     ,我的建议是:如果要将内容绑定到用户可以查看/编辑的表单,请不要使用ѭ8。这将使数据库连接保持打开状态-可能会持续很长时间! 如果您使用表格来显示数据,我将使用ORM(对象关系映射器)从数据库中获取对象列表-否则,请至少使用
DataTable
它获取数据,然后允许您与数据库断开连接,直到实际需要更新内容(或读取新数据)为止。 至于调用存储的proc: 使用
using
积木可获得大笔奖励!! 我会尝试尽可能晚地打开连接-创建参数和填充时不必打开连接-仅在需要读取数据之前打开连接 我会尝试将UI代码(读取文本框,绑定到网格)与实际代码分开,以加载数据-您可能希望将其放入数据访问层(单独的类库)中,在某些时候-不要\“不要将加载数据与操作UI混在一起! 我将单独的调用与单独的存储过程分开-仅有四个方法,您可以在需要时使用所需的参数进行调用。 因此,我将尝试使用以下方式:
protected void Search_Zip_Plan_Age_Button_Click(object sender,EventArgs e)
{       
    string _connStr = ConfigurationManager.ConnectionStrings[\"PriceFinderConnectionString\"].ConnectionString;

    DataTable data = LoadZipPlanAge(_connStr,.......);

    Zip_Plan_Age_GridView.DataSource = data;
    Zip_Plan_Age_GridView.DataBind();
}


protected DataTable LoadZipPlanAge(string connString,Int64 insurAge,string zipCode,string planCode)
{
    string storedProcName = \"dbo.get_zip_plan_age\";                    
    DataTable table = new DataTable();

    using (SqlConnection cn = new SqlConnection(connString))
    using (SqlCommand cmd = new SqlCommand(storedProcName,cn))
    {
       cmd.CommandType = CommandType.StoredProcedure;

       // create parameters
       cmd.Parameters.Add(\"@insur_age\",SqlDbType.Int64).Value = int64Value;
       .......


       SqlDataAdapter dap = new SqlDataAdapter(cmd);
       dap.Fill(table);
    }

    return table;
}
    ,使用逻辑, 如果选择了保险年龄,则仅显示该年龄的最低女性比率选择年龄为指定年龄的前(1)个最低女性价值 如果为保险年龄选择了全部,则通过选择最高(1)最低女性价值,邮政编码在哪里,计划代码与指定的搜索值相匹配,并且显示最低女性比率,并且男性比率大于0,按insur_age,male_value,每个年龄组65、70、75、80的每个年龄的carrier_name和UNIONed 这是我用于获得最低女性率的存储过程:
      ALTER PROCEDURE [dbo].[get_lowest_female_rate] 
-- Add the parameters for the stored procedure here
@zip_code nvarchar(16),@plan_code nvarchar(16),@insur_age int = 0 

      AS
      BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

          -- Insert statements for procedure here

          -- If an Insurance Age is selected,only display the min Female rate for that age 

          IF @insur_age > 0 
          BEGIN 

    SELECT TOP(1)  
      [carrier_name],[insur_age],MIN([female_value])

      FROM [state_zipcode_plans] 

      WHERE (([insur_age] = @insur_age) 
      AND ([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)
      AND ([female_value] > 0)) 

      GROUP BY        
      [insur_age],[female_value],[carrier_name]

END  

        -- If ALL is selected for Insurance Age,Display Lowest Female Rate for Each of the Age Groups 65,70,75,80 

        ELSE BEGIN

      SELECT TOP(1)           
      [carrier_name],MIN([female_value])

      FROM [state_zipcode_plans]

      WHERE  (([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)
      AND ([female_value] > 0)
      AND ([insur_age] = 65)) 

      GROUP BY        
      [insur_age],[carrier_name]

        UNION 
      SELECT TOP(1)           
      [carrier_name],MIN([female_value])

      FROM [state_zipcode_plans]

      WHERE  (([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)
      AND ([female_value] > 0)
      AND ([insur_age] = 70)) 

      GROUP BY        
      [insur_age],[carrier_name]

UNION 
      SELECT TOP(1)           
      [carrier_name],MIN([female_value])

      FROM [state_zipcode_plans]

      WHERE  (([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)
      AND ([female_value] > 0)
      AND ([insur_age] = 75)) 

      GROUP BY        
      [insur_age],[carrier_name]

       UNION 
      SELECT TOP(1)           
      [carrier_name],MIN([female_value])

      FROM [state_zipcode_plans]

      WHERE  (([zip_code] = @zip_code) 
      AND ([plan_code] = @plan_code)
      AND ([female_value] > 0)
      AND ([insur_age] = 80)) 

      GROUP BY        
      [insur_age],[carrier_name]     

     END
   END
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...