2013-06-05 29 views
0

可以解釋一下使用數據集和完整SQL查詢有何區別?完整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; 

之間是數據集,更優選在特定的查詢使用?

+1

除非有更多比我讀出它的問題,很明顯的一點是,SQL查詢需要更少的開銷,離開工作到數據庫服務器。否則,你把這一切都交給客戶,工作就在那裏。更不用說存儲等等了。但是如果你需要整個表格是出於其他原因,那麼這完全改變了這個問題。總之...第二個例子對於明顯的目標是可取的。 – DonBoitnott

回答

1

燦是你解釋什麼是使用DataSet和完整的SQL查詢之間的區別?

一般來說,DataSet是一種傳遞「塊」或數據(行和列)的方法。使用DataReader一次處理一行查詢的結果。您是否使用該數據來創建對象集合或其他數據結構取決於您。

在你的榜樣,你是拉整個表到應用程序的meory,尋找特定的記錄。在第二個示例中,您正在尋找SQL服務器上的特定記錄,這可能會更快。

而且是數據集更優選地使用特定的查詢?

不是在你的榜樣。你的例子是尋找一個特定記錄的存在,你不需要DataSet

一般情況下,這取決於您的使用情況。如果你想傳遞數據塊並且不需要創建類而不是創建類,那麼可以很快實現這一點。

0

在上面的查詢中,我從來沒有想過看到一個記錄是否以第一個記錄的方式存在,因爲它會效率低下,遍歷每個項目,更不用說需要過多的代碼。

在實踐中,當我需要返回幾行數據時,無論出於何種原因,例如要返回汽車以'A'或類似的東西開始的列表。對於返回單個值的查詢,您總是使用ExecuteScalar。

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; 
+0

通過整個表的計數(*)?我只需要第一個罰款行。 – phpnuker

+0

'Count(*)'告訴SQL返回「id = 123」的記錄數。即一個單一的INTEGER值。 – DonBoitnott