|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
来吧!老师们!我代表千千万万的asp.net/C#的初学者在这里呼唤着!用于参数的Attribute
在编写多层使用程序的时分,你是不是为每主要写大批相似的数据会见代码而感应单调有趣?好比我们必要编写挪用存储历程的代码,大概编写T_SQL代码,这些代码常常必要传送各类参数,有的参数个数对照多,一不当心还简单写错。有无一种与日俱增的办法?固然,你可使用MS的DataAccessApplicationBlock,也能够利用本人编写的Block。这里向你供应一种另类办法,那就是利用Attribute。
上面的代码是一个挪用AddCustomer存储历程的惯例办法:
publicintAddCustomer(SqlConnectionconnection,
stringcustomerName,
stringcountry,
stringprovince,
stringcity,
stringaddress,
stringtelephone)
{
SqlCommandcommand=newSqlCommand("AddCustomer",connection);
command.CommandType=CommandType.StoredProcedure;
command.Parameters.Add("@CustomerName",SqlDbType.NVarChar,50).Value=customerName;
command.Parameters.Add("@country",SqlDbType.NVarChar,20).Value=country;
command.Parameters.Add("@Province",SqlDbType.NVarChar,20).Value=province;
command.Parameters.Add("@City",SqlDbType.NVarChar,20).Value=city;
command.Parameters.Add("@Address",SqlDbType.NVarChar,60).Value=address;
command.Parameters.Add("@Telephone",SqlDbType.NvarChar,16).Value=telephone;
command.Parameters.Add("@CustomerId",SqlDbType.Int,4).Direction=ParameterDirection.Output;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
intcustId=(int)command.Parameters["@CustomerId"].Value;
returncustId;
}
下面的代码,创立一个Command实例,然后增加存储历程的参数,然后挪用ExecuteMonQuery办法实行数据的拔出操纵,最初前往CustomerId。从代码能够看到参数的增加是一种反复单调的事情。假如一个项目有100多个乃至几百个存储历程,作为开辟职员的你会不会要想举措偷懒?(归正我会的:-))。
上面入手下手我们的代码主动天生工程:
我们的目标是依据办法的参数和办法的称号,主动天生一个Command工具实例,第一步我们要做的就是创立一个SqlParameterAttribute,代码以下:
SqlCommandParameterAttribute.cs
usingSystem;
usingSystem.Data;
usingDebug=System.Diagnostics.Debug;
namespaceDataAccess
{
//SqlParemeterAttribute施加到存储历程参数
[AttributeUsage(AttributeTargets.Parameter)]
publicclassSqlParameterAttribute:Attribute
{
privatestringname;//参数称号
privateboolparamTypeDefined;//是不是参数的范例已界说
privateSqlDbTypeparamType;//参数范例
privateintsize;//参数尺寸巨细
privatebyteprecision;//参数精度
privatebytescale;//参数局限
privatebooldirectionDefined;//是不是界说了参数偏向
privateParameterDirectiondirection;//参数偏向
publicSqlParameterAttribute()
{
}
publicstringName
{
get{returnname==null?string.Empty:name;}
set{_name=value;}
}
publicintSize
{
get{returnsize;}
set{size=value;}
}
publicbytePrecision
{
get{returnprecision;}
set{precision=value;}
}
publicbyteScale
{
get{returnscale;}
set{scale=value;}
}
publicParameterDirectionDirection
{
get
{
Debug.Assert(directionDefined);
returndirection;
}
set
{
direction=value;
directionDefined=true;
}
}
publicSqlDbTypeSqlDbType
{
get
{
Debug.Assert(paramTypeDefined);
returnparamType;
}
set
{
paramType=value;
paramTypeDefined=true;
}
}
publicboolIsNameDefined
{
get{returnname!=null&&name.Length!=0;}
}
publicboolIsSizeDefined
{
get{returnsize!=0;}
}
publicboolIsTypeDefined
{
get{returnparamTypeDefined;}
}
publicboolIsDirectionDefined
{
get{returndirectionDefined;}
}
publicboolIsScaleDefined
{
get{return_scale!=0;}
}
publicboolIsPrecisionDefined
{
get{return_precision!=0;}
}
...
以上界说了SqlParameterAttribute的字段和响应的属性,为了便利Attribute的利用,我们重载几个机关器,分歧的重载机关器用于不必的参数:
...
//重载机关器,假如办法中对应于存储历程参数称号分歧的话,我们用它来设置存储历程的称号
//其他机关器的目标相似
publicSqlParameterAttribute(stringname)
{
Name=name;
}
publicSqlParameterAttribute(intsize)
{
Size=size;
}
publicSqlParameterAttribute(SqlDbTypeparamType)
{
SqlDbType=paramType;
}
publicSqlParameterAttribute(stringname,SqlDbTypeparamType)
{
Name=name;
SqlDbType=paramType;
}
publicSqlParameterAttribute(SqlDbTypeparamType,intsize)
{
SqlDbType=paramType;
Size=size;
}
publicSqlParameterAttribute(stringname,intsize)
{
Name=name;
Size=size;
}
publicSqlParameterAttribute(stringname,SqlDbTypeparamType,intsize)
{
Name=name;
SqlDbType=paramType;
Size=size;
}
}
}
为了辨别办法中不是存储历程参数的那些参数,好比SqlConnection,我们也必要界说一个非存储历程参数的Attribute:
//NonCommandParameterAttribute.cs
usingSystem;
namespaceDataAccess
{
[AttributeUsage(AttributeTargets.Parameter)]
publicsealedclassNonCommandParameterAttribute:Attribute
{
}
}
我们已完成了SQL的参数Attribute的界说,在创立Command工具天生器之前,让我们思索如许的一个现实,那就是假如我们数据会见层挪用的不是存储历程,也就是说Command的CommandType不是存储历程,而是带有参数的SQL语句,我们想让我们的办法一样能够合适这类情形,一样我们仍旧可使用Attribute,界说一个用于办法的Attribute来标明该办法中的天生的Command的CommandType是存储历程仍是SQL文本,上面是新界说的Attribute的代码:
//SqlCommandMethodAttribute.cs
usingSystem;
usingSystem.Data;
namespaceEmisonline.DataAccess
{
[AttributeUsage(AttributeTargets.Method)]
publicsealedclassSqlCommandMethodAttribute:Attribute
{
privatestringcommandText;
privateCommandTypecommandType;
publicSqlCommandMethodAttribute(CommandTypecommandType,stringcommandText)
{
commandType=commandType;
commandText=commandText;
}
publicSqlCommandMethodAttribute(CommandTypecommandType):this(commandType,null){}
publicstringCommandText
{
get
{
returncommandText==null?string.Empty:commandText;
}
set
{
commandText=value;
}
}
publicCommandTypeCommandType
{
get
{
returncommandType;
}
set
{
commandType=value;
}
}
}
}
我们的Attribute的界说事情已全体完成,下一步就是要创立一个用来天生Command工具的类。简单的说:.net只有微软一家在做的,微软也不允许别人跟他做相同的工具,所以他就把需要的工具全部封装在.net的平台上了;而java是公开了。 |
|