2013-09-23 49 views
2
填充結構

目的:使用多個select語句填充結構,使用C#和SQLServer2005的一個人如何使用多個SELECT語句

問題:目前我可以填充使用一個select語句的結構,但由於到這個特定的select語句的本質,爲了生成正確的結果,查詢需要被分解,因此我必須使用多個選擇來填充一個結構。這是可能的還是我以錯誤的方式去做?以下是我正在使用的代碼

public static bool GetColumns() 
{ 
    String sql = ""; 

    try 
    { 
     conn.Open(); 

     sql = @"SELECT 
        database.dbo.table1.column1 
       FROM 
        database.dbo.table1; 

       SELECT 
        database.dbo.table2.column2 
       FROM 
        database.dbo.table2; 

       SELECT 
        database.dbo.table3.column3 
       FROM  
        database.dbo.table3 ;" ; 

     SqlCommand cmd = new SqlCommand(sql, conn); 

     SqlDataReader dr = cmd.ExecuteReader(); 

     MyStructure struct1 = new MyStructure(); 

     while (dr.Read()) 
     { 
      struct1.column1 = dr.GetValue(0); 
      struct1.column2 = dr.GetValue(1); 
      struct1.column3 = dr.GetValue(2); 

      MyArrayList.Add(struct1); 
     } 

      dr.Close(); 

      conn.Close(); 

     return true; 
} 

catch (Exception ex) 
{ 
    if (conn.State == ConnectionState.Open) 
     conn.Close(); 

    error.LogError(ex, "", "") 
    return false 
} 

上面的代碼不起作用,因爲我列出的值超出了每個單獨的select語句的範圍。什麼是正確的方法?

+2

Write MyStructure struct1 = new MyStructure();在給它分配值之前,而不是之後。也就是說,在(dr.Read())的同時,把這條線放在下面。 – varocarbas

+0

謝謝,我原來的代碼不是這樣寫的。在 –

+0

上覆制時出錯如果列數爲3(或更多),則您的代碼應該可以工作。也許有一些空值進入:如果dr == null,則設置標題條件跳過。您也可以依靠dr [index]並對目標類型執行Cast。 – varocarbas

回答

3

您的語句將返回多個結果集,如果您使用的是DataReader,那麼您將得到多個結果。使用DataReader.NextResult方法獲取下一個結果集並相應地顯示數據。

如果你不關心DataReader那麼你可以使用DataSet並使用DataAdapater填寫結果在多個DataTables的數據集內。

+0

術語_connection oriented data access_具有誤導性。你是什​​麼意思? 'DataAdapter.Fill'也使用連接和'DataReader'。 –

+0

因此而不是dr.GetValue使用dr.NextResult還是僅在每個相應查詢的GetValue後調用NextResult? –

+0

@TimSchmelter,我的意思是,DataReader將保持連接打開,直到完成讀取。記住它在某處閱讀..可能從這裏http://csharp.net-informations.com/ado.net/ado.net-data-access-architecture.htm – Habib