Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在VB.Net中添加ORDERBY子句?_Sql Server_Vb.net - Fatal编程技术网

Sql server 在VB.Net中添加ORDERBY子句?

Sql server 在VB.Net中添加ORDERBY子句?,sql-server,vb.net,Sql Server,Vb.net,如何连接 orderby VB.NET中的子句 以下是我尝试过的: 将命令用作新的SqlCommand() command.Connection=conn Dim参数名称作为新列表(字符串)(dt_data.RowCount-2) 对于i作为整数=0到dt_data.RowCount-3 Dim参数名称为String=“@meter\u num\u”&i 作为字符串的Dim meter_编号=dt_数据。行(i)。单元格(3)。值 command.Parameters.AddWithValue

如何连接

orderby
VB.NET中的子句

以下是我尝试过的:

将命令用作新的SqlCommand()
command.Connection=conn
Dim参数名称作为新列表(字符串)(dt_data.RowCount-2)
对于i作为整数=0到dt_data.RowCount-3
Dim参数名称为String=“@meter\u num\u”&i
作为字符串的Dim meter_编号=dt_数据。行(i)。单元格(3)。值
command.Parameters.AddWithValue(参数名称、仪表号)
parameterName.Add(parameterName)
下一个
command.CommandText=String.Format(“从客户中选择*,其中cycle=@cycle和meter_num IN({0})”,String.Join(“,”,parameterNames),(“按客户名称ASC排序”)
command.Parameters.AddWithValue(“@cycle”,cycle2last)
Dim da作为新的SqlDataAdapter(命令)
Dim ds作为新数据集
da.填写(ds,“客户”)
比较\u Reading.dt\u last2month.DataSource=ds.Tables(0)
终端使用
我希望它是这样的

从表名称中选择*
其中column_name=@column和column2=@column2
按列排序\u名称ASC

要在单个指令中执行此操作,您需要替换

Compare_Reading.dt_last2month.DataSource = ds.Tables(0)
与:


列表(of T)的一个优点是,在添加项目之前,您不需要知道其大小。它将根据需要扩大。因此,我从构造函数中删除了int32

我想您需要
dt_data.RowCount-2
进入
For
循环,否则您将跳过最后一行。我将您的
.AddWithValue
更改为
.Add
。您必须检查数据库中的正确数据类型(我猜),并相应地调整代码

我认为您的主要问题在于
String.Format
。您添加了2个参数,但忽略了将其放入
{1}

我添加了一个
Debug.Print
,这样您就可以检查您的选择是否与预期相符。在调试中运行时,这将显示在即时窗口中。它不会影响发布版本

您不需要
数据适配器
数据集
,只需要
数据表
。使用块将
.DataSource
分配到
之外

我不认为有任何关于sql注入的担心,因为您已经正确地使用了所有变量的参数

Private Sub OPCode(cycle2last As String)
    Dim dt As New DataTable
    Using conn As New SqlConnection("Your connection string")
        Using command As New SqlCommand()
            command.Connection = conn

            Dim parameterNames As New List(Of String)
            For i As Integer = 0 To DataGridView1.RowCount - 2
                Dim parameterName As String = "@meter_num_" & i
                Dim meter_number As String = DataGridView1.Rows(i).Cells(3).Value.ToString
                command.Parameters.Add(parameterName, SqlDbType.VarChar).Value = meter_number
                parameterNames.Add(parameterName)
            Next

            command.CommandText = String.Format("SELECT * FROM customer WHERE cycle = @cycle and meter_num IN ({0}) {1}", String.Join(",", parameterNames), ("ORDER BY Client_Name ASC;"))
            command.Parameters.Add("@cycle", SqlDbType.VarChar).Value = cycle2last

            Debug.Print(command.CommandText)
            conn.Open()
            dt.Load(command.ExecuteReader)
        End Using
    End Using
    DataGridView2.DataSource = dt
End Sub

只需在字符串的末尾添加
string.Format(“按客户机名称ASC按({0})顺序选择…和meter_num”,string.Join(“,”,parameterNames))
Don't use由于您根本不使用参数,这不是对SQL注入开放的吗?您使用参数作为循环,但是您只需要将一组其他字符串值组合在一起并执行它。此代码易受sql注入的攻击。@SeanRange避免sql注入的正确方法是什么?在sql字符串中,更好的方法如@Fabio之前所述。
Private Sub OPCode(cycle2last As String)
    Dim dt As New DataTable
    Using conn As New SqlConnection("Your connection string")
        Using command As New SqlCommand()
            command.Connection = conn

            Dim parameterNames As New List(Of String)
            For i As Integer = 0 To DataGridView1.RowCount - 2
                Dim parameterName As String = "@meter_num_" & i
                Dim meter_number As String = DataGridView1.Rows(i).Cells(3).Value.ToString
                command.Parameters.Add(parameterName, SqlDbType.VarChar).Value = meter_number
                parameterNames.Add(parameterName)
            Next

            command.CommandText = String.Format("SELECT * FROM customer WHERE cycle = @cycle and meter_num IN ({0}) {1}", String.Join(",", parameterNames), ("ORDER BY Client_Name ASC;"))
            command.Parameters.Add("@cycle", SqlDbType.VarChar).Value = cycle2last

            Debug.Print(command.CommandText)
            conn.Open()
            dt.Load(command.ExecuteReader)
        End Using
    End Using
    DataGridView2.DataSource = dt
End Sub