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

0

最初の例では、データベース エンジンがデータの完全なテーブルを提供するように要求し ( SELECT * FROM table)、テーブルの処理、レコードのループなどのオーバーヘッドが発生します。

2 番目の例ではObject、実際には 1 つの値のみを要求しています。そして、それははるかに軽量であり、同じ目標を達成します.

したがって、例に基づいて、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 に答える