中易网

如何把oracle sql参数如何用@参数

答案:1  悬赏:0  
解决时间 2021-01-08 07:15
如何把oracle sql参数如何用@参数
最佳答案
参数化SQL语句
避免SQL注入的方法有两种:
一是所有的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的方式返回的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13

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

上面的代码是访问SQL Server数据库的代码。如果本文中提到的数据分别在Access、MySQL、Oracle数据库,那么对应的参数化SQL语句及参数分别如下:
数据库 Access MySQL Oracle
SQL语句 select * from UserInfo
where sex=? and age>? select * from UserInfo
where sex=?sex and age>?age select * from UserInfo
where sex=:sex and age>:age
参数 OleDbParameter MySqlParameter OracleParameter
实例化参数 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中参数名都是“?”,所以给参数赋值一定要按照列顺序赋值,否则就有可能执行出错。

Command对象传参效率测试
在.net平台,普通的insert语句有两种写法,不带参数insert into test(c1,c2) values(var1,var2)和带参数insert into test(c1,c2) values(:c1,:c2),它们的执行效率如何呢?
做了个试验,代码如下:(数据库是oracle)
+ View Code

执行结果:
10000记录:
不传参数?5:46:19 15:46:34 15秒
传参数:?5:50:51 15:51:01 10秒

50000记录:
不传参数 16:09:03 16:10:24 81秒
传参数::16:15:43 16:16:36 53秒
这只是2个参数的情况,如果参数很多会不会影响更大呢?

10000记录,7个参数:
不传参数:17:11:01 17:11:18 17秒
传参数:17:13:46 17:13:59 13秒
50000记录:7个参数:
不传参数:17:19:02 17:20:25 1分23秒
传参数:17:15:09 17:16:10 1分1秒

需要相差不大,但是向command对象传递参数既可以避免sql注入问题,也可以提高性能;
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
暖气片是单管的好,还是双管的好啊?什么材质
求购红继木树苗
阴阳师灯笼鬼厉害吗 灯笼鬼御魂搭配及阵容推
精华露和眼霜有什么区别?
自驾游比如从中国一路到欧洲,一路上的签证是
急求2016cpa网课。。。求分享百度云
带鱼舟的四字成语
河北旅游文化广播频道,FM88.1兆赫,晚上12点
万指纤红美甲美睫纹绣(步行街店)地址在什么地
南京大厂扬子体育馆1号门怎么去啊,有知道地
小巷交通事故中汽车转弯负责,还是直行路面的
连线网络俱乐部地址好找么,我有些事要过去
小车C驾照要考哪些科目
写一篇描写樱花的作文
择良家子谨厚者为吏,训以 礼法。均徭节费,减
推荐资讯
对于捷信公司有什么意见?
山东省316省道377公里处违章是在哪个地方呀,
你好北市区去耳季路坐哪路车坐地铁在哪里坐
在宁乡买房有什么限制要求吗?
得众图文地址在什么地方,想过去办事
东盛网吧地址好找么,我有些事要过去
精艺美发地址有知道的么?有点事想过去
求玻璃器皿品牌推荐?主要是想买点移液管,三
南宁今天黄金现在回收是什么价
给死者家属的信怎么写?
腿的英文是什么
请问黑揽角是不是有害食物
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?