none
如何在参数化查询中使用通配符和top函数 RRS feed

  • 问题

  • 老师您好,我在使用参数化查询的sql语句时总是出错,我实在找不出原因了,请看一下:
    string strSql = "select top @topN * from NewsTitle where Title like %@NewsTitle%";
    SqlParameter[] parms=new SqlParameter[]{new SqlParameter("@topN",SqlDbType.int,4),new SqlParameter(
              "@NewsTitle",SqlDbType.NVarChar,100)}; 
    parms[0].Value=10;
    parms[1].Value="传记";
    ……
    错误提示为@NewsTitle附近有语法错误
    2009年10月9日 15:38

答案

  • 你好!

    TOP 不能这么用你可以使用 String.Fromat 如:

    String strSql = String.Format("select top {0} * from NewsTitle where Title like %@NewsTitle%", 10);
    SqlCommand comm = new SqlCommand(strSql);
    comm.Parameters.AddWithValue("@NewsTitle", "传记");

    ......

    知识改变命运,奋斗成就人生!
    • 已标记为答案 飞羽 2009年10月10日 2:39
    2009年10月9日 16:08
    版主
  • String strSql = String.Format("select top {0} * from NewsTitle where Title like @NewsTitle", 10);
    SqlCommand comm = new SqlCommand(strSql);
    comm.Parameters.AddWithValue("@NewsTitle", "%传记%");


    知识改变命运,奋斗成就人生!
    • 已标记为答案 飞羽 2009年10月10日 2:39
    2009年10月10日 2:25
    版主

全部回复

  • 你好!

    TOP 不能这么用你可以使用 String.Fromat 如:

    String strSql = String.Format("select top {0} * from NewsTitle where Title like %@NewsTitle%", 10);
    SqlCommand comm = new SqlCommand(strSql);
    comm.Parameters.AddWithValue("@NewsTitle", "传记");

    ......

    知识改变命运,奋斗成就人生!
    • 已标记为答案 飞羽 2009年10月10日 2:39
    2009年10月9日 16:08
    版主
  • topN解决了,但是“第 1 行: '@NewsTitle' 附近有语法错误”这个错误还在,我想这样写
    String strSql = String.Format("select top {0} * from NewsTitle where Title like %{1}%", 10,"传记");
    ……
    这样写是肯定没有错的,但是这样就无法防止SQL注入了。
    请问该如何解决啊?

    2009年10月10日 2:18
  • String strSql = String.Format("select top {0} * from NewsTitle where Title like @NewsTitle", 10);
    SqlCommand comm = new SqlCommand(strSql);
    comm.Parameters.AddWithValue("@NewsTitle", "%传记%");


    知识改变命运,奋斗成就人生!
    • 已标记为答案 飞羽 2009年10月10日 2:39
    2009年10月10日 2:25
    版主
  • 我真是猪啊,没想到这么做.
    谢谢您的回答

    2009年10月10日 2:39
  • 不客气!欢迎来交流!
    知识改变命运,奋斗成就人生!
    2009年10月10日 4:57
    版主
  • 通过这个例子说明参数化查询并不是简单的用参数的值替代SQL语句中的参数,那么其具体原理是什么呢?能不能提供点资料或解释一下啊。MSDN上都查不到的。
    2009年10月10日 8:31
  • 你好!

    你使用 SQL SERVER 的事件探查器(SQL 2000)或 SQL Server Profiler(SQL 2005以上)去跟踪你使用参数执行的语句,你会发现所有语句最终会通过 sp_executesql 这个存储过程执行,关于这个存储过程的优点你可以通过下面的地址获取


    知识改变命运,奋斗成就人生!
    2009年10月10日 8:40
    版主
  • 通过这个例子说明参数化查询并不是简单的用参数的值替代SQL语句中的参数,那么其具体原理是什么呢?能不能提供点资料或解释一下啊。MSDN上都查不到的。

    您好,简单的来说,使用了参数,sql就不会把相应的文本解析成sql指令,从而防止了sql注入。
    在Sql Server的书籍上有介绍。
    2009年10月10日 10:54