2013-10-31 27 views
0

我正在努力運行一個SELECT語句,該SELECT語句將多個值返回到我的應用程序中的兩個不同標籤。執行選擇多個列並分配給標籤

這個想法是能夠從數據庫中獲取一些版本信息,通過在數據庫中選擇一個選擇,我得到的代碼工作,但我知道這是超級馬虎,我只是不知道如何清理它。我知道必須有比我在這裏進行的更好的方式。

// Update Version & Version2   
     string sqlCom1 = String.Format(@"SELECT [Version] 
              FROM ConfigSystem"); 
     string sqlCom = String.Format(@"SELECT Version2 
              FROM ConfigSystem"); 

     SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder(); 
     ConnectionString.DataSource = "SQL06"; 
     ConnectionString.InitialCatalog = "SuperSweetDB"; 
     ConnectionString.IntegratedSecurity = true; 

     SqlConnection cnn; 
     cnn = new SqlConnection(ConnectionString.ToString()); 


     using (var version = new SqlCommand(sqlCom1, cnn)) 
     { 
      cnn.Open(); 
      label.Text = (string)version.ExecuteScalar(); 
      cnn.Close(); 
     }; 
     using (var version = new SqlCommand(sqlCom, cnn)) 
     { 
      cnn.Open(); 
      label2.Text = (string)version.ExecuteScalar(); 
     }; 

認爲,我不肯定的,那我開到連接來獲得,我可以很容易地在SQL得到一個數據。它返回到有價值的數據列的問題,我一直無法在Google中找到如何處理這個問題。 (我可能找錯了東西)

我只是這樣做,因爲我真的需要它的工作,現在我試圖清理一切。

剛剛起來,相當新的C#或任何不是SQL。

任何幫助表示讚賞,如果這是一個重複的問題,我很抱歉。

+0

看看這個-http://stackoverflow.com/questions/5877584/multiple-sql-queries-asp-net-c-sharp和http://msdn.microsoft.com/en-us/library /system.data.sqlclient.sqlconnection.aspx – Blake

+0

這看起來很有前途,謝謝。 –

回答

0

這裏是我想出了萬一有人需要幫助這個在以後的答案:

string sqlCom = String.Format(@"SELECT [Version],version2 FROM ConfigSystem"); 
     SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder(); 
     ConnectionString.DataSource = SQL06; 
     ConnectionString.InitialCatalog = "SuperSweetdb"; 
     ConnectionString.IntegratedSecurity = true; 

     SqlConnection cnn = new SqlConnection(ConnectionString.ToString()); 

     using (var version = new SqlCommand(sqlCom, cnn)) 
     {   
      cnn.Open(); 

      using(IDataReader dataReader = version.ExecuteReader()) 
      { 
       while (dataReader.Read()) 
       { 
        label7.Text = dataReader["Version"].ToString(); 
        label9.Text = dataReader["VertexDataVersion"].ToString(); 
       } 
      } 

     }; 

最後我做什麼是它分解與DataReader的。這是一個很難弄清楚,需要大量修補,但最終它是一個更清潔的連接,在我之前。

基本上DataReader是我正在尋找。

下面是一些鏈接,幫助了相當E位置:Invalid attempt to read when no data is present

除了這一點:Multiple SQL queries asp.net c#

希望任何人誰也有類似的問題,就能從這個得到一些幫助。

0

你只能一次創建的SqlCommand和重用 - 你可以動態設置命令:

using (var version = new SqlCommand()) 
{ 
    version.CommandType = CommandType.Text; 
    version.Connection = cnn; 

    cnn.Open(); 
    version.CommandText = sqlCom1; 
    label.Text = (string)version.ExecuteScalar(); 

    version.CommandText = sqlCom2; 
    label2.Text = (string)version.ExecuteScalar(); 
    cnn.Close(); 
}; 

有官方SqlCommand class documentation at MSDN很多例子。

1

您可以用1個字符串變量中的分號分隔2個SQL語句,然後使用SqlDataReader上的NextResult()方法獲取多個結果集。

我更新了你的代碼來工作。見下文。注意,在代碼執行後,使用關鍵字的使用會自動處理掉資源。我使用2個sql語句中的變量構建的SQL Server測試了代碼,這些語句被評論。

您應該可以將以下代碼粘貼到控制檯應用程序中併成功運行它。

using System; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Text; 

namespace SqlMultipleResultsets 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     SqlConnectionStringBuilder ConnectionString = new SqlConnectionStringBuilder(); 
     ConnectionString.DataSource = "SQL06"; 
     ConnectionString.InitialCatalog = "SuperSweetDB"; 

     //ConnectionString.DataSource = "(localdb)\\Projects"; 
     //ConnectionString.InitialCatalog = "tempdb"; 

     ConnectionString.IntegratedSecurity = true; 

     string sqlSelect = @"SELECT [Version] FROM ConfigSystem;" + 
          @"SELECT Version2 FROM ConfigSystem"; 

     // string sqlSelect = @"SELECT [Version] = @@VERSION;" 
     //     + @"SELECT Version2 = @@LANGUAGE;" ; 

      int recordCount; 

      using (SqlConnection cnn = new SqlConnection(ConnectionString.ToString())) 
      { 
       using (SqlCommand command = new SqlCommand(sqlSelect, cnn)) 
       { 
        cnn.Open(); 
        SqlDataReader dr = command.ExecuteReader(); 

        recordCount = 0; 
        do 
        { 
         Console.WriteLine("Result set: {0}", ++recordCount); 
         while (dr.Read()) 
         { 
          Console.WriteLine("Version: {0}", dr[0]); 
         } 
         Console.WriteLine(Environment.NewLine); 
        } 
        while (dr.NextResult());      
       } // END command 
      } // END connection 
      Console.Write("Press a key to exit..."); 
      Console.ReadKey(); 
     } // END Main 
    } 
} 
+0

這可能是最接近的答案,但唯一的區別是,這可能是我的錯,就是我期望讓1選1而不是2。我應該澄清,但你的答案確實幫了我一些忙。非常感謝你。 –

+0

@MitchellHamann很高興幫助。如果你正在尋找1個SELECT而不是2個,這裏有1種方法。將sqlSelect字符串更改爲如下所示。 string sqlSelect = @「SELECT Title ='Version',Value = [Version] FROM ConfigSystem」+ @「UNION」+ @「SELECT Title ='Version2',Value = Version2 FROM ConfigSystem」; 這會給你2行,2列,第1列分別包含單詞「Version」和「Version2」,第2列包含實際值。希望這可以幫助! --Shiva – Shiva