SQL存储进程在.NET数据库中的利用
核心提示:SQL存储进程在.NET数据库中的利用,浏览SQL存储进程在.NET数据库中的利用,1.前言:存储进程(StoredProcedure)是1组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储进程的名字并给出参数(假设该存储进程带有参数)来履行它。存储进程是数据
1.前言:
存储进程(StoredProcedure)是1组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储进程的名字并给出参数(假设该存储进程带有参数)来履行它。存储进程是数据库中的1个重要对象,任何1个设计良好的数据库利用程序都应当用到存储进程。总的来讲,存储进程具有以下1些优点:
◆存储进程答应标准组件式编程
◆存储进程能够实现较快的履行速度
◆存储进程能够减少网络流量
◆存储进程可被作为1种安全机制来充分利用
本文作者将向大家先容.NET数据库利用程序中存储进程的利用,和如何将它与ADO.NET中的SqlDataAdapter对象、DataSet对象等结合使用以进步.NET数据库利用程序的整体性能。
2.系统要求:
开发工具:VisualStudio.NET
数据库治理系统:SQLServer2000(其中包括了示例程序所用到的Pubs数据库)
3.创建1个简单的存储进程:
这里我将向大家先容如何应用VisualStudio.NETIDE来创建存储进程。应用VisualStudio.NETIDE创建存储进程是非常轻易和直观的,你只要在服务器资源治理器中导向到Pubs数据库并展开节点,就会发现包括存储进程在内的各种数据库对象,如图1所示。
在存储进程节点上点击右键即可弹出1个菜单,其中包括了“新建存储进程”的命令。新建1个存储进程后,IDE中的代码编辑窗口便出现以下所示的代码模板:
CREATEPROCEDUREdbo.StoredProcedure1
/*
(
@parameter1datatype=defaultvalue,
@parameter2datatypeOUTPUT)
*/
AS
/*SETNOCOUNTON*/
RETURN
上面的代码模板符合简化的创建存储进程的语法规则,完全的语法规则以下:
CREATEPROC[EDURE]procedure_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]
][,...n]
[WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FORREPLICATION]
ASsql_statement[...n]
限于篇幅,各个参数的含义在此就未几作先容了,有爱好的读者可以参考有关SQLServer2000数据库治理系统的资料。
下面我对该代码模板中的各个语法成份略作先容。CREATEPROCEDURE声明创建1个存储进程,后面随着该存储进程的名称。“/*……*/”中的成份是该存储进程的参数,可包括输进参数和输出参数。AS关键字后面的内容是该存储进程的主体部份,其中是任何数目和类型的包括在存储进程中的SQL语句。RETURN关键字表明存储进程结束并能返回整型状态值给调用者。下面我们就来创建1个简单的不带参数的存储进程并应用之:
CREATEPROCEDUREdbo.up_GetPublisherInfo
AS
SELECTpub_id,pub_name,city,state,country
FROMpublishers
RETURN
创建以上存储进程后,保存之。保存终了,与该存储进程相对应的节点就会出现在服务器资源治理器中。同时请留意代码编辑窗口中的CREATE关键字变成ALTER关键字了,该关键字是用于更改任何现有的存储进程的。要运行上述存储进程,只要点击其节点并在右键弹出菜单当选择“运行存储进程”。
1 2 3 4 下1页
核心提示:SQL存储进程在.NET数据库中的利用,浏览SQL存储进程在.NET数据库中的利用,1.前言:存储进程(StoredProcedure)是1组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储进程的名字并给出参数(假设该存储进程带有参数)来履行它。存储进程是数据
4.创建1个带参数的存储进程:
以上我们创建了1个简单的不带参数的存储进程,而在实际的利用中常常会用到很多带有参数的存储进程。带有参数的存储进程1般是用于更新数据或是插进数据的。下面我们可以应用一样的操纵方法创建1个带参数的存储进程:
CREATEPROCEDUREdbo.up_UpdatePublisherInfo
(
@pub_idchar(4),
@pub_namevarchar(40),
@cityvarchar(20),
@statechar(2),
@countryvarchar(30)
)
AS
UPDATEpublishers
SETpub_name=@pub_name,city=@city,state=@state,
country=@country
WHERE(pub_id=@pub_id)
RETURN
在上面的创建存储进程的代码中,我们通过在名称前添加1个“@”标志来声明存储进程的局部变量-参数,同时还声明了各个参数的类型,肯定了各个参数的方向值,也即表明该参数是输进型的还是输出型的或是输进输出型的或是返回值型的。用户通过相应的存储进程名称和正确有效的参数即可调用该存储进程了。还有,你可以通过应用OUTPUT关键字在参数中添加输出型的参数,具体方法请参考上面的语法规则。输出型的参数能返回给调用者相干的信息。
上面的存储进程能更新publishers表中相应出版商的信息。你可以通过点击该存储进程的节点,在右键弹出菜单当选择“运行存储进程”来履行它。1旦履行,IDE中便弹出1个输进出版商信息的对话框(如图3所示)。在该对话框中填进正确有效的更新信息,留意pub_id的值在原来的表中必须存在,然后点击“肯定”按钮即可更新数据了。
上1页 1 2 3 4 下1页
核心提示:SQL存储进程在.NET数据库中的利用,浏览SQL存储进程在.NET数据库中的利用,1.前言:存储进程(StoredProcedure)是1组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储进程的名字并给出参数(假设该存储进程带有参数)来履行它。存储进程是数据
5.创建简单存储进程的数据库利用程序:
下面我们就应用上述的不带参数的存储进程来1个数据库利用程序,其中还用到了ADO.NET中的SqlDataAdapter对象和DataSet对象。其中的SqlDataAdapter对象作为SQLServer数据库和DataSet对象的桥梁将二者联系在1起。SqlDataAdapter对象包括了两个常常使用的方法:Fill()方法和Update()方法。其中的Fill()方法能从数据库中获得相应数据并填充到DataSet对象中,而Update()方法顾名思义就是更新数据集的意思了。在调用Fill()方法之前,我们必须设置好SqlDataAdapter对象的SelectCommand属性,该属性实在是1个SqlCommand对象。SelectCommand属性中包括有效的SQL语句,并能据此从数据库中获得相应数据并填充到DataSet对象中。
首先,我们创建1个WindowsForms利用程序,编程语言为C#。在VisualStudio.NET中创建1个新的项目后,给该项目添加1个新的类-Publishers类,该类封装了连接到后台数据库并获得数据集对象的业务逻辑。步骤以下:
1.添加必要的命名空间援用:usingSystem.Data.SqlClient;
2.给该类添加以下1些必要的变量:
privateSqlConnectioncnPubs;
privateSqlCommandcmdPubs;
privateSqlDataAdapterdaPubs;
privateDataSetdsPubs;
3.在该类的构造函数中完成连接后台数据库,获得SqlDataAdapter对象等业务逻辑:
publicPublishers()
{
try
{
//创建1个数据库连接对象
cnPubs=newSqlConnection("server=localhost;integratedsecurity=true;database=pubs");
//创建1个SqlCommand对象,并指明其命令类型为存储进程
cmdPubs=newSqlCommand();
cmdPubs.Connection=cnPubs;
cmdPubs.CommandType=CommandType.StoredProcedure;
cmdPubs.CommandText="up_GetPublisherInfo";
//创建1个SqlDataAdapter对象,设定其SelectCommand属性为上面的SqlCommand对象
daPubs=newSqlDataAdapter();
daPubs.SelectCommand=cmdPubs;
//创建1个DataSet对象
dsPubs=newDataSet();
}
catch(Exception){}
}
4.最后为该类提供1个GetPublisherInfo()方法,该方法用SqlDataAdapter对象填充DataSet对象并返回填充后的DataSet对象,方法以下(值得留意的是:SqlDataAdapter对象会隐式地打开数据库连接并在获得数据后隐式地封闭连接,这就是说DataSet对象是工作在非连接模式下的。而当你显式地打开数据库连接并获得数据后,SqlDataAdapter对象其实不会将该连接封闭):
publicDataSetGetPublisherInfo()
{
//调用SqlDataAdapter对象的Fill()方法并返回数据集对象
daPubs.Fill(dsPubs);
returndsPubs;
}
完成Publishers类的设计后,我们给主窗体添加1个DataGrid控件并用它来显示DataSet对象中的数据。首先给主窗体类添加以下成员变量:
privatePublisherspubs;
privateDataSetds;
以后,修改主窗体类的构造函数以下:
publicForm1()
{
//
//Windows窗体设计器支持所必须的
//
InitializeComponent();
//
//TODO:在InitializeComponent调用后添加任何构造函数代码
//pubs=newPublishers();
ds=pubs.GetPublisherInfo();
dataGrid1.DataSource=ds.Tables[0];
}
这样该利用程序1启动主窗体的DataGrid控件中便显示了应用上述不带参数的存储进程从Pubs数据库中获得的相应数据。
上1页 1 2 3 4 下1页
核心提示:SQL存储进程在.NET数据库中的利用,浏览SQL存储进程在.NET数据库中的利用,1.前言:存储进程(StoredProcedure)是1组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储进程的名字并给出参数(假设该存储进程带有参数)来履行它。存储进程是数据
6.创建带参数的存储进程的数据库利用程序:
上面我们创建了1个不带参数的存储进程的利用程序,下面我们就来创建1个更加复杂的数据库利用程序。在实际的数据库利用中,我们常常需要获得数据并更新、插进或删除数据,这时候我们就需要用到带有参数的存储进程了,同时在应用SqlDataAdapter对象时,我们会调用它的Update()方法。该Update()方法会自动根据DataSet对象中的DataTable对象内各条记录的变化情况完成相应操纵。SqlDataAdapter对象还包括了UpdateCommand、InsertCommand、DeleteCommand等属性,这些属性实在都是SqlCommand对象。Update()方法会根据操纵的类型选用相应的属性。
在应用带有参数的存储进程建立数据库利用程序时,我们1般都要用到SqlParameter类,该类封装了各种与Sql参数相干的属性和方法。其中的属性包括了ParameterName,SqlDBType,Direction,Size,Value,SourceColumn和SourceVersion等。其中ParameterName,SqlDBType,Direction,Size等属性是用于匹配存储进程中定义的参数的。比以下面定义的SqlParameter对象就是用来匹配前面定义的up_UpdatePublisherInfo存储进程中的
SqlParameterupdParam=newSqlParameter("@pub_id",SqlDbType.Char,4);
在上面的定义中,固然Direction属性没有明确地给出,但是它的默许值为Input,所以也就满足了我们的需要。而假设1个SqlParameter对象的Direction属性为InputOutput或Output或ReturnValue,那末其Direction属性就必须明确地说明了,比以下面的代码就明确地声明了1个SqlParameter对象的Direction属性为Output。
oParam.Direction=ParameterDirection.Output;
其中的SourceColumn属性是用于匹配1个DataTable对象中的DataColumn对象的,这类匹配能在调用Update()方法更新DataTable对象时隐式地导进所需的SqlParameter对象。假设在定义时没有声明该属性,那末你必须在代码中显式地说明SqlParameter对象的SourceColumn属性。
其中的SourceVersion属性的默许值是DataRow对象相应字段中确当前值,也就是要更新到数据库中的值。固然,SourceVersion属性也能够指向DataRow对象相应字段中的原始值,也即从数据库中获得的初始值。在数据库事务处理系统中,数据的同步性题目非常重要,下面我们来建立1个能检测数据同步性的存储进程。
CREATEPROCEDUREdbo.up_UpdatePublisherName
(
@pub_idchar(4),
@pub_namevarchar(40),
@Original_pub_namevarchar(40)
)
AS
ifexists(selectpub_id
frompublishers
where(pub_id=@pub_id)AND(pub_name=@Original_pub_name))
Begin
UPDATEpublishersSETpub_name=@pub_name
WHERE(pub_id=@pub_id)
End
RETURN
接着,我们在上面的利用程序中调用该存储进程以更新发行商的名称。首先,在原有益用程序的基础上完善其业务逻辑类-Publishers类:
1.添加1个新的SqlCommand对象,该对象能作为SqlDataAdapter对象的UpdateCommand属性被使用:
privateSqlCommandcmdUpdPubs;
2.更新该类的构造函数Publishers()函数,添加以下内容:
//创建另1个SqlCommand对象,该对象援用更新发行商名称的存储进程
cmdUpdPubs=newSqlCommand();
cmdUpdPubs.Connection=cnPubs;
cmdUpdPubs.CommandType=CommandType.StoredProcedure;
cmdUpdPubs.CommandText="up_UpdatePublisherName";
//为上面的SqlCommand对象添加必要的参数
cmdUpdPubs.Parameters.Add("@pub_id",SqlDbType.Char,4,"pub_id");
cmdUpdPubs.Parameters.Add("@pub_name",SqlDbType.VarChar,40,"pub_name");
SqlParameterupdParam=newSqlParameter
("@Original_pub_name",SqlDbType.VarChar,40,"pub_name");
updParam.SourceVersion=DataRowVersion.Original;
cmdUpdPubs.Parameters.Add(updParam);
3.指定SqlDataAdapter对象的UpdateCommand属性为上面定义的SqlCommand对象:
daPubs.UpdateCommand=cmdUpdPubs;
4.添加方法UpdatePublisherName():
publicvoidUpdatePublisherName(DataSetdsChanges)
{
//更新所有改动
daPubs.Update(dsChanges);
}
利用程序的业务逻辑类完善以后,在主窗体上添加1个名为“更新数据集”的按钮,并添加该按钮的事件响应函数以下:
privatevoidbutton1_Click(objectsender,System.EventArgse){if(ds.HasChanges()){pubs.UpdatePublisherName(ds.GetChanges());ds.Clear();ds=pubs.GetPublisherInfo();}}
到此为止,利用程序的业务逻辑类和主窗体类都已更新终了,现在的利用程序能根据用户的改用更新数据库中的相干内容了。
7.总结:
本文向大家先容了存储进程的基本知识和在.NET数据库利用程序中如何结合SqlDataAdapter对象、DataSet对象等构建数据驱动的利用程序。在本文中,我们应用到了两类存储进程:1类为简单的不带参数的存储进程,其应用方法相对轻易;另1类为带有参数的存储进程,在调用该类存储进程时还得应用到SqlParameter对象。同时,我们不难发现将数据更新业务逻辑封装在存储进程中是1种很好的设计方法,它能进步利用程序的可治理性、可扩大性和数据库的安全性。类似的,插进数据和删除数据的业务逻辑也能够封装在存储进程中并以类似的方法在利用程序中被应用。最后,希看本文对大家有很多帮助。
上1页 1 2 3 4 http://www.fw8.net/TAG:数据,进程,参数,属性,对象
评论加载中...
|