完整SQL查询和数据集之间有什么区别

时间:2013-06-05 18:14:41

标签: c# sql ms-access dataset

您能解释一下使用数据集和完整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;

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

3 个答案:

答案 0 :(得分:1)

  

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

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

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

  

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

不在你的例子中。您的示例是查找一个特定记录的存在,您不需要DataSet

一般来说,这取决于您的使用情况。如果你想传递数据块而不需要创建类而不是DataSet是一种方便快捷的方法。

答案 1 :(得分:0)

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

实际上,当我因任何原因需要返回几行数据时我已经使用了DataSet,例如你想要返回汽车列表,其中汽车以“A”或类似的东西开头。对于返回单个值的查询,您始终使用ExecuteScalar。

答案 2 :(得分:0)

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

在第二个示例中,您实际上只请求一个值Object。而且重量轻得多,达到了同样的目标。

因此,基于该示例,看起来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;