【问题标题】:C# SQL Random Sample using local database使用本地数据库的 C# SQL 随机样本
【发布时间】:2017-10-08 16:47:00
【问题描述】:

我想知道如何使用 c# 从本地数据库中随机获取 n 个样本

到目前为止我做了什么。

"SELECT TOP "+n+" QUESTION,C1,C2,C3,C4,ANSWER FROM qPIPE WHERE CONTENT = 'Topic' ORDER BY RAND()"

"SELECT QUESTION,C1,C2,C3,C4,ANSWER FROM qPIPE WHERE CONTENT = 'Topic' ORDER BY RAND() LIMIT "+n+""

错误:附加信息:表达式中未定义函数“RAND”。

"SELECT TOP "+n+" QUESTION,C1,C2,C3,C4,ANSWER FROM qPIPE WHERE CONTENT = 'Topic' ORDER BY NEWID()"

附加信息:表达式中未定义函数“NEWID”。

我的连接字符串

ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0DataSource=|DataDirectory|\questionbank.accdb";

但是当我尝试向 MS SQL 查询时

SELECT TOP n QUESTION, C1, C2, C3, C4, ANSWER FROM qPIPE WHERE CONTENT = 'Topic' ORDER BY NEWID()

它工作正常。从具有匹配主题的表中获取 n 个问题。

我正在使用 MVS 2015、MSSMS 2017。正在制作一个获胜表格。

编辑:

using ORDER BY RND()

编辑:

connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            command.CommandText = "SELECT TOP 2 QUESTION,C1,C2,C3,C4,ANSWER FROM qPIPE WHERE CONTENT = 'Thermodynamics' ORDER BY RND()";
            OleDbDataAdapter dAdap = new OleDbDataAdapter(command);
            DataTable dTable = new DataTable();
            dAdap.Fill(dTable);
            dataGridView1.DataSource = dTable;
connection.Close();

【问题讨论】:

标签: c# sql sql-server visual-studio ms-access


【解决方案1】:

在 SQL Server 中,您可以使用NEWID() 函数:

SELECT TOP "+n+" QUESTION,C1,C2,C3,C4,ANSWER
FROM qPIPE
WHERE CONTENT = 'Topic'
ORDER BY NEWID();

在 MS Access 中,您可以使用RND()

SELECT TOP "+n+" QUESTION,C1,C2,C3,C4,ANSWER
FROM qPIPE
WHERE CONTENT = 'Topic'
ORDER BY RND();

【讨论】:

  • 嗨,戈登。我已经试过了。但仍然有错误。但是当我删除 ORDER BY NEWID() 时。我可以选择前 n 个样本。但我想选择 n 个样本。
  • 这个答案对我来说很好(SQL Server)。你的错误是什么?
  • @SaeedEsmaeelinejad OP 连接到 MS Access。而且没有RAND/NEWID函数。
【解决方案2】:

您应该避免连接 SQL 字符串(可能的 SQL 注入)。您可以将n 作为参数传递:

DECLARE @n INT = 5;

SELECT TOP (n) QUESTION, C1, C2, C3, C4, ANSWER
FROM qPIPE
WHERE CONTENT = 'Topic'
ORDER BY NEWID();

编辑:

根据您的连接字符串,我假设您正在连接到 MS Access 数据库。然后你可以使用ORDER BY RND(-(100000*ID)*Time())。基于kobik's comment

【讨论】:

  • 嗨,小伙子。我已将字符串转换为 int。我的问题是使用 newid() 或 rand() 条件。
  • @JepherJohnChang 试试ORDER BY RND()
  • 它忽略了 n 个样本。但选择所有样本。
  • @JepherJohnChang 你使用了TOP 子句吗?
  • 是的。 “SELECT TOP "+n+" QUESTION,C1,C2,C3,C4,ANSWER FROM qPIPE WHERE CONTENT = 'Thermodynamics' ORDER BY RND()”我已经编辑了我的帖子。你可以看到查询的图片。
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 2021-06-16
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多