|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
数据挖掘有点高深的,主要估计就是使用一些算法提取一些实用的数据。学好数据挖掘的话可以应聘baidu或者google,但是一般人家对算法的要求听高的。你最好还是学点应用型的吧。这种主要是研究型的。SqlCommandGenerator类的计划
SqlCommandGEnerator类的计划思绪就是经由过程反射失掉办法的参数,利用被SqlCommandParameterAttribute标志的参数来拆卸一个Command实例。
援用的定名空间:
//SqlCommandGenerator.cs
usingSystem;
usingSystem.Reflection;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingDebug=System.Diagnostics.Debug;
usingStackTrace=System.Diagnostics.StackTrace;
类代码:
namespaceDataAccess
{
publicsealedclassSqlCommandGenerator
{
//公有机关器,不同意利用无参数的机关器机关一个实例
privateSqlCommandGenerator()
{
thrownewNotSupportedException();
}
//静态只读字段,界说用于前往值的参数称号
publicstaticreadonlystringReturnValueParameterName="RETURN_VALUE";
//静态只读字段,用于不带参数的存储历程
publicstaticreadonlyobject[]NoValues=newobject[]{};
publicstaticSqlCommandGenerateCommand(SqlConnectionconnection,
MethodInfomethod,object[]values)
{
//假如没有指定办法称号,从仓库帧失掉办法称号
if(method==null)
method=(MethodInfo)(newStackTrace().GetFrame(1).GetMethod());
//猎取办法传出去的SqlCommandMethodAttribute
//为了利用该办法来天生一个Command工具,请求有这个Attribute。
SqlCommandMethodAttributecommandAttribute=
(SqlCommandMethodAttribute)Attribute.GetCustomAttribute(method,typeof(SqlCommandMethodAttribute));
Debug.Assert(commandAttribute!=null);
Debug.Assert(commandAttribute.CommandType==CommandType.StoredProcedure||
commandAttribute.CommandType==CommandType.Text);
//创立一个SqlCommand工具,同时经由过程指定的attribute对它举行设置。
SqlCommandcommand=newSqlCommand();
command.Connection=connection;
command.CommandType=commandAttribute.CommandType;
//猎取command的文本,假如没有指定,那末利用办法的称号作为存储历程称号
if(commandAttribute.CommandText.Length==0)
{
Debug.Assert(commandAttribute.CommandType==CommandType.StoredProcedure);
command.CommandText=method.Name;
}
else
{
command.CommandText=commandAttribute.CommandText;
}
//挪用GeneratorCommandParameters办法,天生command参数,同时增加一个前往值参数
GenerateCommandParameters(command,method,values);
command.Parameters.Add(ReturnValueParameterName,SqlDbType.Int).Direction
=ParameterDirection.ReturnValue;
returncommand;
}
privatestaticvoidGenerateCommandParameters(
SqlCommandcommand,MethodInfomethod,object[]values)
{
//失掉一切的参数,经由过程轮回逐一举行处置。
ParameterInfo[]methodParameters=method.GetParameters();
intparamIndex=0;
foreach(ParameterInfoparamInfoinmethodParameters)
{
//疏忽失落参数被标志为[NonCommandParameter]的参数
if(Attribute.IsDefined(paramInfo,typeof(NonCommandParameterAttribute)))
continue;
//猎取参数的SqlParameterattribute,假如没有指定,那末就创立一个并利用它的缺省设置。
SqlParameterAttributeparamAttribute=(SqlParameterAttribute)Attribute.GetCustomAttribute(
paramInfo,typeof(SqlParameterAttribute));
if(paramAttribute==null)
paramAttribute=newSqlParameterAttribute();
//利用attribute的设置来设置一个参数工具。利用那些已界说的参数值。假如没有界说,那末就从办法
//的参数来揣度它的参数值。
SqlParametersqlParameter=newSqlParameter();
if(paramAttribute.IsNameDefined)
sqlParameter.ParameterName=paramAttribute.Name;
else
sqlParameter.ParameterName=paramInfo.Name;
if(!sqlParameter.ParameterName.StartsWith("@"))
sqlParameter.ParameterName="@"+sqlParameter.ParameterName;
if(paramAttribute.IsTypeDefined)
sqlParameter.SqlDbType=paramAttribute.SqlDbType;
if(paramAttribute.IsSizeDefined)
sqlParameter.Size=paramAttribute.Size;
if(paramAttribute.IsScaleDefined)
sqlParameter.Scale=paramAttribute.Scale;
if(paramAttribute.IsPrecisionDefined)
sqlParameter.Precision=paramAttribute.Precision;
if(paramAttribute.IsDirectionDefined)
{
sqlParameter.Direction=paramAttribute.Direction;
}
else
{
if(paramInfo.ParameterType.IsByRef)
{
sqlParameter.Direction=paramInfo.IsOut?
ParameterDirection.Output:
ParameterDirection.InputOutput;
}
else
{
sqlParameter.Direction=ParameterDirection.Input;
}
}
//检测是不是供应的充足的参数工具值
Debug.Assert(paramIndex<values.Length);
//把响应的工具值赋于参数。
sqlParameter.Value=values[paramIndex];
command.Parameters.Add(sqlParameter);
paramIndex++;
}
//检测是不是有过剩的参数工具值
Debug.Assert(paramIndex==values.Length);
}
}
}
需要的事情终究完成了。SqlCommandGenerator中的代码都加上了正文,以是其实不难读懂。上面我们进进最初的一步,那就是利用新的办法来完成上一节我们一入手下手显现个谁人AddCustomer的办法。
重构新的AddCustomer代码:
[SqlCommandMethod(CommandType.StoredProcedure)]
publicvoidAddCustomer([NonCommandParameter]SqlConnectionconnection,
[SqlParameter(50)]stringcustomerName,
[SqlParameter(20)]stringcountry,
[SqlParameter(20)]stringprovince,
[SqlParameter(20)]stringcity,
[SqlParameter(60)]stringaddress,
[SqlParameter(16)]stringtelephone,
outintcustomerId)
{
customerId=0;//必要初始化输入参数
//挪用Command天生器天生SqlCommand实例
SqlCommandcommand=SqlCommandGenerator.GenerateCommand(connection,null,newobject[]
{customerName,country,province,city,address,telephone,customerId});
connection.Open();
command.ExecuteNonQuery();
connection.Close();
//必需明白前往输入参数的值
customerId=(int)command.Parameters["@CustomerId"].Value;
}
代码中必需注重的就是out参数,必要事前举行初始化,并在Command实行操纵今后,把参数值传回给它。受害于Attribute,使我们挣脱了那种编写大批单调代码编程生活。我们乃至还可使用Sql存储历程来编写天生全部办法的代码,假如那样做的话,可就年夜小节省了你的工夫了,上一节和这一节中所示的代码,你能够把它们独自编译成一个组件,如许就能够在你的项目中不休的重用它们了。捆绑编译器。用户不需要受制于厂家,自己就能将程序在新平台上编译运行。除了牛B轰轰的linux,估计也没有系统捆绑c/c++的编译器,而且许多新平台都无法支持复杂的c/c++编译器在上面直接运行。 |
|