每次随机查询returns条相同的记录
Random query returns same records each time
我正在使用以下查询从 table、
中获取 select 5 个随机记录
SELECT Top 5 *
FROM (SELECT *,
Rnd(ID) AS RandomValue
FROM Words)
ORDER BY RandomValue
此查询在 MS Access 中运行良好。
但是,当我在 C# 应用程序中使用它时出现了问题。它 returns 每次都有相同的 5 条记录。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
namespace MicrosiftAccessDbProviderFactory______Test
{
public class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Program
{
static void Main(string[] args)
{
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\db1.mdb;Persist Security Info=False";
string providerName = @"System.Data.OleDb";
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
IDbConnection Connection = factory.CreateConnection();
Connection.ConnectionString = connString;
Connection.Open();
IDbTransaction Transaction = Connection.BeginTransaction();
IDbCommand Command = factory.CreateCommand();
Command.Connection = Connection;
Command.Transaction = Transaction;
int count = 5;
Command.CommandText = @"SELECT Top " + count + @" ID, Name
FROM (SELECT *,
Rnd(ID) AS RandomValue
FROM Words)
ORDER BY RandomValue";
IDataReader dataReader = Command.ExecuteReader();
IList<MyClass> list = null;
MyClass item = null;
while (dataReader.Read())
{
if (list == null)
{
list = new List<MyClass>();
}
item = new MyClass();
item.ID = dataReader.GetInt32(0);
item.Name = dataReader.GetString(1);
list.Add(item);
}
dataReader.Close();
Transaction.Commit();
string str = string.Empty;
}
}
}
如何解决这个问题?
这让我很感兴趣。真正让我着迷的是为什么它在 Access 中起作用。我能理解为什么它不适用于 c#:rnd() 始终使用相同的值进行初始化。我的解决方案是丑陋的,但它有效。我希望有人会查看解决方案并了解如何改进它。至少它包含了一个想法的种子,如何使它在 Access 和 c# 之间工作。
第一步。
在 Access 中创建一个与目标 table 相同的 table (WordsGUID),但有一个额外的字段,RandomGUID,设置为数据类型自动编号,字段大小复制 ID。为了更好地衡量,我没有为它编制重复索引,但我怀疑这是否必要。
第 2 步。
在 C# 中插入以下内容
Command.CommandText ="DELETE FROM WordsGUID";
Command.ExecuteNonQuery();
Command.CommandText ="INSERT INTO WordsGUID SELECT * FROM Words";
Command.ExecuteNonQuery();
Command.CommandText ="SELECT TOP 5 * FROM WordsGUID ORDER BY RandomGUID";
IDataReader dataReader = Command.ExecuteReader();
等..
正如我所说的丑陋,如果你有一个大 table,可能会非常慢,但我想不出更好的方法!
您需要 salt Rnd 函数,例如:
SELECT * FROM SomeTable ORDER BY Rnd(-Timer()*[ID])
因此,在您的查询中:
Command.CommandText = @"SELECT Top " + count + @" ID, [Name]
FROM Words
ORDER BY Rnd(-Timer()*[ID])";
我正在使用以下查询从 table、
中获取 select 5 个随机记录SELECT Top 5 *
FROM (SELECT *,
Rnd(ID) AS RandomValue
FROM Words)
ORDER BY RandomValue
此查询在 MS Access 中运行良好。
但是,当我在 C# 应用程序中使用它时出现了问题。它 returns 每次都有相同的 5 条记录。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
namespace MicrosiftAccessDbProviderFactory______Test
{
public class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Program
{
static void Main(string[] args)
{
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\db1.mdb;Persist Security Info=False";
string providerName = @"System.Data.OleDb";
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
IDbConnection Connection = factory.CreateConnection();
Connection.ConnectionString = connString;
Connection.Open();
IDbTransaction Transaction = Connection.BeginTransaction();
IDbCommand Command = factory.CreateCommand();
Command.Connection = Connection;
Command.Transaction = Transaction;
int count = 5;
Command.CommandText = @"SELECT Top " + count + @" ID, Name
FROM (SELECT *,
Rnd(ID) AS RandomValue
FROM Words)
ORDER BY RandomValue";
IDataReader dataReader = Command.ExecuteReader();
IList<MyClass> list = null;
MyClass item = null;
while (dataReader.Read())
{
if (list == null)
{
list = new List<MyClass>();
}
item = new MyClass();
item.ID = dataReader.GetInt32(0);
item.Name = dataReader.GetString(1);
list.Add(item);
}
dataReader.Close();
Transaction.Commit();
string str = string.Empty;
}
}
}
如何解决这个问题?
这让我很感兴趣。真正让我着迷的是为什么它在 Access 中起作用。我能理解为什么它不适用于 c#:rnd() 始终使用相同的值进行初始化。我的解决方案是丑陋的,但它有效。我希望有人会查看解决方案并了解如何改进它。至少它包含了一个想法的种子,如何使它在 Access 和 c# 之间工作。
第一步。
在 Access 中创建一个与目标 table 相同的 table (WordsGUID),但有一个额外的字段,RandomGUID,设置为数据类型自动编号,字段大小复制 ID。为了更好地衡量,我没有为它编制重复索引,但我怀疑这是否必要。
第 2 步。
在 C# 中插入以下内容
Command.CommandText ="DELETE FROM WordsGUID";
Command.ExecuteNonQuery();
Command.CommandText ="INSERT INTO WordsGUID SELECT * FROM Words";
Command.ExecuteNonQuery();
Command.CommandText ="SELECT TOP 5 * FROM WordsGUID ORDER BY RandomGUID";
IDataReader dataReader = Command.ExecuteReader();
等..
正如我所说的丑陋,如果你有一个大 table,可能会非常慢,但我想不出更好的方法!
您需要 salt Rnd 函数,例如:
SELECT * FROM SomeTable ORDER BY Rnd(-Timer()*[ID])
因此,在您的查询中:
Command.CommandText = @"SELECT Top " + count + @" ID, [Name]
FROM Words
ORDER BY Rnd(-Timer()*[ID])";