传参
来源:互联网 发布:手机mac采集器 编辑:程序博客网 时间:2024/05/16 07:06
一是所有的SQL语句都存放在存储过程中,这样不但可以避免SQL注入,还能提高一些性能,并且存储过程可以由专门的数据库管理员(DBA)编写和集中管理,不过这种做法有时候针对相同的几个表有不同条件的查询,SQL语句可能不同,这样就会编写大量的存储过程,所以有人提出了第二种方案:参数化SQL语句。例如我们在本篇中创建的表UserInfo中查找所有女性用户,那么通常情况下我们的SQL语句可能是这样:
1
select * from UserInfo where sex=0
在参数化SQL语句中我们将数值以参数化的形式提供,对于上面的查询,我们用参数化SQL语句表示为:
1
select * from UserInfo where sex=@sex
再对代码中对这个SQL语句中的参数进行赋值,假如我们要查找UserInfo表中所有年龄大于30岁的男性用户,这个参数化SQL语句可以这么写:
1
select * from UserInfo where sex=@sex and age>@age
下面是执行这个查询并且将查询结果集以DataTable的方式返回的代码:
01
//实例化Connection对象
02
SqlConnection connection =
new
SqlConnection(
"server=localhost;database=pubs;uid=sa;pwd=''"
);
03
//实例化Command对象
04
SqlCommand command =
new
SqlCommand(
"select * from UserInfo where sex=@sex and age>@age"
, connection);
05
//第一种添加查询参数的例子
06
command.Parameters.AddWithValue(
"@sex"
,
true
);
07
//第二种添加查询参数的例子
08
SqlParameter parameter =
new
SqlParameter(
"@age"
, SqlDbType.Int);
//注意UserInfo表里age字段是int类型的
09
parameter.Value = 30;
10
command.Parameters.Add(parameter);
//添加参数
11
//实例化DataAdapter
12
SqlDataAdapter adapter =
new
SqlDataAdapter(command);
13
DataTable 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
- 传参
- 传参
- 传参
- 传参
- 传参
- &传参
- C#传参
- java传参
- JSF传参
- js 传参
- 传参 容器
- Dwr 传参:
- ajax 传参
- python传参
- AfxBeginThread 传参
- dll传参
- HELP传参
- smartclient 传参
- CTime类的用法
- Hibernate查询方法
- 静态方法中引用非静态变量
- Oracle create tablespace 创建表空间语法详解
- Android学习笔记之AndroidManifest.xml文件解析
- 传参
- 构想“一体化”的企业信息化架构
- 基于Annotation的Hibernate3.3+Spring2.5整合开发
- 研究如何继续
- 关于spring加载applicationContext初始化bean顺序的问题
- java中的方法不能写在main()里面
- 重写equals方法的注意事项
- 【JavaScript】遍历数组
- 解决表死锁