2013-05-31 40 views
2

說我有從我的數據庫中檢索行,並將其寫入到一個變量(htmlSQLDataReader字段順序很重要嗎?

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.ConnectionString = ConfigurationManager.ConnectionStrings["connection_string"].ConnectionString; 
    SqlCommand cmd = new SqlCommand("SELECT * FROM Table WHERE order_id = @id", conn); 
    cmd.Parameters.Add("id", SqlDbType.Int).Value = Request.QueryString["id"]; 
    conn.Open(); 
    SqlDataReader sdr = cmd.ExecuteReader(); 
    while (sdr.Read()) 
    {     
     html += sdr.IsDBNull(2) ? "" : sdr.GetString(2); 
     html += sdr.IsDBNull(1) ? 0 : sdr.GetInt32(1); 
     html += sdr.IsDBNull(4) ? 0 : sdr.GetInt32(4); 
     html += sdr.IsDBNull(3) ? "" : sdr.GetString(3); 
     html += sdr.IsDBNull(0) ? 0 : sdr.GetInt32(0); 
    } 
} 

讓我們假設我需要他們在確切的順序輸出的代碼塊 - 2,1,4,3, 0.我應該這樣做嗎?

while (sdr.Read()) 
{   
    html += string.Format("{2}{1}{4}{3}{0}", 
     sdr.IsDBNull(0) ? 0 : sdr.GetInt32(0), 
     sdr.IsDBNull(1) ? 0 : sdr.GetInt32(1), 
     sdr.IsDBNull(2) ? "" : sdr.GetString(2), 
     sdr.IsDBNull(3) ? "" : sdr.GetString(3), 
     sdr.IsDBNull(4) ? 0 : sdr.GetInt32(4) 
    ); 
} 

由於SQLDataReader以正確的順序讀取它們,第二種方法會更有效嗎?

+5

簡答:不,沒關係。做什麼是最易讀,最不容易出錯的。但是你不應該寫'SELECT * FROM',而是'SELECT col1,col2,col3,... FROM'。 –

+1

我個人不會擔心表現,除非它太慢。我會使用列名使其更具可讀性。另外考慮使用StringBuilder而不是簡化字符串,因爲這可以更快。 –

+0

我通常使用列名稱,但這只是一個例子,所以我不能打擾他們=)出於興趣,如果您仍然檢索所有列,是否在指定列名稱方面有性能優勢? – roryok

回答

1

沒有順序無關緊要。您可以按照您喜歡的任何順序訪問它們。你已經有了兩個測試用例,你可以自己測試一下。與在互聯網上聽隨機陌生人一起檢查自己總是更好。

0

我應該這樣做嗎?

當然可以。 SqlDataReader不會強制您按照其順序讀取行。你可以使用他們任何你想要的順序。

請問第二種方法更有效,因爲SqlDataReader的 以正確的順序讀取它們?

我不認爲這很重要。 SqlDataReader不會讀取前四行爲只讀第5行。所以它們之間沒有性能問題。 使用它們哪一個更適合你。

如Tim suggest,您可以在您的select語句中使用列名,以便在您有很多列時特別容易理解。

如果您是 ,仍然檢索所有列,那麼在指定列名時是否有性能優勢?

SELECT * FROMSELECT col1,col2,col3, col4, col5 FROM之間沒有性能優勢,他們是相當相當的。 (我假設你的表中只有5列)

相關問題