• C# 中SqlParameter类的使用方法小结


    在c#中执行sql语句时传递参数的小经验

     1、直接写入法:

          例如:

                 int Id =1;

                 string Name="lui";

                 cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')";

            因为Id是数值,所以在传递的时候只需要在sql字符串中用"+Id+"即可实现,而   Name是字符串,所以在传递的时候还需要在"+Name+"两边各加一个单引号(')来 实现;

    2、给命令对象添加参数法:

         例如:

                int Id =1;

                string Name="lui";

                cmd.CommandText="insert into TUserLogin values(@Id,@Name)";

              //上条语句中直接在sql语句中写添加的参数名,不论参数类型都是如此.

               SqlParameter  para=new SqlParameter("@Id",SqlDbType.int,4);//生成一个名字为@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同

               para.Value=Id;//给参数赋值

               cmd.Parameters.Add(para);//必须把参数变量添加到命令对象中去。

               //以下类似

               para=new SqlParameter("@Name",SqlDbType.VarChar,16);

               para.Value=Name;

               com.Parameters.Add(para);

            ...然后就可以执行数据库操作了。

    声明:本帖转自 http://www.knowsky.com/339188.html

    在此对本帖原创作者,致以最诚挚的谢意!

    =============================================

     SqlParameter用法

    SqlParameter[] parameters = { new SqlParameter("@a", "a1"), new SqlParameter("@b", "b1") };

                string strReturn = "";

                StringBuilder strBulResult = new StringBuilder();

                foreach (SqlParameter parameter in parameters)

                {

                    strBulResult.Append(parameter.ParameterName);

                    strBulResult.Append(":");

                    strBulResult.Append(parameter.SqlValue);

                    strBulResult.Append("\n");

                }

                strReturn = strBulResult.ToString();

     

    声明:本帖转自 http://hi.baidu.com/daxiongmao_adi/blog/item/d7ac6ccdd75348540eb34553.html

    在此对本帖原创作者,致以最诚挚的谢意!

    =============================================

    SqlParameter用法

      关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--

    单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。 

    当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

     sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

    SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

    简单的给个示例

    传统的查询语句的sql可能为

    string sql="select * from users where user_id='"+Request.QueryString["uid"]+"'";

    很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

    现在,我们要改写这样的语句,使用SqlParameter来做

    SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);

    SqlParameter _userid = new SqlParameter("uid", SqlDbType.Int);

    _userid.Value = Request.QueryString["u_id"];

    SqlCmd.Parameters.Add(_userid);

    这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

    当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

    所以,使用参数化的sql语句,是一种很好的做法

    Dim sql As StringBuilder = New StringBuilder()

                sql.Append("")

                sql.Append("SELECT * FROM test")

                sql.Append(" WHERE  a= @p1 ")           

                Dim command As SqlCommand    =    dac.CreateCommand(sql.ToString())  'dac为自己写的类

                Dim param As SqlParameter = New SqlParameter()

                param .ParameterName = "@p1"

                param .SqlDbType = SqlDbType.NVarChar

                param .Value = b       'b为该函数的参数(ByVal b as String)

                command .Parameters.Add(param)

                Dim reader As SqlDataReader = 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#

    public SqlParameter (

        string parameterName,

        SqlDbType dbType,

        int size,

        ParameterDirection direction,

        byte precision,

        byte scale,

        string sourceColumn,

        DataRowVersion sourceVersion,

        bool sourceColumnNullMapping,

        Object value,

        string xmlSchemaCollectionDatabase,

        string xmlSchemaCollectionOwningSchema,

        string xmlSchemaCollectionName

    )

    参数

    parameterName

    要映射的参数的名称。

    dbType

    SqlDbType 值之一。

    size

    参数的长度。

    direction

    ParameterDirection 值之一。

    precision

    要将 Value 解析为的小数点左右两侧的总位数。

    scale

    要将 Value 解析为的总小数位数。

    sourceColumn

    源列的名称。

    sourceVersion

    DataRowVersion 值之一。

    sourceColumnNullMapping

    如果源列可为空,则为 true;如果不可为空,则为 false。

    value

    一个 Object,它是 SqlParameter 的值。

    xmlSchemaCollectionDatabase

    此 XML 实例的架构集合所在的数据库的名称。

    xmlSchemaCollectionOwningSchema

    包含此 XML 实例的架构集合的关系架构。

    xmlSchemaCollectionName

    此参数的架构集合的名称。

     备注

    如果未在 size 和 precision 参数中显式设置 Size 和 Precision,则从 dbType 参数的值推断出它们。

    SqlParameter 类

    表示 SqlCommand 的参数,也可以是它到 DataSet 列的映射。无法继承此类。

    有关此类型所有成员的列表,请参阅 SqlParameter 成员。

    System.Object

       System.MarshalByRefObject

          System.Data.SqlClient.SqlParameter

    [Visual Basic]

    NotInheritable Public Class SqlParameter

       Inherits MarshalByRefObject

       Implements IDbDataParameter, IDataParameter, ICloneable

    [C#]

    public sealed class SqlParameter : MarshalByRefObject,

       IDbDataParameter, IDataParameter, ICloneable

    [C++]

    public __gc __sealed class SqlParameter : public

       MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable

    [JScript]

    public class SqlParameter extends MarshalByRefObject implements

       IDbDataParameter, IDataParameter, ICloneable

    线程安全

    此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

    备注

    参数名称不区分大小写。

    示例

    [Visual Basic, C#, C++] 下面的示例通过 SqlDataAdapter 中的 SqlParameterCollection 集合创建 SqlParameter 的多个实例。这些参数用于从数据源中选择数据并将数据放在 DataSet 中。此示例假定已经用适当的架构、命令和连接创建了 DataSet 和 SqlDataAdapter。

    [Visual Basic]

    Public Sub AddSqlParameters()

        ' ...

        ' create myDataSet and myDataAdapter

        ' ...

        myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters"

        myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239

       

        myDataAdapter.Fill(myDataSet)

    End Sub 'AddSqlParameters

    [C#]

    public void AddSqlParameters()

    {

    // ...

    // create myDataSet and myDataAdapter

    // ...

      myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", SqlDbType.VarChar, 80).Value = "toasters";

      myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", SqlDbType.Int).Value = 239;

      myDataAdapter.Fill(myDataSet);

    }

    [C++]

    public:

    void AddSqlParameters()

    {

    // ...

    // create myDataSet and myDataAdapter

    // ...

      myDataAdapter->SelectCommand->Parameters->Add(S"@CategoryName", SqlDbType::VarChar, 80)->Value = S"toasters";

      myDataAdapter->SelectCommand->Parameters->Add(S"@SerialNum", SqlDbType::Int)->Value = __box(239);

      myDataAdapter->Fill(myDataSet);

    }

    [JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 。

    要求

    命名空间: System.Data.SqlClient

    平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列, .NET Framework 精简版

    程序集: System.Data (在 System.Data.dll 中)

    使用SqlParameter

    SqlParameter[] p =

    {

    SqlHelper.MakeInParam("@EntryID",SqlDbType.Int,4,ev.EntryID),

    SqlHelper.MakeInParam("@BlogID",SqlDbType.Int,4,ev.BlogID),

    SqlHelper.MakeInParam("@URL",SqlDbType.NVarChar,255,DataHelper.CheckNull(ev.ReferralUrl)),

    SqlHelper.MakeInParam("@IsWeb",SqlDbType.Bit,1,ev.PageViewType)

    };

    SqlHelper.ExecuteNonQuery(conn,CommandType.StoredProcedure,"blog_TrackEntry",p);

    答疑:SqlParameter赋值之后怎么添加值

    用SqlCommand我知道用add

    但我想问的是   SqlParameter

    例如

    SqlParameter   parm   =   new   SqlParameter(PARM_ORDER_ID,   SqlDbType.Int);

    parm.Value   =   orderId;

    之后能不能再改parm添加一个值

    因为我写了个方法是传递SqlParameter类型的参数

    但有时要做些判断

    SqlParameter   parm   =   new   SqlParameter(PARM_ORDER_ID,   SqlDbType.Int);

    parm.Value   =   orderId;

    if(...)

    {

    //添加一个参数

    }

    ExecuteReader(parm,.....);

    请问应该怎么做呢

    最佳答案        int IArticle.Insert(ArticleInfo article)

            {

                //如果对象存在

                if (article.ID != -1)

                    return -1;

                else

                    article.ID = TableHelper.GetSequence(SQLHelper.ConnectionString, "Article", "ID");

                //统计执行成功的数量

                int successCount = 0;

                string SQL_THIS = SQL_INSERT_ARTICLE;

                SqlParameter[] paras = GetParas();

                paras[0].Value = article.ID;

                paras[1].Value = article.Title;

                paras[2].Value = article.DateAdded;

                paras[3].Value = article.Text;

                paras[4].Value = article.SourceUrl;

                paras[5].Value = article.PostType;

                paras[6].Value = article.Author;

                paras[7].Value = article.Email;

                paras[8].Value = article.SourceName;

                paras[9].Value = article.BlogID;

                paras[10].Value = article.CategoryID;

                paras[11].Value = article.Summary;

                paras[12].Value = article.IsBySummary;

                paras[13].Value = article.DateUpdated;

                paras[14].Value = article.TitleUrl;

                paras[15].Value = article.FeedBackCount;

                paras[16].Value = article.PostConfig;

                paras[17].Value = article.EntryName;

                paras[18].Value = article.KeyWord;

                SqlConnection conn = new SqlConnection(SQLHelper.ConnectionString);

                successCount = SQLHelper.ExecuteNonQuery(conn, CommandType.Text, SQL_THIS, paras);

                return successCount;

            }

    声明:本帖转自 http://www.cnblogs.com/angelfeather/articles/1225902.html

    在此对本帖原创作者,致以最诚挚的谢意!

     =============================================

    例子:

    SqlParameter[] paraList = new SqlParameter[7];

    paraList[0] = new SqlParameter( "@userName ", SqlDbType.VarChar, 50);

    paraList[0].Value = personModel.UserName;

    paraList[1] = new SqlParameter( "@account ", SqlDbType.VarChar, 100);

    paraList[1].Value = personModel.Account;

    paraList[2] = new SqlParameter( "@pwd ", SqlDbType.VarChar, 100);

    paraList[2].Value = personModel.Pwd;

    paraList[3] = new SqlParameter( "@unitID ", SqlDbType.VarChar, 20);

    paraList[3].Value = personModel.UnitID;

    paraList[4] = new SqlParameter( "@email ", SqlDbType.VarChar, 100);

    paraList[4].Value = personModel.Email;

    paraList[5] = new SqlParameter( "@officeTel ", SqlDbType.VarChar, 20);

    paraList[5].Value = personModel.OfficeTel;

    paraList[6] = new SqlParameter( "@mobile ", SqlDbType.VarChar, 20);

    paraList[6].Value = personModel.Mobile;

    return sd.ExecuteNonQuery( "UP_Person_ADD ", paraList);

    声明:本帖转自 http://hljncxjh.blog.163.com/blog/static/7616708200862085248668/

    在此对本帖原创作者,致以最诚挚的谢意!

    =============================================

    sqlparameter问题,解决参考方法参见网址:

    http://topic.csdn.net/t/20050902/15/4246228.html

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunboy_2050/archive/2009/08/06/4417692.aspx

  • 相关阅读:
    mysql数据库的test类型
    jvm虚拟机分享课笔记
    内存模型中没有gc的是哪个
    jvm内存模型中-栈,方法区,程序计数器是线程安全的
    Random.nextInt()替换Math.random()
    异常抛出注意点
    缓存好文章
    java 实现serialVersionUID
    什么叫反向代理什么叫正向代理
    mysql count与sum的区别
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/1765397.html
Copyright © 2020-2023  润新知