您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > C中SqlParameter类的使用方法小结
C#中SqlParameter类的使用方法小结在c#中执行sql语句时传递参数的小经验1、直接写入法:例如:intId=1;stringName=lui;cmd.CommandText=insertintoTUserLoginvalues(+Id+,'+Name+');因为Id是数值,所以在传递的时候只需要在sql字符串中用+Id+即可实现,而Name是字符串,所以在传递的时候还需要在+Name+两边各加一个单引号(')来实现;2、给命令对象添加参数法:例如:intId=1;stringName=lui;cmd.CommandText=insertintoTUserLoginvalues(@Id,@Name);//上条语句中直接在sql语句中写添加的参数名,不论参数类型都是如此.SqlParameterpara=newSqlParameter(@Id,SqlDbType.int,4);//生成一个名字为@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同para.Value=Id;//给参数赋值cmd.Parameters.Add(para);//必须把参数变量添加到命令对象中去。//以下类似para=newSqlParameter(@Name,SqlDbType.VarChar,16);para.Value=Name;com.Parameters.Add(para);...然后就可以执行数据库操作了。声明:本帖转自在此对本帖原创作者,致以最诚挚的谢意!=============================================SqlParameter用法SqlParameter[]parameters={newSqlParameter(@a,a1),newSqlParameter(@b,b1)};stringstrReturn=;StringBuilderstrBulResult=newStringBuilder();foreach(SqlParameterparameterinparameters){strBulResult.Append(parameter.ParameterName);strBulResult.Append(:);strBulResult.Append(parameter.SqlValue);strBulResult.Append(\n);}strReturn=strBulResult.ToString();声明:本帖转自在此对本帖原创作者,致以最诚挚的谢意!=============================================SqlParameter用法关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是'or1=1--单引号而截断字符串,“or1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select*from的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出'or1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。简单的给个示例传统的查询语句的sql可能为stringsql=select*fromuserswhereuser_id='+Request.QueryString[uid]+';很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。现在,我们要改写这样的语句,使用SqlParameter来做SqlCommandSqlCmd=newSqlCommand(sql,SqlConn);SqlParameter_userid=newSqlParameter(uid,SqlDbType.Int);_userid.Value=Request.QueryString[u_id];SqlCmd.Parameters.Add(_userid);这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。当然,这仅是一个示例而已,在真实的情况下,可能你还要对Request.QueryString[u_id]进行必要的检测与分析,这样才安全所以,使用参数化的sql语句,是一种很好的做法DimsqlAsStringBuilder=NewStringBuilder()sql.Append()sql.Append(SELECT*FROMtest)sql.Append(WHEREa=@p1)DimcommandAsSqlCommand=dac.CreateCommand(sql.ToString())'dac为自己写的类DimparamAsSqlParameter=NewSqlParameter()param.ParameterName=@p1param.SqlDbType=SqlDbType.NVarCharparam.Value=b'b为该函数的参数(ByValbasString)command.Parameters.Add(param)DimreaderAsSqlDataReader=command.ExecuteReader()SqlParameter构造函数SqlParameter构造函数(String,SqlDbType,Int32,ParameterDirection,Byte,Byte,String,DataRowVersion,Boolean,Object,String,String,String)初始化SqlParameter类的一个新实例,该类使用参数名、参数的类型、参数的长度、方向、精度、小数位数、源列名称、DataRowVersion值之一、用于源列映射的布尔值、SqlParameter的值、此XML实例的架构集合所在的数据库的名称、此XML实例的架构集合所在的关系架构以及此参数的架构集合的名称。命名空间:System.Data.SqlClient程序集:System.Data(在system.data.dll中)C#publicSqlParameter(stringparameterName,SqlDbTypedbType,intsize,ParameterDirectiondirection,byteprecision,bytescale,stringsourceColumn,DataRowVersionsourceVersion,boolsourceColumnNullMapping,Objectvalue,stringxmlSchemaCollectionDatabase,stringxmlSchemaCollectionOwningSchema,stringxmlSchemaCollectionName)参数parameterName要映射的参数的名称。dbTypeSqlDbType值之一。size参数的长度。directionParameterDirection值之一。precision要将Value解析为的小数点左右两侧的总位数。scale要将Value解析为的总小数位数。sourceColumn源列的名称。sourceVersionDataRowVersion值之一。sourceColumnNullMapping如果源列可为空,则为true;如果不可为空,则为false。value一个Object,它是SqlParameter的值。xmlSchemaCollectionDatabase此XML实例的架构集合所在的数据库的名称。xmlSchemaCollectionOwningSchema包含此XML实例的架构集合的关系架构。xmlSchemaCollectionName此参数的架构集合的名称。备注如果未在size和precision参数中显式设置Size和Precision,则从dbType参数的值推断出它们。SqlParameter类表示SqlCommand的参数,也可以是它到DataSet列的映射。无法继承此类。有关此类型所有成员的列表,请参阅SqlParameter成员。System.ObjectSystem.MarshalByRefObjectSystem.Data.SqlClient.SqlParameter[VisualBasic]NotInheritablePublicClassSqlParameterInheritsMarshalByRefObjectImplementsIDbDataParameter,IDataParameter,ICloneable[C#]publicsealedclassSqlParameter:MarshalByRefObject,IDbDataParameter,IDataParameter,ICloneable[C++]public__gc__sealedclassSqlParameter:publicMarshalByRefObject,IDbDataParameter,IDataParameter,ICloneable[JScript]publicclassSqlParameterextendsMarshalByRefObjectimplementsIDbDataParameter,IDataParameter,ICloneable线程安全此类型的所有公共静态(VisualBasic中为Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。备注参数名称不区分大小写。示例[VisualBasic,C#,C++]下面的示例通过SqlDataAdapter中的SqlParameterCollection集合创建SqlParameter的多个实例。这些参数用于从数据源中选择数据并将数据放在DataSet中。此示例假定已经用适当的架构、命令和连接创建了DataSet和SqlDataAdapter。[VisualBasic]PublicSubAddSqlParameters()'...'createmyDataSetandmyDataAdapter'...myDataAdapter.SelectCommand.Parameters.Add(@CategoryName,SqlDbType.VarChar,80).Value=toastersmyDataAdapter.SelectCommand.Parameters.Add(@SerialNum,SqlDbType.Int).Value=239myDataAdapter.Fill(myDataSet)EndSub'AddSqlParameters[C#]publicvoidAddSqlParameters(){//...//createmyDataSetandmyDataAdapter//...myDataAdapter.SelectCommand.Parameters.Add(@CategoryName,SqlDbType.VarChar,80).Value=toasters;myDataAdapter.SelectCommand.Parameters.Add(@SerialNum,SqlDbType.Int).Value=239
本文标题:C中SqlParameter类的使用方法小结
链接地址:https://www.777doc.com/doc-2908371 .html