Vb.net 疯狂随机MS访问查询
我真的累坏了。我有这个查询,它在我的Sql server数据库中非常有效,但是当我把它放在我的MS Access数据库中时,我有一个错误(索引(零基)必须大于或等于零,并且小于参数列表的大小)。 Sql server查询:Vb.net 疯狂随机MS访问查询,vb.net,Vb.net,我真的累坏了。我有这个查询,它在我的Sql server数据库中非常有效,但是当我把它放在我的MS Access数据库中时,我有一个错误(索引(零基)必须大于或等于零,并且小于参数列表的大小)。 Sql server查询: Dim sql As String = String.Format(" SELECT TOP {0} ID1,Team1,Team2,Team3 FROM (SELECT ROW_NUMBER() OVER(ORDER BY newid() ASC) AS F1, ID1,
Dim sql As String = String.Format(" SELECT TOP {0} ID1,Team1,Team2,Team3 FROM (SELECT ROW_NUMBER() OVER(ORDER BY newid() ASC) AS F1, ID1, Team1, Team2 FROM Table1 ) as t1 INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY newid() ASC) AS F1,Team3 FROM Table2 ) as t2 on t1.f1 = t2.f1", rows)
MS访问查询:
Dim sql As String = String.Format(" SELECT TOP (0) ID1,Team1,Team2,Team3 FROM (SELECT ROW_NUMBER() OVER(ORDER BY {" & Guid.NewGuid().ToString & "} ASC) AS F1,ID1,Team1,Team2 from Table1) as t1 INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY {" & Guid.NewGuid().ToString & "} ASC) AS F1, Team3 FROM Table2 ) as t2 on t1.f1 = t2.f1 ", rows)
我的Form1加载代码:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Conn_Randomize()
InfoCommand = New OleDbCommand("SELECT * FROM Table1 ORDER BY Team2", Conn_Randomize)
InfoAdapter = New OleDbDataAdapter()
InfoAdapter.SelectCommand = InfoCommand
InfoTable = New DataTable()
InfoAdapter.Fill(InfoTable)
DataGridView1.DataSource = InfoTable
End Sub
我要在DataGridView2中使用NumericupDown1和2显示并随机化的输入行数和列数的代码
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Conn_Randomize()
Dim rows As Integer
If Not Integer.TryParse(NumericUpDown1.Value, rows) Then
MsgBox("NUMBER NOT AVAILABLE", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error")
NumericUpDown1.Value = ""
NumericUpDown1.Focus()
Exit Sub
End If
If NumericUpDown2.Value = 2 Then
Dim sql As String = String.Format("SELECT Top {0} ID1, Team1, Team2 FROM Table1 ORDER BY RND(-(100000*ID1)*Time())", rows)
InfoCommand = New OleDbCommand(sql, Conn_Randomize)
InfoAdapter = New OleDbDataAdapter()
InfoAdapter.SelectCommand = InfoCommand
InfoTable = New DataTable()
InfoAdapter.Fill(InfoTable)
DataGridView2.DataSource = InfoTable
End If
If NumericUpDown2.Value = 3 Then
Dim sql As String = String.Format(" SELECT TOP {0} ID1,Team1,Team2,Team3 FROM (SELECT ROW_NUMBER() OVER(ORDER BY {" & Guid.NewGuid().ToString & "} ASC) AS F1,ID1,Team1,Team2 from Table1) as t1 INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY {" & Guid.NewGuid().ToString & "} ASC) AS F1, Team3 FROM Table2 ) as t2 on t1.f1 = t2.f1 ", rows)
InfoCommand = New OleDbCommand(sql, Conn_Randomize)
InfoAdapter = New OleDbDataAdapter()
InfoAdapter.SelectCommand = InfoCommand
InfoTable = New DataTable()
InfoAdapter.Fill(InfoTable)
DataGridView2.DataSource = InfoTable
End If
End Sub
在执行第二个代码段后,您是否确实查看了
sql
包含的内容?这有意义吗
第一个代码段使用的是newid
,这是一个T-SQL函数,这意味着数据库将为每一行生成一个新的uniqueidentifier
,并使用它们对数据进行排序。第二个代码段是如何做到这一点的?它只在VB代码中调用一次NewGuid
,并将结果连接到SQL代码中。幸运的是,这甚至是有效的语法,但结果不会是每个记录都有不同的排序值
您需要数据库为每个记录生成一个值,该值可用作排序键,在Access SQL中生成随机数的方法是使用Rnd
。我以为你几天前就已经在用了
另外,虽然我还没有检查,但我不确定Access中是否支持
行号
。很久以前,它还没有添加到SQL Server中。在执行第二个代码片段之后,您是否确实查看了SQL
包含的内容?这有意义吗
第一个代码段使用的是newid
,这是一个T-SQL函数,这意味着数据库将为每一行生成一个新的uniqueidentifier
,并使用它们对数据进行排序。第二个代码段是如何做到这一点的?它只在VB代码中调用一次NewGuid
,并将结果连接到SQL代码中。幸运的是,这甚至是有效的语法,但结果不会是每个记录都有不同的排序值
您需要数据库为每个记录生成一个值,该值可用作排序键,在Access SQL中生成随机数的方法是使用Rnd
。我以为你几天前就已经在用了
另外,虽然我还没有检查,但我不确定Access中是否支持
行号
。很久以前它还没有被添加到SQL Server中。是的,我认为行数不能适应MS Access。。如何用MS Access query解决这个问题请注意,您实际上还没有解释您要做什么,我们无法从一些SQL代码中解出它。你可以编辑这个问题,也可以发布一个新的问题,并提供一个完整而清晰的解释,说明你想要达到的目标。其次,如果Access中没有与ROW_NUMBER
等效的数据(我不知道有,但你应该检查文档以确定),那么你必须以完全不同的方式访问它,例如,分别查询两个表并在应用程序中组合数据。我有一个表1,其中有3个字段(ID1-Team1-Team2)…我还有另外一个带有2个字段的表2(ID2-Team3)。。我想随机化这4个字段(ID1-Team1-Team2-Team3),但不是(ID2)。。并在DataGridView1中显示它们..我将编辑我的问题是的,我认为行数不能适应MS Access..如何使用MS Access查询解决此问题请注意,您尚未实际解释您试图执行的操作,我们无法从一些SQL代码中解决此问题。你可以编辑这个问题,也可以发布一个新的问题,并提供一个完整而清晰的解释,说明你想要达到的目标。其次,如果Access中没有与ROW_NUMBER
等效的数据(我不知道有,但你应该检查文档以确定),那么你必须以完全不同的方式访问它,例如,分别查询两个表并在应用程序中组合数据。我有一个表1,其中有3个字段(ID1-Team1-Team2)…我还有另外一个带有2个字段的表2(ID2-Team3)。。我想随机化这4个字段(ID1-Team1-Team2-Team3),但不是(ID2)。。并在DataGridView1中显示它们。我将编辑我的问题请记住Guid.NewGuid()
生成的是Guid
而不是随机值。guid保证是唯一的。它们不能保证是随机的。您确实应该从数据库加载数据,然后使用适当的RNG在内存中随机化结果。请记住Guid.NewGuid()
生成的是Guid
,而不是随机值。guid保证是唯一的。它们不能保证是随机的。您确实应该从数据库加载数据,然后使用适当的RNG在内存中随机化结果。