0

你能解释一下使用数据集和完整的 SQL 查询有什么区别吗?

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Environment.CurrentDirectory + "\\db.accdb");
string cmd = "SELECT * FROM my_table";
conn.Open();
DataSet dset = new DataSet();
OleDbDataAdapter dadapter = new OleDbDataAdapter(cmd, conn);
OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(dadapter);
dadapter.Fill(dset, "my_table");
DataTable table = dset.Tables["my_table"];
foreach (DataRow dr in table.Rows)
    if ((int)dr["id"] == 123)
        return true;
return false;

之间

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Environment.CurrentDirectory + "\\db.accdb");
string cmd = "SELECT 1 FROM my_table WHERE id = 123";
conn.Open();
OleDbCommand command_reader = new OleDbCommand(cmd, conn);
return command_reader.ExecuteScalar() != null;

数据集是否更适合在特定查询中使用?

4

3 回答 3

1

你能解释一下使用数据集和完整的 SQL 查询有什么区别吗?

通常,DataSets 是传递“块”或数据(行和列)的一种方式。使用 a 一次DataReader处理一行查询的结果。是否使用该数据来创建对象集合或其他数据结构取决于您。

在您的示例中,您将整个表拉入应用程序的内存并查找特定记录。在第二个示例中,您正在 SQL 服务器上查找该特定记录,这可能会快得多。

数据集是否更适合使用特定查询?

不在你的例子中。你的例子正在寻找一个特定记录的存在,你不需要一个DataSet

一般来说,这取决于您的使用情况。如果您想传递数据块并且不需要创建类,那么 aDataSet是一种快速完成此操作的便捷方法。

于 2013-06-05T18:20:10.577 回答
0

在您上面的查询中,我永远不会像第一个那样查看是否存在单个记录,因为它效率低下,遍历每个项目更不用说需要过多的代码。

在实践中,当我出于某种原因需要返回多行数据时,我使用了 DataSets,例如,您希望返回汽车以“A”或类似名称开头的汽车列表。对于返回单个值的查询,您总是使用 ExecuteScalar。

于 2013-06-05T18:20:25.750 回答
0

在第一个示例中,您要求数据库引擎提供完整的数据表 ( SELECT * FROM table),然后您会产生处理表、循环记录等的开销。

在第二个示例中,您Object实际上只请求一个值 an 。而且重量要轻得多,并且可以实现相同的目标。

ExecuteScalar因此,根据示例,该路线似乎更可取。

只是,我会这样做:

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + System.Environment.CurrentDirectory + "\\db.accdb");
string cmd = "SELECT Count(*) FROM my_table WHERE id = 123";
conn.Open();
OleDbCommand command_reader = new OleDbCommand(cmd, conn);
Object o = command_reader.ExecuteScalar();
if (o != null && (o is Int32))
    return (Int32)o > 0;
return false;
于 2013-06-05T18:20:56.917 回答