2012-11-20 75 views
1

我想教自己的C#,並已發現連接到MSSQL數據庫的各種示例。我所做的似乎是最簡單的方法,但似乎仍然過於複雜。簡化了數據庫連接 - 是嗎?

有沒有更好的方法?

這裏是我的代碼:

static void dbcon() 
{ 
    List<int> familyID = new List<int>(); 
    String connString = "Server=[myServer]\\[myInstance];Database=[dbName];User Id=[userID};Password=[password];"; 
    using (var sqlconn = new SqlConnection(connString)) 
    { 
     using (var cmd = sqlconn.CreateCommand()) 
     { 
      try 
      { 
       sqlconn.Open(); 
       cmd.CommandText = "SELECT id FROM family"; 
       using (var reader = cmd.ExecuteReader()) 
       { 

        while (reader.Read()) 
        { 
         familyID.Add(Convert.ToInt32(reader["id"].ToString())); 
        } 
       } 
       foreach (int tempy in familyID) 
       { 
        Console.WriteLine("id: " + tempy); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
      }     
     } 
    } 
} 
+0

除非你可以做一些你'catch'子句中更有用,我建議刪除它。讓異常傳播到最高層通常要好得多 - 特別是對於一般的「Exception」,這可能是任何事情。如果你不抓住它,那麼a)你的過程將終止(這很好,因爲你*不知道發生了什麼錯誤),b)幫助者應該爲你顯示一個完整的堆棧跟蹤你可以看到錯誤發生在哪裏等) –

回答

2

這是罰款,只有運行一個SQL語句的應用程序,但你不想使用所有的代碼每次你想要新的數據的時間。

你想要做的是將處理結果的代碼與創建連接的代碼(從獲取並運行sql的代碼)中分離出來。

這樣,連接代碼(以及可能的數據顯示代碼)可以被編寫一次,並且每次您想要執行不同的sql時都會調用,並且您只需專心於如何編寫獲取數據的代碼想。

心連心

+0

感謝您的提示!現在不要脫離主題,但在您的示例中爲 ,您是否將數據庫連接保留爲在整個運行時間中「永久」打開?我認爲我對垃圾收集的「USING()」的理解不夠好。 我在想,命令和讀者必須被封裝在使用(連接),所以連接可用於其他人。 – CodingForFunAndProfit

+1

關閉連接,尤其是在獲取和更新數據之間需要一段時間。通常你會打開連接,獲取數據並關閉連接。然後打開另一個連接,插入/更新數據,並進行任何更改並再次關閉。這樣其他用戶可以同時使用數據庫。 – mcalex

0

詳情:所有的首先歡迎您計算器。以下只是一些提示

讓您的連接字符串硬編碼就像是不好的做法。你應該總是把它放在你的App.config中(或者Web.config,如果它是一個web應用程序的話)。原因是因爲如果你有硬編碼並且你的老闆要求你改變應用程序數據庫連接字符串,你將需要重新編譯整個應用程序。如果你有一個App.config文件,你只需要改變它(用記事本打開它)並保存它。

如何將它添加到的app.config例

<configuration> 
    <connectionStrings> 
     <add name="myConnectionString" 
      connectionString="Data Source=localhost;Initial Catalog=MySQLServerDB; 
      Integrated Security=true" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

然後訪問它在你的代碼(你將需要添加到System.Configuration的引用,也可以添加使用System.Configuration; )

string connString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString; 

在問候你的其他代碼我會改變你的異常捕獲首先包括SQL異常,然後回落到任何其他異常。

catch (SqlException ex) 
    { 
     // Handle the Sql Exception code 
    } 
    catch (Exception ex) 
    { 
     // Handle the Normal Exception code 
    } 
+0

嗯,他們使用'using'語句 - 連接會自動關閉(因爲''使用'實際上是一個'try/finally',無論如何,'finally'中調用Dispose()',連接,'Close()'和'Dispose()'是同義詞) –

+0

@Damien_The_Unbeliever,感謝您挑選它!我會改變我的答案以反映這一點。 – MVCKarl

0

中包含的文檔爲SqlConnectionStringBuilder例子是很容易跟蹤和了解作爲一種替代方式。

System.Data.SqlClient.SqlConnectionStringBuilder builder = 
    new System.Data.SqlClient.SqlConnectionStringBuilder(); 
builder["Data Source"] = "(local)"; 
builder["integrated Security"] = true; 
builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad"; 
Console.WriteLine(builder.ConnectionString); 

編輯:

其實,我上面複製的例子說明你的SqlConnectionStringBuilder類「以安全的方式......無效值」是如何處理的。哎呦。至少它讓你瞭解它是如何工作的。

有關獲取,存儲和ADO.NET中構建連接字符串的各種方法的詳細信息,看MSDN documentation on Connection Strings