论文部分内容阅读
摘要:介绍利用oracle存储过程解决C#.net中组合查询的程序设计.其目的就是为程序开发者提供一种解决组合查询的可行性方法,也为类似数据库和语言编程者开发组合查询控件提出一种思路。
关键词:C#.net;存储过程;组合查询;程序设计
中图分类号:TP309.05文献标识码:A 文章编号:1009-3044(2008)06-10ppp-0c
Use of storage solution the combined Query’s program design in c#
LIU Xin
(Teaching Protection Department of CPAPF,TianJin 300162 China)
Abstracts:This paper introduces the process of oracle storage solution the combined Query’s program designin C #. Net . Its aim was to develop procedures to provide a solution methods for the feasibility, as well as similar databases and programming languages, development query control ideas.
Key words:C#.net;combined query;stored procedure;programmer design
在管理系统的程序设计和应用软件开发过程中,我们常常要遇到客户提出各种各样的查询需求,然而这些查询又往往不是单一的查询,而是组合查询,这种组合查询也绝大多不是固定个数的选项,而是让使用者随意组合的情况。这样我们在编程过程中,往往对这些组合查询十分棘手,特别是在书写SQL语句时很复杂,有时要用很多种条件语句的组合才能达到目的。
鉴于以上原因,本文使用实例将利用oracle存储过程解决C#.net中组合查询的程序设计如下,希望能起到一个抛砖引玉的效果。其程序也可供设计者参考使用。
1 用到的设计语言及关键知识介绍
1.1 语言开发工具
c#.net,本文使用C#语言作为开发工具,C#是结合了C 强大功能和Visual Basic易用性的新语言,它拥有简洁的OO语法和一个庞大的内库(与.NET和其基础类库相结合),是一种现代的,类型安全的,面向对象的编程语言,它使得程序员能够快速而容易的为微软.NET平台开发解决方案。
1.2 数据库:
oracle8i,Oracle 8i是一个面向Internet计算环境的、将Internet特征融入到传统数据库的、面向Web信息管理与发布的数据库系统,它是数据库技术与Web技术的完美结合。
1.3 oracle数据库存储过程:
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
1.4 C#语言调用oracle存储过程:
c#.net调用oracle 数据库的存储过程。
2 软件界面设计
2.1 数据视图表和表各一个(视图ZTC_VIEW_KYB_BENEFIT_BOOK,表ZTC_KYB_BOOK_TEMP,见下图1只部分字段),由于篇幅有限视图的图忽略。
图2 组合查询初始化界面
图3 部分组合查询选择内容示意图
2.3 程序设计说明
如上图3,我们可以随意组合不同的下拉框内容,然后点击“查询”按钮,通过查询按钮的代码运行,将视图ZTC_VIEW_KYB_BENEFIT_BOOK中符合组合条件的记录挑选出来通过执行oracle存贮过程(SP_ZTC_KYB_BOOK_TEMP_STR)将记录插入表ZTC_KYB_BOOK_TEMP中。
3 源程序代码介绍
3.1 “查询”按钮的程序代码:
private void btn_seek_Click(object sender, System.EventArgs e)
{
protected System.TimeSpan diff1;//定义变量检测日期是否符合逻辑
#region判断统计截止日期是否大于或等于统计开始日期
diff1= System.Convert.ToDateTime(txt_enddate.Text.ToString().Trim())
System.Convert.ToDateTime(txt_startdate.Text.ToString().Trim());//执行两个时间相减操作。
if (diff1.TotalSeconds>=0)
{
insert_ztc_book_temp();//开始查询,调用insert_ztc_book_temp()模块开始
}
else
{
Response.Write("<script defer>alert('截止日期小于开始日期!');</script>");
return;//如果截止日期小于开始日期就返回
}
# endregion 判断日期结束
}
#region//以下是insert_ztc_book_temp()模块
private void insert_ztc_book_temp()
{
//执行查询操作
try
{
objConn.Open();//打开数据库
objtrans = objConn.BeginTransaction();//定义事务
OracleCommand objcmd=new OracleCommand();//定义命令
objcmd.Connection=objConn;//建立连接
objcmd.CommandType =CommandType.StoredProcedure ;//命令类型:存储过程
#region//以下为定义变量。
objcmd.Parameters.Add(new OracleParameter("CS1", OracleType.VarChar,64));
objcmd.Parameters.Add(new OracleParameter("DN1", OracleType.VarChar, 128));
objcmd.Parameters.Add(new OracleParameter("WT1", OracleType.VarChar, 16));
objcmd.Parameters.Add(new OracleParameter("TE1", OracleType.VarChar, 16));
objcmd.Parameters.Add(new OracleParameter("EL1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("RI1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("TZ1", OracleType.VarChar, 10));
objcmd.Parameters.Add(new OracleParameter("ST1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("PI1", OracleType.VarChar, 15));
objcmd.Parameters.Add(new OracleParameter("BS1", OracleType.DateTime, 0));
objcmd.Parameters.Add(new OracleParameter("BE1", OracleType.DateTime, 0));
#endregion//定义变量结束。
#region//以下是取组合查询下拉框中的值赋给定义好的变量。
objcmd.Parameters ["CS1"].Value =ddldw.SelectedItem.Text;//单位
objcmd.Parameters ["DN1"].Value =ddlbm.SelectedItem.Text;//部门
objcmd.Parameters ["WT1"].Value =ddlgwlb.SelectedItem.Text;//岗位类别
objcmd.Parameters ["TE1"].Value =ddlzzpm.SelectedItem.Text;//作者排名
objcmd.Parameters ["EL1"].Value =ddlzc.SelectedItem.Text;//职称
objcmd.Parameters ["RI1"].Value =ddlxl.SelectedItem.Text;//学历
objcmd.Parameters ["TZ1"].Value =ddlzgzt.SelectedItem.Text;//在岗状态
objcmd.Parameters ["ST1"].Value =ddljszt.SelectedItem.Text;//晋升状态
objcmd.Parameters ["PI1"].Value =ddlxmlb.SelectedValue.ToString();//项目类别
objcmd.Parameters["BS1"].Value=Convert.ToDateTime(txt_startdate.Text);//开始日期
objcmd.Parameters["BE1"].Value=Convert.ToDateTime(txt_enddate.Text);//结束日期
#endregion//赋值结束
objcmd.CommandText ="SP_ZTC_KYB_BOOK_TEMP_STR";//调用oracle存储过程
objcmd.Transaction =yutrans;//开始事务
int rowcount1=objcmd.ExecuteNonQuery ();//执行操作!
if (rowcount1>=0)
{
objtrans.Commit();//成功后提交事务
if (objConn.State.ToString()=="Open") objConn.Close();//关闭数据库
}
}
catch
{
objtrans.Rollback ();//如果不成功,回滚事物
Response.Write("<script defer>alert('程序有错误,速与程序供应商联系!');</script>");
}
finally
{
if (objConn.State.ToString()=="Open") objConn.Close();//最后关闭数据库
}
}
# endregion 调用insert_ztc_book_temp()模块结束
3.2 oracle中的存储过程代码介绍:
它是组合查询的关键,解决将视图ZTC_VIEW_KYB_BENEFIT_BOOK中符合组合条件的记录挑选出来插入表ZTC_KYB_BOOK_TEMP中,考虑篇幅只出入部分字段。过程名为SP_ZTC_KYB_BOOK_TEMP_STR。
create or replace procedure SP_ZTC_KYB_BOOK_TEMP_STR
(--以下是接受传过来的参数值
CS1 in string,
DN1 in string,
WT1 in string,
TE1 in string,
EL1 in string,
RI1 in string,
TZ1 in string,
ST1 in string,
PI1 in string,
BS1 in date,
BE1 in date
)
as
cursor cur_detail is
SELECT USEIDSN,
PROJ_ID,
FOUND_DATE_YEAR,
SCOR,
SNONLY,
ZTC_VIEW_KYB_BENEFIT_BOOK.SN
FROM ZTC_VIEW_KYB_BENEFIT_BOOK
where
instr(decode(CS1,'---请选择---',NVL(CS,'0'),CS1),NVL(CS,'0'))>0 and
instr(decode(DN1,'---请选择---',NVL(DN,'0'),DN1),NVL(DN,'0'))>0 and
instr(decode(WT1,'---请选择---',NVL(WT,'0'),WT1),NVL(WT,'0'))>0 and
instr(decode(TE1,'---请选择---',NVL(TE,'0'),TE1),NVL(TE,'0'))>0 and
instr(decode(EL1,'---请选择---',NVL(EL,'0'),EL1),NVL(EL,'0'))>0 and
instr(decode(RI1,'---请选择---',NVL(RI,'0'),RI1),NVL(RI,'0'))>0 and
instr(decode(TZ1,'---请选择---',NVL(TZ,'0'),TZ1),NVL(TZ,'0'))>0 and
instr(decode(ST1,'---请选择---',NVL(ST,'0'),ST1),NVL(ST,'0'))>0 and
instr(decode(PI1,'---请选择---',NVL(PI,'0'),PI1),NVL(PI,'0'))>0 and
FOUND_DATE between BS1 and BE1;
begin
delete from ZTC_KYB_BOOK_TEMP;
commit;
for cur_row in cur_detail loop
insert into ZTC_KYB_BOOK_TEMP(
"USEID_SN",
"PROJ_ID",
"FOUND_DATE_YEAR",
"SCORE",
"SNONLY",
"START_DATE",
"END_DATE",
"BENEFIT_BOOK_SN"
)values(
cur_row.USEIDSN,
cur_row.PROJ_ID,
cur_row.FOUND_DATE_YEAR,
cur_row.SCOR,
cur_row.SNONLY,
TO_CHAR(BS1,'yyyy-mm-dd'),
TO_CHAR(BE1,'yyyy-mm-dd'),
cur_row.SN
);
end loop;
commit;
end;
4 结束语
本文介绍了利用存储过程解决组合查询的问题,只是查询中的一种。在平时我们的程序设计过程中还有模糊查询以及对一个字段其内容进行一定范围的查询,这都需要我们编程序解决,在这里就不一一介绍了,利用oracle的存储过程能很好的解决这些问题,并且执行速度很快。
参考文献:
[1]侯晓霞等. C#技术内幕[M]. 清华大学出版社.2002.
[2]台湾恒逸资讯. C#与.net技术平台实战演练[M]. 中国青年出版社,2002.
收稿日期:2008-01-12
作者简介:刘昕,男,山东省泰安人,本科学历,讲师,教保处参谋,研究方向:教学保障。
关键词:C#.net;存储过程;组合查询;程序设计
中图分类号:TP309.05文献标识码:A 文章编号:1009-3044(2008)06-10ppp-0c
Use of storage solution the combined Query’s program design in c#
LIU Xin
(Teaching Protection Department of CPAPF,TianJin 300162 China)
Abstracts:This paper introduces the process of oracle storage solution the combined Query’s program designin C #. Net . Its aim was to develop procedures to provide a solution methods for the feasibility, as well as similar databases and programming languages, development query control ideas.
Key words:C#.net;combined query;stored procedure;programmer design
在管理系统的程序设计和应用软件开发过程中,我们常常要遇到客户提出各种各样的查询需求,然而这些查询又往往不是单一的查询,而是组合查询,这种组合查询也绝大多不是固定个数的选项,而是让使用者随意组合的情况。这样我们在编程过程中,往往对这些组合查询十分棘手,特别是在书写SQL语句时很复杂,有时要用很多种条件语句的组合才能达到目的。
鉴于以上原因,本文使用实例将利用oracle存储过程解决C#.net中组合查询的程序设计如下,希望能起到一个抛砖引玉的效果。其程序也可供设计者参考使用。
1 用到的设计语言及关键知识介绍
1.1 语言开发工具
c#.net,本文使用C#语言作为开发工具,C#是结合了C 强大功能和Visual Basic易用性的新语言,它拥有简洁的OO语法和一个庞大的内库(与.NET和其基础类库相结合),是一种现代的,类型安全的,面向对象的编程语言,它使得程序员能够快速而容易的为微软.NET平台开发解决方案。
1.2 数据库:
oracle8i,Oracle 8i是一个面向Internet计算环境的、将Internet特征融入到传统数据库的、面向Web信息管理与发布的数据库系统,它是数据库技术与Web技术的完美结合。
1.3 oracle数据库存储过程:
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
1.4 C#语言调用oracle存储过程:
c#.net调用oracle 数据库的存储过程。
2 软件界面设计
2.1 数据视图表和表各一个(视图ZTC_VIEW_KYB_BENEFIT_BOOK,表ZTC_KYB_BOOK_TEMP,见下图1只部分字段),由于篇幅有限视图的图忽略。

图2 组合查询初始化界面

图3 部分组合查询选择内容示意图
2.3 程序设计说明
如上图3,我们可以随意组合不同的下拉框内容,然后点击“查询”按钮,通过查询按钮的代码运行,将视图ZTC_VIEW_KYB_BENEFIT_BOOK中符合组合条件的记录挑选出来通过执行oracle存贮过程(SP_ZTC_KYB_BOOK_TEMP_STR)将记录插入表ZTC_KYB_BOOK_TEMP中。
3 源程序代码介绍
3.1 “查询”按钮的程序代码:
private void btn_seek_Click(object sender, System.EventArgs e)
{
protected System.TimeSpan diff1;//定义变量检测日期是否符合逻辑
#region判断统计截止日期是否大于或等于统计开始日期
diff1= System.Convert.ToDateTime(txt_enddate.Text.ToString().Trim())
System.Convert.ToDateTime(txt_startdate.Text.ToString().Trim());//执行两个时间相减操作。
if (diff1.TotalSeconds>=0)
{
insert_ztc_book_temp();//开始查询,调用insert_ztc_book_temp()模块开始
}
else
{
Response.Write("<script defer>alert('截止日期小于开始日期!');</script>");
return;//如果截止日期小于开始日期就返回
}
# endregion 判断日期结束
}
#region//以下是insert_ztc_book_temp()模块
private void insert_ztc_book_temp()
{
//执行查询操作
try
{
objConn.Open();//打开数据库
objtrans = objConn.BeginTransaction();//定义事务
OracleCommand objcmd=new OracleCommand();//定义命令
objcmd.Connection=objConn;//建立连接
objcmd.CommandType =CommandType.StoredProcedure ;//命令类型:存储过程
#region//以下为定义变量。
objcmd.Parameters.Add(new OracleParameter("CS1", OracleType.VarChar,64));
objcmd.Parameters.Add(new OracleParameter("DN1", OracleType.VarChar, 128));
objcmd.Parameters.Add(new OracleParameter("WT1", OracleType.VarChar, 16));
objcmd.Parameters.Add(new OracleParameter("TE1", OracleType.VarChar, 16));
objcmd.Parameters.Add(new OracleParameter("EL1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("RI1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("TZ1", OracleType.VarChar, 10));
objcmd.Parameters.Add(new OracleParameter("ST1", OracleType.VarChar, 20));
objcmd.Parameters.Add(new OracleParameter("PI1", OracleType.VarChar, 15));
objcmd.Parameters.Add(new OracleParameter("BS1", OracleType.DateTime, 0));
objcmd.Parameters.Add(new OracleParameter("BE1", OracleType.DateTime, 0));
#endregion//定义变量结束。
#region//以下是取组合查询下拉框中的值赋给定义好的变量。
objcmd.Parameters ["CS1"].Value =ddldw.SelectedItem.Text;//单位
objcmd.Parameters ["DN1"].Value =ddlbm.SelectedItem.Text;//部门
objcmd.Parameters ["WT1"].Value =ddlgwlb.SelectedItem.Text;//岗位类别
objcmd.Parameters ["TE1"].Value =ddlzzpm.SelectedItem.Text;//作者排名
objcmd.Parameters ["EL1"].Value =ddlzc.SelectedItem.Text;//职称
objcmd.Parameters ["RI1"].Value =ddlxl.SelectedItem.Text;//学历
objcmd.Parameters ["TZ1"].Value =ddlzgzt.SelectedItem.Text;//在岗状态
objcmd.Parameters ["ST1"].Value =ddljszt.SelectedItem.Text;//晋升状态
objcmd.Parameters ["PI1"].Value =ddlxmlb.SelectedValue.ToString();//项目类别
objcmd.Parameters["BS1"].Value=Convert.ToDateTime(txt_startdate.Text);//开始日期
objcmd.Parameters["BE1"].Value=Convert.ToDateTime(txt_enddate.Text);//结束日期
#endregion//赋值结束
objcmd.CommandText ="SP_ZTC_KYB_BOOK_TEMP_STR";//调用oracle存储过程
objcmd.Transaction =yutrans;//开始事务
int rowcount1=objcmd.ExecuteNonQuery ();//执行操作!
if (rowcount1>=0)
{
objtrans.Commit();//成功后提交事务
if (objConn.State.ToString()=="Open") objConn.Close();//关闭数据库
}
}
catch
{
objtrans.Rollback ();//如果不成功,回滚事物
Response.Write("<script defer>alert('程序有错误,速与程序供应商联系!');</script>");
}
finally
{
if (objConn.State.ToString()=="Open") objConn.Close();//最后关闭数据库
}
}
# endregion 调用insert_ztc_book_temp()模块结束
3.2 oracle中的存储过程代码介绍:
它是组合查询的关键,解决将视图ZTC_VIEW_KYB_BENEFIT_BOOK中符合组合条件的记录挑选出来插入表ZTC_KYB_BOOK_TEMP中,考虑篇幅只出入部分字段。过程名为SP_ZTC_KYB_BOOK_TEMP_STR。
create or replace procedure SP_ZTC_KYB_BOOK_TEMP_STR
(--以下是接受传过来的参数值
CS1 in string,
DN1 in string,
WT1 in string,
TE1 in string,
EL1 in string,
RI1 in string,
TZ1 in string,
ST1 in string,
PI1 in string,
BS1 in date,
BE1 in date
)
as
cursor cur_detail is
SELECT USEIDSN,
PROJ_ID,
FOUND_DATE_YEAR,
SCOR,
SNONLY,
ZTC_VIEW_KYB_BENEFIT_BOOK.SN
FROM ZTC_VIEW_KYB_BENEFIT_BOOK
where
instr(decode(CS1,'---请选择---',NVL(CS,'0'),CS1),NVL(CS,'0'))>0 and
instr(decode(DN1,'---请选择---',NVL(DN,'0'),DN1),NVL(DN,'0'))>0 and
instr(decode(WT1,'---请选择---',NVL(WT,'0'),WT1),NVL(WT,'0'))>0 and
instr(decode(TE1,'---请选择---',NVL(TE,'0'),TE1),NVL(TE,'0'))>0 and
instr(decode(EL1,'---请选择---',NVL(EL,'0'),EL1),NVL(EL,'0'))>0 and
instr(decode(RI1,'---请选择---',NVL(RI,'0'),RI1),NVL(RI,'0'))>0 and
instr(decode(TZ1,'---请选择---',NVL(TZ,'0'),TZ1),NVL(TZ,'0'))>0 and
instr(decode(ST1,'---请选择---',NVL(ST,'0'),ST1),NVL(ST,'0'))>0 and
instr(decode(PI1,'---请选择---',NVL(PI,'0'),PI1),NVL(PI,'0'))>0 and
FOUND_DATE between BS1 and BE1;
begin
delete from ZTC_KYB_BOOK_TEMP;
commit;
for cur_row in cur_detail loop
insert into ZTC_KYB_BOOK_TEMP(
"USEID_SN",
"PROJ_ID",
"FOUND_DATE_YEAR",
"SCORE",
"SNONLY",
"START_DATE",
"END_DATE",
"BENEFIT_BOOK_SN"
)values(
cur_row.USEIDSN,
cur_row.PROJ_ID,
cur_row.FOUND_DATE_YEAR,
cur_row.SCOR,
cur_row.SNONLY,
TO_CHAR(BS1,'yyyy-mm-dd'),
TO_CHAR(BE1,'yyyy-mm-dd'),
cur_row.SN
);
end loop;
commit;
end;
4 结束语
本文介绍了利用存储过程解决组合查询的问题,只是查询中的一种。在平时我们的程序设计过程中还有模糊查询以及对一个字段其内容进行一定范围的查询,这都需要我们编程序解决,在这里就不一一介绍了,利用oracle的存储过程能很好的解决这些问题,并且执行速度很快。
参考文献:
[1]侯晓霞等. C#技术内幕[M]. 清华大学出版社.2002.
[2]台湾恒逸资讯. C#与.net技术平台实战演练[M]. 中国青年出版社,2002.
收稿日期:2008-01-12
作者简介:刘昕,男,山东省泰安人,本科学历,讲师,教保处参谋,研究方向:教学保障。