【问题标题】:What is the difference between full SQL query and Dataset完整的 SQL 查询和数据集有什么区别
【发布时间】:2013-06-01 13:44:16
【问题描述】:

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

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

【问题讨论】:

  • 除非问题比我读到的更多,否则很明显的一点是 SQL 查询需要的开销要少得多,将工作留给数据库服务器。否则,你把它全部带给客户,工作就在那里。更不用说存储等。但是如果您出于其他原因需要整个表,那么这会完全改变问题。总之......第二个例子对于明显的目标更可取。

标签: c# sql ms-access dataset


【解决方案1】:

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

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

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

数据集是否比使用特定查询更可取?

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在第一个示例中,您请求数据库引擎提供完整的数据表 (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;
      

      【讨论】:

      • Count(*) 传递整个表格?我只需要第一个罚款行。
      • Count(*) 告诉 SQL 返回 id = 123 的记录数。 IE。单个 INTEGER 值。
      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2020-03-22
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多