Вызов нескольких хранимых процедур и Gridview одним нажатием кнопки - PullRequest
1 голос
/ 25 мая 2011

Справочная информация. Я конвертирую время выполнения доступа для поиска планов по почтовому индексу, типу плана и возрасту.

Пока что основной поиск отключен, и хранимая процедура get_zip_plan_age отображается правильно, но я не уверен, правильно ли я вызываю хранимую процедуру get_lowest_female_insurance_rate в коде C # и как по-другому писать код для get_lowest_female_rate, который отображает самый низкий показатель женского пола для каждой возрастной группы, против get_zip_plan_age, который отображает все данные.

Вопрос:

  • Как правильно назвать get_lowest_female_rate в коде? Что я правильно понял?
  • Как бы вы написали код хранимой процедуры для get_lowest_female_rate, который отображает наименьшую долю женщин в каждой возрастной группе (65, 70, 75, 80)?

Вот скриншот среды доступа:

app screenshot

Вот мой код для 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], 
      [zip_code], 
      [female_value], 
      [male_value], 
      [carrier_name], 
      [update_date], 
      [insur_age], 
      [plan_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

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Моя рекомендация: не используйте SqlDataReader, если хотите связать материал с формой, которую пользователь может просматривать / редактировать. Это будет держать соединение с базой данных открытым - возможно, в течение очень долгого времени!

Если вы используете формы для отображения данных, я бы использовал ORM (объектно-реляционный маппер), чтобы получить список объектов из вашей базы данных - или, если это не то, что вы хотите, то, по крайней мере, используйте * 1004. * который получает данные, а затем позволяет вам работать независимо от базы данных до того момента, когда вам действительно нужно обновить данные (или прочитать новые данные).

Что касается вызова хранимой процедуры:

  • БОЛЬШОЙ бонус за использование using блоков !!
  • Я бы попытался открыть соединение как можно позже - его не нужно открывать, пока вы создаете параметры и прочее - открывайте его только перед тем, как вам нужно прочитать данные
  • Я бы попытался отделить код пользовательского интерфейса (чтение текстовых полей, привязка к сетке) от фактического кода для загрузки данных - вы можете поместить его в слой доступа к данным (отдельный класс библиотека) в какой-то момент - не смешивайте загрузочные данные с повсеместным манипулированием пользовательским интерфейсом!
  • Я бы отделил отдельные вызовы от отдельных хранимых процедур - просто есть четыре метода, которые вы можете вызывать при необходимости с необходимыми параметрами.

Так что я бы попробовал использовать что-то вроде этого:

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 голос
/ 25 мая 2011

В методе Search_Zip_Plan_Age_Button_Click вы установили cmd.CommandText и cmd.CommandType несколько раз.В этом случае он должен быть установлен только один раз - они будут иметь значения cmd.CommandText = "get_carrier_info";cmd.CommandType = CommandType.StoredProcedure;

Чтобы сделать ваш код более понятным, рассмотрите возможность разделения создания команд на фабрику шаблон команды .

В терминахsp - я могу видеть только sp для get_zip_plan_age.

0 голосов
/ 11 июня 2011

Используя логику,

  • Если выбран страховой возраст, отображать только минимальную ставку для женщины для этого возраста. ВЫБОР Верхнего (1) минимального значения для женщины, ГДЕ возраст является указанным ВОЗРАСТОМ
  • Если для страхового возраста выбрано значение ВСЕ, отобразите наименьшую женскую ставку, выбрав верхнюю (1) минимальную женскую ценность, ГДЕ почтовый индекс, код плана соответствует указанным поисковым значениям, а мужская ставка больше 0, сгруппирована поinsur_age, male_value, carrier_name и UNIONed для каждого возраста для каждой из возрастных групп 65, 70, 75, 80

Вот хранимая процедура, которую я использовал для получения наименьшего показателя для женщин:

      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], 
      [insur_age],
      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], [female_value], [carrier_name]

        UNION 
      SELECT TOP(1)           
      [carrier_name], 
      [insur_age],
      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], [female_value], [carrier_name]

UNION 
      SELECT TOP(1)           
      [carrier_name], 
      [insur_age],
      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], [female_value], [carrier_name]

       UNION 
      SELECT TOP(1)           
      [carrier_name], 
      [insur_age],
      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], [female_value], [carrier_name]     

     END
   END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...