现有如下代码
SqlConnection conn =  new SqlConnection("server=(local);uid=sa;pwd=;database=Temp");
SqlCommand cmd = new SqlCommand("select * from Userinfo where Username <> 'a''aa' and UserId <> @UserId");
SqlParameter parm = new SqlParameter();
parm.ParameterName = "@UserId";
parm.Value = 1;
cmd.Parameters.Add(parm);
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();在SQL事件探查器中发现SQL语句被转换为
exec sp_executesql N'select * from Userinfo where Username <> ''a''''aa'' and UserId <> @UserId', N'@UserId int', @UserId = 1
也就是Sql语句中的一个单引号变为两个单引号,如果在Sql语句中没有@UserId,也就是这样写
"select * from Userinfo where Username <> 'a''aa' and UserId <> 1" 则不会进行转换,这是怎么回事?在MSDN中也找不到相关资料我现在需要在SQL语句中即有内嵌条件也有用SqlParameter 赋值的参数,怎样才能不让它转换单引号?多谢!急

解决方案 »

  1.   

    为啥不让它转换单引号?像这句
    exec sp_executesql N'select * from Userinfo where Username <> ''a''''aa'' and UserId <> @UserId', N'@UserId int', @UserId = 1'a''aa'如果不转换单引号,岂不是错了?
      

  2.   

    >>>>exec sp_executesql N'select * from Userinfo where Username <> ''a''''aa'' and UserId <> @UserId', N'@UserId int', @UserId = 1the reason it is converted is because you have N'...', inside '......', ' will become ''or trySqlCommand cmd = new SqlCommand("select * from Userinfo where Username <> @UserName and UserId <> @UserId");
    SqlParameter parm = new SqlParameter();
    parm.ParameterName = "@UserName";
    parm.Value = "a'aa";
    cmd.Parameters.Add(parm);
    parm = new SqlParameter();
    parm.ParameterName = "@UserId";
    parm.Value = 1;
    cmd.Parameters.Add(parm);
    cmd.Connection = conn;
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
      

  3.   

    这句话是对的
    exec sp_executesql N'select * from Userinfo where Username <> ''a''''aa'' and UserId <> @UserId', N'@UserId int', @UserId = 1
    就是将作为一个字符串传给sp_executesql,实际传过去的参数就是:
    select * from Userinfo where Username <> 'a''aa' and UserId <> @UserId
    这个字符串
    把这个查询变成一个字符串参数传递的时候要把单引号换成双引号,不换就错了没有@UserId的时候就不需要sp_executesql这个存储过程了,直接执行一个Sql语句即可,所以不用转换成''
      

  4.   

    这个转换是SQL内部执行的,就像及时编译一样,根本没必要去管它。