SqlHelper详解w88优德官网电脑版

发布时间:2019-04-03  栏目:w88优德官网电脑版  评论:0 Comments

SqlHelper 类落成详细新闻
SqlHelper 类用于通过壹组静态方法来封装数据访问成效。该类无法被持续或实例化,因而将其宣称为涵盖专用构造函数的不可继承类。 

在 SqlHelper 类中落到实处的每一种艺术都提供了壹组同样的重载。那提供了1种很好的接纳 SqlHelper 类来执行命令的格局,同时为开发人士选取访问数据的艺术提供了须求的灵活性。每个格局的重载都支持不相同的不二法门参数,由此开发人士能够分明传递连接、事务和参数音信的方法。在 SqlHelper 类中落实的方法包罗: 

ExecuteNonQuery。此办法用于实施不回来任何行或值的下令。那一个命令平时用于执行数据库更新,但也可用来再次回到存款和储蓄进度的输出参数。 
ExecuteReader。此情势用于再次回到 SqlDataReader 对象,该对象涵盖由某一命令归来的结果集。 
ExecuteDataset。此方法再次回到 DataSet 对象,该指标涵盖由某一下令归来的结果集。 
ExecuteScalar。此方法重临多少个值。该值始终是该命令归来的首先行的首先列。 
ExecuteXmlReader。此方法再次来到 FO奥迪Q5 XML 查询的 XML 片段。 
除了那个之外那么些集体措施外,SqlHelper 类还隐含部分专用函数,用于管理参数和准备要实践的一声令下。不管客户端调用哪些的法子达成,全数命令都经过 SqlCommand 对象来施行。在 SqlCommand 对象能够被实践此前,全体参数都必须添加到 Parameters 集合中,并且必须科学安装 Connection、CommandType、CommandText 和 Transaction 属性。SqlHelper 类中的专用函数首要用来提供1种同等的章程,以便向 SQL Server 数据库发出指令,而不牵挂客户端应用程序调用的重载方法实现。SqlHelper 类中的专用实用程序函数包蕴: 

AttachParameters:该函数用于将具有供给的 SqlParameter 对象连接受正在周转的 SqlCommand。 
AssignParameterValues:该函数用于为 SqlParameter 对象赋值。 
PrepareCommand:该函数用于对命令的习性(如延续、事务环境等)进行早先化。 
ExecuteReader:此专用 ExecuteReader 实现用于通过适当的 CommandBehavior 打开 SqlData里德r 对象,以便最管用地保管与阅读器关联的连日的有效期。 

SqlHelper体验谈:

以下载自己组建长CIO(MVP/CSDN_WEB开发版主)的Blog:

微软提供的Data Access Application Block中的SQLHelper类中封装了最常用的多寡操作,各种使用者调用他而写的代码也有一点都不小分化。

对此一个回到DataSet的章程本人本来是那样写的:

public DataSet GetDepartmentMemberList(int departmentID)
…{
try
…{
string sql = “OA_Department_GetDepartment_Members”;
string conn = ConfigurationSettings.AppSettings[“strConnection”];
SqlParameter[] p = 
…{
SqlHelper.MakeInParam(“@departmentID”,SqlDbType.Int,4,departmentID)
};
DataSet ds = SqlHelper.ExecuteDataset(conn,CommandType.StoredProcedure,sql,p);
return ds;
}
catch(System.Data.SqlClient.SqlException er)
…{
throw new Exception(er.Message);
}
}

现行反革命本身是那般来写的:

//连接字符串
private string _connectionString = ConfigurationSettings.AppSettings[“strConnection”];
public string ConnectionString
…{
get …{return this._connectionString;}
set …{this._connectionString = value;}
}

public DataSet GetNewsToIndexPage(int NewsTypeID)
…{
return GetDataSet(“yzb_GetNewsToIndexPage”,GetNewsToIndexPage_Parameters(NewsTypeID));
}

//设置存储进度参数
private SqlParameter[] GetNewsToIndexPage_Parameters(int NewsTypeID)
…{

SqlParameter[] p = 
…{
SqlHelper.MakeInParam(“@NewsTypeID”,SqlDbType.Int,4,NewsTypeID)
};
return p;
}

//那里才真正调用SqlHelper
private DataSet GetDataSet(string sql, params SqlParameter[] p)
…{
return SqlHelper.ExecuteDataset(ConnectionString,CommandType.StoredProcedure,sql,p);
}
代码尤其灵活,特别安全了:P

做为五个懒人,大笨狼笔者时时那样写:

System.Data.DataTable dt=SqlHelper.ExecuteDataset(SqlHelper.CONN_STRING_NON_DTC,CommandType.Text,sql).Tables[0]; 

直接重返DataTable, 重返表集合基本不用,只回去二个table用于绑定。 

string conn = ConfigurationSettings.AppSettings[“strConnection”]; 
我写在SqlHelper.CONN_STRING_NON_DTC里面 

MakeInParam代码烦琐,要是查询输入条件不或许有结合SQL, 
我直接exec pronamr paraargs 

假若查询输入条件存在安全题材,恐怕带回来参数 
再用SqlParameter[] queryParam=new SqlParameter[] …{ 
new SqlParameter(“@UserID”,SqlDbType.Int) 
}; 
queryParam[0].Value=this.UserID; 

构成sql语句用到@和string.Format技巧.例如:
sql=@”UPDATE Test_User_Statistic
SET 
Test_User_Statistic.[IsQualified]={0}, 
Test_User_Statistic.[Reason]='{1}’
WHERE UserID={2}” ;
sql= string.Format(sql,IsQualified,Reason,userID);
SqlHelper.ExecuteNonQuery(SqlHelper.CONN_STRING_NON_DTC,CommandType.Text,sql);

内部sql语句能够借助SQL的查询分析器生成。
那般干要保险安全,假诺有输入漏洞,提议依旧用SqlParameter[]缓存参数,因为它会把攻击性的代码,比如带单引号分号的,当作普通字符处理。
 
superdullwolf(一流大笨狼,每日要逆来顺受) 于 2005-陆-一伍 四:52:13 

SqlHelper能够回滚事务,不过作者以为事情照旧存款和储蓄进程自个儿来消除比较好:
DBTransaction = CS.BeginTransaction();
SqlHelper.ExecuteNonQuery(DBTransaction, CommandType.StoredProcedure, “pro_T_Accredit_Create”, arParams);

p_intOutPut = Convert.ToInt32(arParams[3].Value.ToString());

if(p_intOutPut < 0)
…{
DBTransaction.Rollback(); //–回退事务
}

此外附采纳存款和储蓄进度回滚

CREATE PROCEDURE 。。。
@idint
。。。。
as
declare 。。。
begin transaction
insert 。。。
delete 。。。
if @@error <> 0 rollback transaction
commit transaction
GO

比较ASP回滚:
标题 在ASP中运用工作控制 julyclyde(原来的文章) 

关键字 ASP,事务,COM+ 

作者系七月份微软社区之星Microsoft China Community Star

在编制程序中,经常须求选拔工作。所谓事务,便是一多如牛毛必须都事业有成的操作,只要有一步操作退步,全数其余的步子也不能够不撤回。比如用ASP开发七个网络硬盘系统,其用户注册部分要做的事有:

将用户新闻记入数据库 
为用户开个文件夹用于存款和储蓄 
开端化用户操作日志

那三步必须选用工作,不然一经磁盘操作败北,而未有收回数据库操作,就会导致只可以登陆而不能够操作的”死用户”现象。
由于数据库系统尤其的前进历史,小至Access,大到DB贰,无不带有事务援助。由此上述手续能够如下表示:
On Error Resume Next
第一步:
在工作环境下把用户新闻记入数据库
If Err Then
关门连接
退出
Else
第1步:成立文件夹
If Err Then
回滚第1步数据库操作,退出
Else
其三步:在工作环境下操作日志数据库
If Err Then
回滚第3步操作,删除第一步建立的文件夹
退出
End If
End If
End If
付出第2步数据库操作的事务
提交第一步数据库操作的事体
End

每一步都须求开始展览判断,假若退步,还亟需手工业回滚前面多步操作,使程序变得复杂、难懂。假诺之后翻新了先后,扩充其它步骤,还亟需嵌套更加多层的If…Else…End If,使程序流程更加复杂。

科学的化解办法是选用ASP的政工控制机能。IIS通过和MTS服务挂钩,能够控制两种支持理工科程师作的连串,当程序发出”失败”的时域信号时,全体帮衬理工程师作的系统均将活动回滚,固然操作已经正式实现;对不匡助理工科程师作的操作也提供了有利的手工业回滚情势。上边的事例用ASP事务控制功用重写如下:

<%@ TRANSACTION = Required %>
On Error Resume Next

Set Conn=Server.CreateObject(“ADODB.Connection”)
Conn.Open ….
Conn.Execute “INSERT….”
Conn.Close
Set Conn=Nothing

Set Conn2=Server.CreateObject(“ADODB.Connection”)
Conn2.Open ….
Conn2.Execute “INSERT….”
Conn2.Close
Set Conn2=Nothing

Set FSO=Server.CreateObject(“Scripting.FilesystemObject”)
FSO.CreateFolder “….”

If Err Then
ObjectContext.SetAbort ‘布告全数扶助理工科程师作的组件回滚,并启入手工业回滚代码
Else
ObjectContext.SetComplete
End If
Set FSO=Nothing

Sub OnTransactionAbort
Response.Write “错误”
FSO.DeleteFile Server.Mappath(“a.txt”) ‘FSO的手工业回滚——删除文件夹
End Sub
Sub OnTransactionCommit
Response.Write “胜利完成职务”
End Sub
%>

第2行的<%@ TRANSACTION = Required %>表示那1页ASP文件需求MTS的业务帮忙。中间的逐一操作都按一般顺序书写,而并非思量回滚难点。在先后最终判断是还是不是有错误。假若有,调用ObjectContext的SetAbort方法,IIS会通过MTS服务文告全数支持理工科程师作的机件回滚(首借使数据库),并且运营Sub OnTransactionAbort对不扶助理工科程师作的操作手工业回滚;假设未有发出错误,调用ObjectContext的SetComplete方法,则会运作Sub OnTransactionCommit来体现成功的音讯。
全方位ASP程序不要求为判断错误和回滚操作书写多余的代码,只须在结尾举行判断,就算之后增多了多步操作,也只需求在Sub OnTransactionAbort中进行支配即可,分外有利,程序员可以小心于经过编写而不是书写纠错代码。
实际ASP还提供了过多更有效的职能,等着大家运用,千万不要以为ASP使用脚本语言,功效就必定弱。

比较ADO回滚:
<% 
‘Asp中采纳事务 
Set conn=Server.CreateObject(“ADODB.Connection”) 
conn.Open “course_dsn”,”course_user”,”course_password” 
conn.begintrans ‘开首作业 

sql=”delete from user_info” 
set rs=server.createobject(“adodb.recordset”) 
rs.open sql,conn,3,3 
if conn.errors.count>0 then ‘有荒唐产生 
conn.rollbacktrans ‘回滚 
set rs=nothing 
conn.close 
set conn=nothing 
response.write “交易退步,回滚至修改前的景况!” 
response.end 
else 
conn.committrans ‘提交事务 
set rs=nothing 
conn.close 
set conn=nothing 
response.write “交易成功!” 
response.end 
end if 
%> 

SqlHelper最开头产出就像是在Microsoft PetShop 作为DAL层的基本。

除此以外关于SqlDataReader,我倍感那么些事物和ADO里面包车型地铁RecordSet类似,就是要求Close.
若果做为参数和再次回到值传递是比较危急的,因为你要传出去就Close(),而毕竟在哪儿关闭不难被未来和忽略,所以自身认为照旧用强类型的DataSet做为参数和重返值传递纪录集相比好。

传说上面包车型地铁写法不用Close也会活动财富回收,不通晓真的假的:

using(SqlDataReader reader=SqlHelper.ExecuteReader(SqlHelper.CONN_STRING_w88优德官网电脑版,NON_DTC,CommandType.Text,sql))
…{
if(reader.Read())
…{
arr[0]=reader.GetString(1);
。。。。}

w88优德官网电脑版 1

Feedback

#1楼 w88优德官网电脑版 2w88优德官网电脑版 3   回复  引用    

二零零六-0五-2八 11:二③ by 风中之羽 [未注册用户]

很强烈是一点儿也不动Copy过来的

留下评论