目标: 对存储过程的参数进行封装,达到方便操作、更换数据库不需要改代码的目的。
特点: 1、 调用方便 2、 没有数据库特征。
正文: 现在参数化SQL语句越来越常用了,这就涉及到如何写存储过程的参数的问题。您也许会问,这有啥的直接写不就可以了么?就像下面这段代码。
string sql = "insert into OS_User_Info values(@UserID,@PersonID,@NikeName,@ProvinceID,@CityID,@CountyID,@Introductions,@RegisterDate)";
SqlParameter paramUserID = new SqlParameter("@UserID", SqlDbType.Int);
paramUserID.Value = osuser.UserID;
SqlParameter paramPersonID = new SqlParameter("@PersonID", SqlDbType.Int);
paramPersonID.Value = osuser.PersonID;
SqlParameter paramNikeName = new SqlParameter("@NikeName", SqlDbType.NVarChar);
paramNikeName.Value = osuser.NikeName;
SqlParameter paramProvinceID = new SqlParameter("@ProvinceID", SqlDbType.Int);
paramProvinceID.Value = osuser.ProvinceID;
SqlParameter paramCityID = new SqlParameter("@CityID", SqlDbType.Int);
paramCityID.Value = osuser.CityID;
SqlParameter paramCountyID = new SqlParameter("@CountyID", SqlDbType.Int);
paramCountyID.Value = osuser.CountyID;
SqlParameter paramIntroductions = new SqlParameter("@Introductions", SqlDbType.NText);
paramIntroductions.Value = osuser.Introductions;
SqlParameter paramRegisterDate = new SqlParameter("@RegisterDate", SqlDbType.DateTime);
paramRegisterDate.Value = osuser.RegisterDate;
int row = Sql_Helper.ExecuteSql(sql, paramUserID, paramPersonID, paramNikeName,
paramProvinceID, paramCityID, paramCountyID,
paramIntroductions, paramRegisterDate);
if (row == 0)
return false;
int id = SelectNewID("OS_User_Info");
osuser.OSUserID = id;
我们来看看这样的代码。首先代码不够简洁,不够易读。其次,如果更换其他类型的数据库,那么就需要修改这段代码。 你可能会说,这算啥呀,反正代码生成器生成完了,我也就再也不看了,是否易读有什么关系?换数据库了,再重新生成一遍代码不就OK了?
这样似乎也行,我也想不出来什么反驳的理由。只是我不喜欢这种方式,呵呵。所以我对存储过程的参数进行了一下封装。看下面的这段代码,是不是简洁了许多?
ManagerParameter parm = da.ManagerParameter;
parm.ClearParameter();
parm.AddNewInParameter("personName", person.PersonName, 50);
parm.AddNewInParameter("gender", person.Gender,1);
parm.AddNewInParameter("birthday", person.Birthday);
parm.AddNewInParameter("idCard", person.IDCard,19);
parm.AddNewInParameter("addedDate", person.AddedDate);
parm.AddNewInParameter("UpdatedDate", person.UpdateDate);
parm.AddNewInParameter("addedPersonID", person.AddedPersonID);
parm.AddNewInParameter("updatedPersonID", person.UpdatedPersonID);
//添加数据
string newID = da.ModifyData.InsertData("Person_Info");
person.PersonID = int.Parse(newID);
调用很简单,首先清除以前的参数,然后添加新的参数,最后在调用数据访问的扩展部分来实现数据的添加、修改。也可以实现删除和查询的功能。
1、不需要指定类型,定义和赋值和在一行。
添加存储过程的参数,采用参数重载的方式。分成两种情况,一个是需要指定长度的参数,比如nvarchar等;另一个是不需要指定长度的参数,比如int 、ntext等。然后在函数内部判断参数类型,根据类型和数据库字段的类型进行匹配来设定参数的类型。
这样调用的时候就不用指定类型,第一是为了调用方便,第二是避免出现特定的数据库字段的类型。更换数据库就不用改代码了。
定义和赋值也和在一起,便于阅读。
2、参数名称的小改动
参数名称前面没有加“@”,因为并不是所有类型的数据库,参数前面都加@,写上的话,就不便于更换数据库,所以这里就没有写@,而是在函数内部,根据驱动方式来加前缀。
以上两点,确保了在更换数据库的时候,无需修改代码。这样就避免了重新生成代码,或者是维护两份、多份代码的烦恼了。当然只是这一点还不够,参数化SQL语句也需要一点处理,不过这里说的是参数的封装,就不在这里细说了,下一篇里在说。
在线帮助:http://help.naturefw.com/DAL/Part/ManagerParameter/default.html