c#如何查看sql替换语句参数后的sql语句

sql语句中使用关键字in,该如何传递参数? - ITeye问答
如:数据库为mysql,字段id类型为int。
select id,name from table where id in (?)
该如何传递参数? PreparStatement.setString("1,2,3")只能查询id=1的情况,从第一个逗号后被截取了?
处女贴,谢谢!
问题补充:hudingchen 写道得这样写哦
select id,name from table where id in (?,?,?)
PreparStatement.setString("1")
PreparStatement.setString("2")
PreparStatement.setString("3")
关键是?号的个数是不确定的。
问题补充:如果一定只能使用一个?将参数传递进去,有没有可能实现?
问题补充:再具体点,如果一定要只能一个参数,一次性将1,2,3传递进去,可以吗?因为真实使用这个SQL的环境是报表里,没有java的函数、循环去处理它。
问题补充:fmjsjx 写道引用如果一定只能使用一个?将参数传递进去,有没有可能实现?
不行,所以一般不建议直接在代码里用in,通常in都是配合子查询使用。
没办法啊,有种情况下,当in的条件是客户在页面选择传递到后台的,除了in,还没想到其它办法
采纳的答案
不考虑java,那就改一下sql
select * from table
where instr(concat(',','1,2,3',','),concat(',',id,',')) & 0
String sql = "select id,name from table where id in (:ids)";
SQLQueryqueryObject=getSession().createSQLQuery(sql);
queryObject.setParameterList("ids",ids.split(","));
queryObject.list();
上面的你可以用一个?传递看看
不能用占位符,直接用+号连接生成sql语句:
String ids = "1,2,3";
String sql = "select id,name from table where id in (" + ids + ")";
引用如果一定只能使用一个?将参数传递进去,有没有可能实现?
不行,所以一般不建议直接在代码里用in,通常in都是配合子查询使用。
写多个问号也不麻烦
一个问号解决不了,一个问号是代表一个占位符。
不能拼sql,遍历sql?列表设置参数就行了
sql =select id,name from table where id in (。。。)
split(",")
for(..){
& ps.set。。。
可以不使用问号 直接拼装sql语句
遍历参数列表
String sql = "select id,name from table where id in ( "
for(i=0;i&arr.i++){
if(i!=arr.length-1){
& sql += arr[i]+',';
}else{
& sql += arr[i]+")"
}
}
然后直接执行sql语句
"1,2,3",你知道这个字符串吧
&&&&&&& String str = "1,2,3";
&&&&&&& String[] array = str.split(",");
根据数组的长度加问号
得这样写哦
select id,name from table where id in (?,?,?)
PreparStatement.setString("1")
PreparStatement.setString("2")
PreparStatement.setString("3")
已解决问题
未解决问题之前实现的窗体,我们在用户名和密码框中都输入1‘ or ‘1’=1’,如下图所示。单击“登录“按钮后,你会发现竟然也能进入主窗体!我们输入的名户名和密码并不正确,为何也能进入系统呢?
登录成功后,显示的主窗体,如下图:
这就涉及到了“SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。就这个窗体例子来说,我们在代码中用的SQL语句是:
string sqlStr = "select * from [Users] where UserName='" + txtUserName.Text.Trim()
+ "'and Password='" + txtUserPassword.Text.Trim() + "'";在用户名、密码框中输入1‘ or ‘1’=1’后产生的SQL语句为:
select * from [Users] where UserName='1' or '1'='1' and Password='1' or '1'='1
而‘1’=‘1’永远是正确的。这样,用户在不知道合法的用户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进入了系统,导致我们的用户验证模块形同虚设!为了避免这种情况的发生,提高程序的安全性,需要使用参数化SQL语句。
在ADO.NET对象模型中执行一个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。生成SqlParameter对象最简单的方式是调用SqlCommand对象的Parameters集合的AddWithValue方法。
这里又学习了一个新的对象:SqlParameter,表示SqlCommand的参数。
使用参数化SQL语句的步骤是:
定义包含参数的SQL语句,用@符号声明参数。为SQL语句中出现的每一个参数定义参数对象,并将参数对象加入到SqlCommand对象中。给参数赋值,并执行SQL语句。所以,修改上面的代码为:
string sqlStr="select * from [Users] where UserName=@UserName and Password=@Password"
然后创建命令对象的代码时,修改为:
现在,再次运行程序,在用户名和密码框中都输入‘1 or ’1‘=1’后,会提示“用户名或密码错误”,这样用户就没有办法非法登录系统了。
参数化SQL语句
转自:http://www.cnblogs.com/aito/archive//1808569.html
避免SQL注入的方法有两种:
一是所有的SQL语句都存放在存储过程中,...
C#开发学习笔记:C#中各种数据库参数化SQL语句
1.DB2数据库string strConn = &Provider=IBMDADB2;Data Source=数据库;UID=用户名;PWD=密码;&;
using (OleDb...
Sql注入和参数化查询
简单SQL注入
  之前写的一篇博客,里面有一个登录实例,是通过字符串拼接完成对数据库的查询的。当我在用户名框中随便输个字符,在密码框中也随便输入几个字符并在后面加上【’ or ‘1’ = ‘1】,...
C# SQL变量参数传递的两种方式
1.直接将值传入SQL语句方式
string sql = insert into tbUser(userName) values(&+txtUserName.Text+&)
//调用SQLHelp...
sql参数化查询
转自:http://blog.csdn.net/zyw_anquan/article/details/
SQL参数化查询
一、以往的防御方式
以前对付这种漏洞的方...
我们原先写的sql语句总是把条件直接拼进去
这样每次的sql都是不同的
但这些sql除了条件部分不同外,其他都是一样的
sqlserver在解析sql语句的时候分了几个步骤
1 语法分析
2 生成一个...
机房重构敲组合查询时,会遇到多个操作符(+、-、*、/),因为之前在使用参数化查询时只要遇到给数据库赋值时就使用参数,(光知道这样能防止SQL注入,直到如今才知道它为什么能防止SQL注入)索性就把操作...
你的SQL语句的参数化总是个好想法。使用参数化SQL语句你不会污染你的计划缓存——错!!!在这篇文章里我想向你展示下用参数化SQL语句就可以污染你的计划缓存,这是非常简单的!
ADO.NET-Add...
[C#] 数据库 参数化 查询
为了数据库注入漏洞, 我们在对数据库进行查询的时候, 要使用参数化查询
using System.Collections.G
using System...
C# 参数化SQL语句中的like和in
在写项目的时候遇到一个问题,sql 语句进行 like in 参数化,按照正常的方式是无法实现的
我们一般的思维是:
Like 参数:
string strSql = &select * fro...
没有更多推荐了,共被编辑 3 次
c# 如何查看替换参数后的sql语句
List&int& kinds = new List&int&();
list.ForEach(x =& kinds.Add(x.ID));
string kindStr = ListToStr&int&(kinds, ",", "''");
string sql = @"select * from
(select row_number() over(partition by c_kind_num order by n_order desc, d_list_date desc, ID desc) as rownum, id, c_kind_num, c_info_title, c_picurl1, g_id, '' AS link
from B_INFOS
where n_is_active=1 and c_kind_num in (@kind)
where T.rownum &= 1";
SqlParameter[] paras =
new SqlParameter("@kind", kindStr)
DataTable dt = DbHelperSQL.Query(sql, paras).Tables[0];
测试了@Victor的方法,并不行:
c# 如何查看替换参数后的sql语句
List&int& kinds = new List&int&();
list.ForEach(x =& kinds.Add(x.ID));
string kindStr = ListToStr&int&(kinds, ",", "''");
string sql = @"select * from
(select row_number() over(partition by c_kind_num order by n_order desc, d_list_date desc, ID desc) as rownum, id, c_kind_num, c_info_title, c_picurl1, g_id, '' AS link
from B_INFOS
where n_is_active=1 and c_kind_num in (@kind)
where T.rownum &= 1";
SqlParameter[] paras =
new SqlParameter("@kind", kindStr)
DataTable dt = DbHelperSQL.Query(sql, paras).Tables[0];
测试了的方法,并不行:
c# 如何查看替换参数后的sql语句
List&int& kinds = new List&int&();
list.ForEach(x =& kinds.Add(x.ID));
string kindStr = ListToStr&int&(kinds, ",", "''");
string sql = @"select * from
(select row_number() over(partition by c_kind_num order by n_order desc, d_list_date desc, ID desc) as rownum, id, c_kind_num, c_info_title, c_picurl1, g_id, '' AS link
from B_INFOS
where n_is_active=1 and c_kind_num in (@kind)
where T.rownum &= 1";
SqlParameter[] paras =
new SqlParameter("@kind", kindStr)
DataTable dt = DbHelperSQL.Query(sql, paras).Tables[0];
我要该,理由是:查看: 932|回复: 0
c#参数化Parameters利用sp_executesql执行sql语句
相关资源下载
我们知道,我们在查询数据库的时候,经常要带一些条件去查询数据库,
这些条件来源都来自客户端用户请求,如果,客户端带有恶意的字符串,
请求到我们服务器,就形成了一个拼接好的sql语句了,
从而,就可能形成sql注入了
Parameters可以有效的防止sql注入,我们知道Parameters是怎么做到的呢?也就是怎么实现的呢??
下面是一个c#的代码:
public static int login(string name, string pwd)
& & {
& && &&&connOpen();
& && &&&cmd = new SqlCommand(&select count(*) from tb_user where Name =@loginName and PassWd=@loginPasswd&, conn);
& && &&&cmd.Parameters.Add(new SqlParameter(&@loginName&, SqlDbType.NVarChar, 50));
& && &&&cmd.Parameters[&@loginName&].Value =
& && &&&cmd.Parameters.Add(new SqlParameter(&@loginPasswd&, SqlDbType.NVarChar, 50));
& && &&&cmd.Parameters[&@loginPasswd&].Value =
& && &&&int i = (int)cmd.ExecuteScalar();
& && &&&conn.Close();
& && &&&
& & }复制代码
随便从网上找的一段代码,我们来看一下,在数据库生成什么代码:
QQ截图58.jpg (53.6 KB, 下载次数: 65)
15:44 上传
exec sp_executesql N'select count(*) from tb_user where Name =@loginName and PassWd=@loginPasswd',N'@loginName nvarchar(50),@loginPasswd nvarchar(50)',@loginName=N'u',@loginPasswd=N'p'复制代码
https://msdn.microsoft.com/zh-cn/library/ms188001.aspx
上面链接是微软官方对sp_executesql的介绍。
上一篇:下一篇:
帖子永久地址:&<button type="submit" class="pn" onclick="setCopy('c#参数化Parameters利用sp_executesql执行sql语句\nhttps://www.itsvse.com/thread-.html', '帖子地址已经复制到剪贴板您可以用快捷键 Ctrl + V 粘贴到 QQ、MSN 里。')">推荐给好友架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、管理员和版主有权不事先通知发贴者而删除本文
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
免责声明:码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
Mail To:h&#x65;lp&#x40;&#x69;tsvs&#x65;&#46;&#99;om
Powered by Discuz! X3.4
Comsenz Inc.

我要回帖

更多关于 sql的九个常用语句 的文章

 

随机推荐