问题描述
|
背景:我正在转换访问运行时间,该运行时间将按邮政编码,计划类型和年龄搜索计划。
到目前为止,我已经进行了主搜索,正确显示了存储过程
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