传参

来源:互联网 发布:手机mac采集器 编辑:程序博客网 时间:2024/05/16 07:06

一是所有的SQL语句都存放在存储过程中,这样不但可以避免SQL注入,还能提高一些性能,并且存储过程可以由专门的数据库管理员(DBA)编写和集中管理,不过这种做法有时候针对相同的几个表有不同条件的查询,SQL语句可能不同,这样就会编写大量的存储过程,所以有人提出了第二种方案:参数化SQL语句。例如我们在本篇中创建的表UserInfo中查找所有女性用户,那么通常情况下我们的SQL语句可能是这样:

1select * from UserInfo where sex=0

在参数化SQL语句中我们将数值以参数化的形式提供,对于上面的查询,我们用参数化SQL语句表示为: 

1select * from UserInfo where sex=@sex

再对代码中对这个SQL语句中的参数进行赋值,假如我们要查找UserInfo表中所有年龄大于30岁的男性用户,这个参数化SQL语句可以这么写:

1select * from UserInfo where sex=@sex and age>@age

下面是执行这个查询并且将查询结果集以DataTable的方式返回的代码: 

01//实例化Connection对象 
02SqlConnection connection = new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=''"); 
03//实例化Command对象 
04SqlCommand command = new SqlCommand("select * from UserInfo where sex=@sex and age>@age", connection); 
05//第一种添加查询参数的例子 
06command.Parameters.AddWithValue("@sex", true); 
07//第二种添加查询参数的例子 
08SqlParameter parameter = new SqlParameter("@age", SqlDbType.Int);//注意UserInfo表里age字段是int类型的 
09parameter.Value = 30; 
10command.Parameters.Add(parameter);//添加参数 
11//实例化DataAdapter 
12SqlDataAdapter adapter = new SqlDataAdapter(command); 
13DataTable data = new DataTable();

 

 

上面的代码是访问SQL Server数据库的代码。如果本文中提到的数据分别在Access、MySQL、Oracle数据库,那么对应的参数化SQL语句及参数分别如下:

 

 

 

数据库AccessMySQLOracle SQL语句select * from UserInfo
where sex=? and age>?select * from UserInfo
where sex=?sex and age>?ageselect * from UserInfo
where sex=:sex and age>:age参数OleDbParameterMySqlParameterOracleParameter实例化参数OleDbParameter p=new OleDbParameter(“?”, OleDbType. Boolean);MySqlParameter p=new MySqlParameter(“?sex”, MySqlDbType.Bit);OracleParameter p=new OracleParameter(“:sex”, OracleType.Byte);赋值p.Value=true;p.Value=1;p.Value=1;

 

通过上面的实例代码我们可以看出尽管SQL语句大体相似,但是在不同数据库的特点,可能参数化SQL语句不同,例如在Access中参数化SQL语句是在参数直接以“?”作为参数名,在SQL Server中是参数有“@”前缀,在MySQL中是参数有“?”前缀,在Oracle中参数以“:”为前缀。
注意:因为在Access中参数名都是“?”,所以给参数赋值一定要按照列顺序赋值,否则就有可能执行出错。

 

 

 

 

        public int AddTypeParms(PhotoType type)
        {
            StringBuilder strsql = new StringBuilder();
            strsql.Append("insert into PhotoType (");
            strsql.Append("TypeNameCN,TypeNameEN,SortID,DefaultImg)");
            strsql.Append(" values (");
            strsql.Append("@TypeNameCN,@TypeNameEN,@SortID,@DefaultImg)");
            OleDbParameter[] parameters ={
                      new OleDbParameter("@TypeNameCN",OleDbType.VarWChar),
                      new OleDbParameter("@TypeNameEN",OleDbType.VarWChar),
                      new OleDbParameter("@SortID",OleDbType.SmallInt),
                      new OleDbParameter("@DefaultImg",OleDbType.VarWChar)
                                       
                                        };
            parameters[0].Value = type.TypeNameCN;
            parameters[1].Value = type.TypeNameEN;
            parameters[2].Value = type.SortID;
            parameters[3].Value = type.Img;

            object obj=DBHelper.GetSingle(strsql.ToString(),parameters);
            if(obj==null)
            {
                return 1;
            }
            else
            {
                return Convert.ToInt32(obj);
            }
       
        }

 

 

 

       private static void PrepareCommand(OleDbCommand cmd, OleDbConnection conn, OleDbTransaction trans, string cmdText, OleDbParameter[] cmdParms)
       {
           if (conn.State != ConnectionState.Open)
               conn.Open();
           cmd.Connection = conn;
           cmd.CommandText = cmdText;
           if (trans != null)
               cmd.Transaction = trans;
           cmd.CommandType = CommandType.Text;//cmdType;
           if (cmdParms != null)
           {


               foreach (OleDbParameter parameter in cmdParms)
               {
                   if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                       (parameter.Value == null))
                   {
                       parameter.Value = DBNull.Value;
                   }
                   cmd.Parameters.Add(parameter);
               }
           }
       }
       public static int ExecuteSql(string SQLString, params  OleDbParameter[] cmdParms)
       {
           using (OleDbConnection connection = new OleDbConnection(constr))
           {
               using (OleDbCommand cmd = new OleDbCommand())
               {
                   PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                   int rows = cmd.ExecuteNonQuery();
                   cmd.Parameters.Clear();
                   return rows;
               }
           }
       }
               /// <summary>
        /// 执行一条计算查询结果语句,返回查询结果(object)。
        /// </summary>
        /// <param name="SQLString">计算查询结果语句</param>
        /// <returns>查询结果(object)</returns>
       public static object GetSingle(string SQLString, params OleDbParameter[] cmdParms)
       {
           using (OleDbConnection connection = new OleDbConnection(constr))
           {
               using (OleDbCommand cmd = new OleDbCommand())
               {
                   try
                   {
                       PrepareCommand(cmd, connection, null, SQLString, cmdParms);
                       object obj = cmd.ExecuteScalar();
                       cmd.Parameters.Clear();
                       if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                       {
                           return null;
                       }
                       else
                       {
                           return obj;
                       }
                   }
                   catch (System.Data.OleDb.OleDbException e)
                   {
                       throw e;
                   }
               }
           }
       }

 

 

 

   声明参数:OleDbParameter para = new OleDbParameter("@string", DbType.String, 50);其中DbType.String应该改成:OleDbType.VarWChar。DbType,OleDbType,SqlDbType对应如下:


访问类型名称 数据库数据类型 OLEDB 类型 .NET 框架类型 成员名称
文本 VarWChar DBTYPE _ WSTR System.String OleDbType.VarWChar
备忘录 LongVarWCha R DBTYPE _ WSTR System.String OleDbType.LongVarWChar
字节数: UnsignedTinyInt DBTYPE _ UI 1 System.Byte OleDbType.UnsignedTinyInt
是 / 否 Boolean DBTYPE_BOOL System.Boolean OleDbType.Boolean
日期 / 时间 DateTime DBTYPE _ DATE System.DateTime OleDbType.date
货币 十进制 DBTYPE_NUMERIC System.Decimal OleDbType.numeric
十进制数: 十进制 DBTYPE_NUMERIC System.Decimal OleDbType.numeric
双数: 双 DBTYPE_R8 System.Double OleDbType.Double
Autonumber (复制 ID) GUID DBTYPE_GUID System.Guid OleDbType.guid
复制 (ID) 号: GUID DBTYPE_GUID System.Guid OleDbType.guid
Autonumber (长整型) 整数 DBTYPE_I4 System.Int 32 OleDbType.integer
数量: (长整型) 整数 DBTYPE_I4 System.Int 32 OleDbType.integer
OLE 对象 LongVarBinary DBTYPE_BYTES 数组 System.Byte OleDbType.LongVarBinary
单个数字: 单个 DBTYPE_R4 System.Single OleDbType.single
整型数: SmallInt DBTYPE_I2 System.Int 16 OleDbType.SmallInt
二进制 VarBinary * DBTYPE_BYTES 数组 System.Byte OleDbType.binary
超链接 VarWChar DBTYPE _ WSTR System.String OleDbType.VarWChar

 

原创粉丝点击