C#与Sql里的特殊字符

张飞不刮胡子 2011-03-17 09:11:34
我现在有一个需求。由于对对用户的输入没有任何限制(到目前为止我还没找到),现在要把用户输入的多个值以一个特殊符号合并后传给数据库的存储过程中,再拆开后储存。

在C#里,我声明一个char类型变量c, 并给值c = '\uf123',做为分隔符合并字符串
在Sql里声明了一个nvchar类型变量delimiter,并cast(0xf123,delimiter)后做为对应的分隔符拆分字符串。

但是依然没有拆分成功。而且在控制台里把c输出是一个?。而且把c直接存进数据库好像就变成null了。

我想问一下我哪里错了?还有别的方法实现我的需求没?

感谢!
...全文
580 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
天罡gg 2011-03-18
  • 打赏
  • 举报
回复
你这是脱裤子放屁,多此一举!
直接使用参数化SQL,可以防注入,用户输入特殊符号不影响。
如果你不懂参数化SQL,再看看ADO.NET吧,就是SqlParameter的形式
alluserinfo 2011-03-18
  • 打赏
  • 举报
回复
用split 然后使用数组一个一个判断.. 最后用join 组合
quanpp 2011-03-18
  • 打赏
  • 举报
回复
我给你个例子吧

declare @parm as varchar ( 5000) , @sql as varchar ( 5000 )

set @parm = '1\2\3'

set @parm = replace ( @parm , '\' , ' and proid=' )

set @sql = 'select * from testa where proid=' + @parm

print @sql
/*输出结果 select * from testa where proid=1 and proid=2 and proid=3*/

张飞不刮胡子 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 mmozhang 的回复:]
我现在有一个需求。由于对对用户的输入没有任何限制(到目前为止我还没找到),现在要把用户输入的多个值以一个特殊符号合并后传给数据库的存储过程中,再拆开后储存。

在C#里,我声明一个char类型变量c, 并给值c = '\uf123',做为分隔符合并字符串
在Sql里声明了一个nvchar类型变量delimiter,并cast(0xf123,delimiter)后做为对应的分隔符拆分字符串。
……
[/Quote]
我没明白你的意思,我的是参数化的. 比如参数@groupnames中要输入"A"+'\uf123'+"B",我在存储过程中要拆分出"A"和"B",然后储存成两条记录。
didiaogao 2011-03-18
  • 打赏
  • 举报
回复
拿|来合并字符串不行吗
张飞不刮胡子 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 mmozhang 的回复:]
引用 18 楼 linux7985 的回复:
楼主的意思是, 参数个数不定

你可以把用户的数据组装成Xml,
然后在Sql里读取这个Xml,很方便,可以用,理论上任何类型的数据都可以传递进去

可以不这么麻烦么?
[/Quote]
如果数据量大的话,这样数据量会大很多,点用网络吧
张飞不刮胡子 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 linux7985 的回复:]
楼主的意思是, 参数个数不定

你可以把用户的数据组装成Xml,
然后在Sql里读取这个Xml,很方便,可以用,理论上任何类型的数据都可以传递进去
[/Quote]
可以不这么麻烦么?
张飞不刮胡子 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 isline 的回复:]
转义了
[/Quote]
MM,能否详细点?举个例子就OK
genius_tong 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sjzlxd 的回复:]

SQL拼接字符串防止注入三个要点:
(1)所有数值类型的字符串,一定要转换成数值类型使用
(2)字符串对象在SQL语句中一定要在字符串两边加上单引号
(3)字符串中的所有单引号全部替换为两个单引号.

了解这3点 无论怎么拼接SQL字符串 都不会被注入.
[/Quote]

笑而不语
  • 打赏
  • 举报
回复
转义了
烈火蜓蜻 2011-03-18
  • 打赏
  • 举报
回复
楼主的意思是, 参数个数不定

你可以把用户的数据组装成Xml,
然后在Sql里读取这个Xml,很方便,可以用,理论上任何类型的数据都可以传递进去
yalan 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 scm_2008 的回复:]
你这是脱裤子放屁,多此一举!
直接使用参数化SQL,可以防注入,用户输入特殊符号不影响。
如果你不懂参数化SQL,再看看ADO.NET吧,就是SqlParameter的形式
[/Quote]

精辟精屁啊~~~~~~~顶,我赞同你的意见
张飞不刮胡子 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 scm_2008 的回复:]
你这是脱裤子放屁,多此一举!
直接使用参数化SQL,可以防注入,用户输入特殊符号不影响。
如果你不懂参数化SQL,再看看ADO.NET吧,就是SqlParameter的形式
[/Quote]
你不用激动。我做的是代码维护,不想改原来接口。

比如有两个表,一个用户表,一个课程表。每个表的插入都用一个存储过程实现。插入用户的存储过程会有课程名的参数,在里面再调用插入课程的存储过程。

以前用户表跟课程表是N:1的关系(不用管是否合理),课程表的主键做为用户表的外键。在插入用户记录的存储过程中用户名和课程名是做为参数传进,在此存储过程中会同时插进一个用户和一个课程(如果是新的话)。

新版本是N:N的关系(当然就多了一个中间表)。所以挺入用户的存储过程会传进几个课程名,然后再拆分,偱环调用挺入多个课程表。

不知我现在说得够清楚没有?
人工智能算法 2011-03-17
  • 打赏
  • 举报
回复
SQL拼接字符串防止注入三个要点:
(1)所有数值类型的字符串,一定要转换成数值类型使用
(2)字符串对象在SQL语句中一定要在字符串两边加上单引号
(3)字符串中的所有单引号全部替换为两个单引号.

了解这3点 无论怎么拼接SQL字符串 都不会被注入.
gxzh0817 2011-03-17
  • 打赏
  • 举报
回复
不明白!
学习了!
  • 打赏
  • 举报
回复
CAST语法
CAST (expression AS data_type [ (length ) ] )

CONVERT语法
CONVERT (data_type [ (length ) ] ,expression [ ,style ] )
bbb332 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
建议使用参数化SQL。
[/Quote]...
  • 打赏
  • 举报
回复
C#中的char类型表示的 Unicode 字符。Unicode 字符是 16 位字符,用于表示世界上大多数已知的书面语言。你确定你的字符在范围之类吗?

varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

所以选择nvarchar应该是没错的

小童 2011-03-17
  • 打赏
  • 举报
回复
对的,所有的T-SQL别用+号链接,@参数赋值
加载更多回复(3)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧