仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 578|回复: 7
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的.net中Attribuge的具体使用(三)

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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是公开了。
只想知道 该用户已被删除
沙发
发表于 2015-1-18 13:14:57 来自手机 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
再见西城 该用户已被删除
板凳
发表于 2015-1-18 13:14:57 | 只看该作者
主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。
乐观 该用户已被删除
地板
发表于 2015-2-9 01:35:13 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
小魔女 该用户已被删除
5#
发表于 2015-2-26 17:32:20 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-3-8 16:28:31 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
若天明 该用户已被删除
7#
发表于 2015-3-16 07:31:12 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
深爱那片海 该用户已被删除
8#
发表于 2015-3-22 21:10:41 | 只看该作者
业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 09:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表