zoukankan      html  css  js  c++  java
  • 关于SqlCommand中Like和In参数化无法查询的问题探究

    通常我们使用SqlParameter以取代一般的字符串拼接,其目的是:1、防止SQL拼接语法错误(PS:同时防止近视,因为长长的字符串拼接经常把你弄得眼冒金星的……),2、防止SQL注入式攻击(详见:)。

    但是并不是所有的SQL都可以直接使用SqlParameter直接替换这样子做那么简单,下面我们来看两个极端例子,顺便分析SqlParameter究竟是什么东西?

    1、LIKE+SqlParameter:

    假定有这样一句SQL语句:

    Select * from xxx where [FieldName] Like @value

    如果你是这样做的(省略了其它,关键看@value这部分):

    SqlCommand.Parameters.AddWithValue("@value","'你的真实内容'");

    这样会导致错误结果的发生——因为SqlParameter针对string类型的会自动在真实的String内容上加上一对单引号。因此你目前执行的SQL就变成了:

    Select * from xxx where [FieldName] Like ''你的真实内容''(查询一个带有一对单引号的字符串内容?!)

    所以正解是:去掉这一对单引号,改成:

    SqlCommand.Parameters.AddWithValue("@value","你的真实内容");

    2、IN+SqlParameter:

    同理,假定有这样一个SQL查询语句:

    Select * from xxx where [FieldName] IN (@value)

    如果直接:

    SqlCommand.Parameters.AddWithValue("@value","'a,b,c");

    会因为前边被加上双引号变成这样的查询语句——

    Select * from xxx where [FieldName] IN (''a,b,c'')

    所以正确的做法应该是:首先假定传来一个不带引号的字符串"a,b,c",使用String的Split方法按英文逗号分割成若干小串,然后如果是第一个的话前面加半个单引号,末尾一个字符串加半个单引号。其余的加一对,最后再使用String.Join方法拼接,大致关键代码如下:

    [C#]

    string s = "a,b,c,e,d";
                string[] strings = s.Split(',');
                for (int i = 0; i < strings.Length; i++)
                {
                    if (i == 0)
                    {
                        strings[i] = strings[i] + "'";
                    }
                    else if (i == strings.Length - 1)
                    {
                        strings[i] = "'" + strings[i];
                    }
                    else
                    {
                        strings[i] = "'" + strings[i] + "'";
                    }
                }
    string result = String.Join(",",strings);
    SqlCommand.Parameters.AddWithValue("@value",result);

    [VB.NET]

    Dim s As String = "a,b,c,e,d"
    Dim strings As String() = s.Split(","C)
    For i As Integer = 0 To strings.Length - 1
        If i = 0 Then
            strings(i) = strings(i) & "'"
        ElseIf i = strings.Length - 1 Then
            strings(i) = "'" & strings(i)
        Else
            strings(i) = "'" & strings(i) & "'"
        End If
    Next
    Dim result As String = [String].Join(",", strings)
    SqlCommand.Parameters.AddWithValue("@value", result)
  • 相关阅读:
    软件设计中的分层模式, 三层开发遵循的原则,分层开发的特点和优势
    什么是jsp?
    在Servlet中如何如何获取请求的参数?
    Servlet的加载(执行过程,原理)和生命周期
    servlet的注册
    什么是servlet容器
    什么是Servlet
    如何访问动态页面——URL
    什么是C/S? Client/server的简写,这里Server指的是DBServer。
    MVC(Model-View-Controller)软件设计模式
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2561196.html
Copyright © 2011-2022 走看看