【问题标题】:How to Safe input order by with SQLCommand in VbNet using SQLServer如何使用 SQL Server 在 Vb Net 中使用 SQL 命令保存输入顺序
【发布时间】:2019-01-31 21:38:39
【问题描述】:

Select cod,nom from tb_user where cod > @param0 order by @param1

    Dim mycod = 3
    Dim myorderby = "asc"

    Dim _adapter = New SqlDataAdapter
    cmd.CommandTimeout = timeout
    cmd.Connection = _conn
    cmd.CommandText = pSql
    cmd.CommandType = CommandType.Text

    Dim sqlParameter0 = New SqlParameter("@param0", mycod)
    cmd.Parameters.Add(sqlParameter0)
    Dim sqlParameter1 = New SqlParameter("@param1", myorderby)
    cmd.Parameters.Add(sqlParameter1)

    _adapter.SelectCommand = cmd

    _adapter.Fill(_ds, "result")

我知道我必须用我的变量 mycod 的值替换 @param0 以确保安全。 这在 param0 之类的变量中是可能的,但是我将 asc 放入的@param1 给了我以下错误:

the SELECT item identified  by the ORDER BY number 1 contains a variable as part of the expression identitying a column position 

PS:通过错误很明显SqlParameter不是输入这种顺序的方式。有没有办法安全输入这种查询?

【问题讨论】:

  • 为什么不做这个排序客户端?
  • 不好,但现在练习整个系统在客户端使用排序......
  • 我猜你允许用户订购结果?为什么订购客户端是不好的做法?
  • 没有具体的reson todo,只是我当时做的设计......用户可以选择orderby asc或orderby a column......只是因为它可以更容易管理sql跨度>

标签: sql sql-server vb.net


【解决方案1】:

您可以通过选择性地对两列进行排序来做到这一点。

Select cod,nom from tb_user 
where cod > @param0 
order by 
   case when @param1=1 then cod else 0 end, 
   case when @param1=2 then nom else 0 end

【讨论】:

  • 我应该对每一列都做一个案例吗?以及升序和降序?
  • 您的示例在结果集中只有两列。你在说几个?该技术无论如何都可以正常工作,但可能会有点长!
【解决方案2】:

有一些技术可以按参数动态排序,但这通常会导致显着变慢。当我尝试类似的事情时,我遇到了噩梦。 查询大部分时间运行良好,但创建的查询计划在使用不同的参数值时完全不合适,并且结果需要很长时间才能返回。..

由于您要绑定到 DataSet,因此您应该在调用 Fill() 后对 DefaultView 进行排序。

_ds.Tables(0).DefaultView.Sort = myorderby

【讨论】:

  • 但是这种对数据集的排序会减慢我的应用速度?
  • 好吧 如果 确实如此,那么您最好的选择是使用像 EntityFramework 这样的 ORM。这样,您就不会尝试操纵查询来执行它不应该执行的操作,并且您将获得在服务器上运行它的性能。但是在你放弃这个解决方案之前,请确保你的应用程序正在变慢。还可以考虑异步加载数据,这样您就不会阻塞您的应用程序 - stackoverflow.com/questions/38015089/…
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多