Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 完整SQL查询和数据集之间有什么区别_C#_Sql_Ms Access_Dataset - Fatal编程技术网

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

C# 完整SQL查询和数据集之间有什么区别,c#,sql,ms-access,dataset,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 DataSe

您能解释一下使用数据集和完整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查询之间的区别吗

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

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

数据集是否更倾向于使用特定的查询

不在你的例子中。您的示例正在查找一条特定记录的存在,而您不需要使用
数据集


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

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


在实践中,当出于任何原因需要返回几行数据时,我使用了数据集,例如,您希望返回一个汽车列表,其中汽车以“a”或类似的开头。对于返回单个值的查询,您总是使用ExecuteScalar。

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

在第二个示例中,您只请求一个值,实际上是一个
对象
。这是更轻的重量,实现了同样的目标

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

除非问题比我从中读到的更多,否则显而易见的一点是SQL查询所需的开销要小得多,将工作留给数据库服务器。否则,你把所有的东西都带到客户那里,工作就在那里。更不用说存储等了,但如果您出于其他原因需要整张表,那么问题就完全改变了。总之,第二个例子更适合于明显的目标。通过整个表格的计数(*)?我只需要第一行。
Count(*)
告诉SQL返回
id=123的记录计数。即单个整数值。