2016-05-25 37 views
0

這裏是我的代碼,它的工作方式在數據庫具有表「UserInformation」怎樣才能在數據庫中創建了新的表,如果該表並不存在(C#)

public bool Save() 
{ 
     using (SqlConnection connection = new SqlConnection(ConnectionString) 
     { 
      connection.Open(); 

      using (SqlTransaction transaction = connection.BeginTransaction()) 
      { 
       try 
       { 
        using (var adapter = new UserInformationTableAdapter()) 
        { 
         adapter.Connection = connection; 
         adapter.Transaction = transaction; 

         var table = new HelloDataSet.UserInformationDataTable(); 
         HelloDataSet.UserInformationRow row = table.NewUserInformationRow(); 
         row.UserName = userName; 
         row.Password = password; 
         row.Brithday = brithday; 
         table.Rows.Add(row); 
         adapter.Update(table); 

         transaction.Commit(); 
         return true; 
        } 
       } 
       catch (Exception e) 
       { 
        transaction.Rollback(); 
        return false; 
       } 
       finally 
       { 
        connection.Close(); 
       } 
      } 
} 

然而,當沒有表在數據庫中,它不會在數據庫中創建「UserInformation」表,它會跳轉到「adapter.Update(table);」行中的「catch」異常。

所以我的問題是如何在數據庫中創建一個新的表,如果它沒有「UserInformation」表。另外,如果數據庫已經有表「UserInformation」,我可以在該表中添加一個新的「Position」列嗎?

+0

我不確定你在問什麼。你是否試圖將行插入可能不存在的表中?如果表不存在,是否希望數據庫服務器自動創建具有特定字段結構的表? (爲什麼表不在那裏?)我建議使用CREATE TABLE命令或使用交互式工具(如SQL Server Management Studio)創建表。另外,你沒有提到你正在使用什麼樣的數據庫。相應地標記這個問題將提高答案的相關性。 –

+0

我希望數據庫服務器自動創建表。原因是,我將允許用戶選擇數據庫,因此如果用戶切換到新數據庫,我的應用程序應該能夠在新數據庫中創建該表。 –

+1

您將不得不創建您的程序執行的腳本或一系列SQL語句。存儲過程或觸發器已關閉,因爲如果數據庫是新的,它將不會有表或任何代碼來創建表。我會檢查一個表的存在,然後詢問用戶「初始化表(應用程序名稱)?」如果用戶說是,請運行您的腳本或「CREATE TABLE」SQL語句集。 –

回答

0

最後,我得到了答案,並希望分享它。首先,我必須說我錯誤地提出了我的問題。我真正想要的是我有一個應用程序,這個應用程序連接到一個數據庫。但是,我允許用戶切換數據庫。因此,當用戶切換到新數據庫時,我希望應用程序將整個數據庫結構(不包括數據)從舊數據庫複製到新數據庫。另外,如果我在應用程序代碼中對數據庫進行了一些更改(可以爲一個或多個表添加新列,或者添加另一個新表),我希望每個其他數據庫都知道更新並通過運行進行相同的更改我的新應用程序代碼。


所以,這裏是我的解決方案。我寫了一個名爲「SchemaManager」的框架。它將在每個數據庫中創建一個附加表,該表包含數據庫的版本。因此,每次運行我的應用程序時,「SchemaManager」都會檢查我的硬代碼數據庫版本號與數據庫版本號,如果我的硬代碼數據庫版本號大於數據庫版本號,「SchemaManager」將檢查更改併爲我做更新。


我知道我的解決方案不是最好的,但這就是我所做的。如果有人有其他解決方案,請與我和其他人分享。

相關問題