2016-02-09 97 views
5

初學者的問題 - 請我可以詢問有關在運行時以編程方式創建本地數據庫文件的建議。我想稍後可以使用Windows資源管理器以與文本和其他文件相同的方式重命名,刪除它們,並將它們複製到其他計算機。使用Visual Studio在運行時創建本地數據庫

這是使用Visual Studio Community 15與C#,安裝SQL Server Data Tools 14.0.50616.0。計算機具有的Microsoft SQL Server 2014

對於我已刪除了我的程序留下下面的代碼,它採用了Windows窗體應用程序有3個按鈕(btnCreateDbbtnDeleteDb,並btnDoesDbExist)和組合框的剩餘部分的示例cbxDb爲數據庫名稱。它使數據庫位於現有文件夾C:\DbTemp中。

它會顯然創建並刪除一個新的數據庫並生成文件,例如mydb1.mdfmydb1.ldf在文件夾中,並聲明它們存在。但是,如果我使用資源管理器刪除這兩個文件,則在嘗試刪除或創建數據庫時會引發異常;和btnDoesDbExist表明它仍然存在。

爲什麼在Windows資源管理器中刪除文件時數據庫仍然顯示存在? btnDoesDatabaseExist下的代碼沒有引用文件的路徑,所以它必須看到別的東西,但是在哪裏?這是程序用戶創建,刪除和檢測這些數據庫的正確方法嗎?

using System; 
using System.Data; 
using System.Windows.Forms; 

//my additions 
using System.Data.SqlClient; 

namespace DataProg15 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public static string form1ConnectionString = "Data Source = (LocalDB)\\MSSQLLocalDB; Integrated Security = True; Connect Timeout = 30; "; 
    private string form1DatabasePath = "C:\\DbTemp"; 

    private void btnCreateDb_Click(object sender, EventArgs e) 
    { 
     string nameToCreate = cbxDb.Text; 
     SqlConnection myConn = new SqlConnection(form1ConnectionString); 

     string str = "CREATE DATABASE " +nameToCreate+ " ON PRIMARY " + 
      "(NAME = " +nameToCreate+ "_Data, " + 
      "FILENAME = '" +form1DatabasePath+ "\\" +nameToCreate+ ".mdf', " + 
      "SIZE = 4MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " + 
      "LOG ON (NAME = " +nameToCreate+ "_Log, " + 
      "FILENAME = '" +form1DatabasePath+ "\\" +nameToCreate+ ".ldf', " + 
      "SIZE = 1MB, " + 
      "MAXSIZE = 5MB, " + 
      "FILEGROWTH = 10%)"; 

     SqlCommand myCommand = new SqlCommand(str, myConn); 

     try 
     { 
      myConn.Open(); 
      myCommand.ExecuteNonQuery(); 
      MessageBox.Show("DataBase '" + nameToCreate + "' was created successfully"); 
     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show("Exception in CreateDatabase " + ex.ToString(), "Exception in CreateDatabase", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
     finally 
     { 
      if (myConn.State == ConnectionState.Open) 
      { 
       myConn.Close(); 
      } 
     } 
    } 


    private void btnDeleteDb_Click(object sender, EventArgs e) 
    { 
     string nameToDelete = cbxDb.Text; 
     string myConnectionString = form1ConnectionString + "AttachDBFileName = " + form1DatabasePath + "\\" + nameToDelete + ".mdf "; 
     string str = "USE MASTER DROP DATABASE " + nameToDelete; 

      SqlConnection myConn = new SqlConnection(myConnectionString); 
      SqlCommand myCommand = new SqlCommand(str, myConn); 
      myConn.Open(); 

      try 
      { 
       myCommand.ExecuteNonQuery(); 
       MessageBox.Show("DataBase '" + nameToDelete + "' was deleted successfully"); 

      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show(ex.ToString(), "Exception in DeleteDatabase '" +nameToDelete+ "'", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      finally 
      { 
       if (myConn.State == ConnectionState.Open) 
       { 
        myConn.Close(); 
       } 
      } 
    } 

    private void btnDoesDbExist_Click(object sender, EventArgs e) 
    { 
     string nameToTest = cbxDb.Text; 
     using (var connection = new SqlConnection(form1ConnectionString)) 
     { 
      using (var command = new SqlCommand(string.Format(
        "SELECT db_id('" +nameToTest+ "')", nameToTest), connection)) 
      { 
       connection.Open(); 

       if ((command.ExecuteScalar() != DBNull.Value)) 
       { 
        MessageBox.Show("DataBase '" +nameToTest+ "' exists"); 
       } 
       else 
       { 
        MessageBox.Show("Database '" +nameToTest+ "' does not exist"); 
       } 
      } 
     } 

    } 
} 

}

感謝所有的回覆,你的麻煩是極大的讚賞。

我現在明白我正在使用錯誤的數據庫,所以我嘗試使用SQL Server Compact來代替。已經卸載,再次下載,並重新安裝SQL Server Compact,包括SP1。也從https://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1下載並安裝了SQL Server Compact/SQLite Toolbox。但是,當我輸入using System.Data.SqlServerCe時,Visual Studio始終顯示錯誤。當我輸入SqlCeEngineSqlCecommand時,我也出於同樣的原因。

在Visual Studio中,SQL Server Data ToolsSQL Server Compact & SQLite Toolbox顯示爲已安裝的產品,但未顯示爲SQL Server Compact。我是否需要將它安裝到Visual Studio中?如果是這樣,它是如何完成的?

+0

您不應該與數據文件交互。如果你真的想做這樣的事情,你必須使用'detach'和'attach'。此時,您的localdb sqlserver知道數據庫,但無法找到數據文件。 –

+0

這可能會在你的場景中矯枉過正,但是你有沒有考慮過使用[Code-First Entity Framework Migrations](https://msdn.microsoft.com/en-gb/data/jj591621.aspx)? –

+1

Sql Server是一個複雜的系統。當你創建一個數據庫時,你不需要添加幾個文件名,而是添加大量的系統和配置信息。這些信息存儲在內部數據庫(模型,主人,臨時等)中。使用Windows資源管理器刪除這些文件使Sql Server安裝處於不穩定狀態,因爲內部信息仍然存在,但文件仍在。如果您需要這種自由,請選擇不同的數據庫系統(基於文件的文件),如SQLite,Sql Server Compact甚至MS-Access。 – Steve

回答

0

如果該數據庫處於活動狀態,SQL Server不會讓您刪除數據庫的物理文件 - EVER。唯一你能做到這一點的是,如果數據庫是DETACHED(如前所述)

所以我懷疑你告訴我們的東西不是很正確?

我會改變你的「檢查數據庫存在」的邏輯是;

SELECT * FROM其中名稱=「yourdatabasename」

我就當你已經刪除了你的數據庫,只是爲了看看它返回反正運行此查詢sys.databases中。

+0

謝謝。回覆和進一步閱讀建議我應該只使用本地文件中存在的數據庫,所以我試圖使用'SQL Server Compact'來代替,但仍然有困難,如上面的編輯中所述。 – egginstone

2

Solution ExplorerReferences,檢查是否列出了System.Data.SqlServerCe。如果沒有,請右鍵點擊References,然後點擊Add ReferenceBrowse按鈕並選擇文件System.Data.SqlServerCe.dll,可能在C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\DesktopSystem.Data.SqlServerCe現在應該出現在References之下。

下面的程序似乎工作,而且更簡單。感謝所有的幫助。

using System; 
using System.Data; 
using System.Windows.Forms; 
//my additions 
using System.Data.SqlServerCe; 
using System.IO; 

namespace DataProg15 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public static string form1DatabasePath = "C:\\DbTemp\\dbtemp1.sdf"; 
     public static string form1ConnectionString = "Data Source = " +form1DatabasePath; 

     private void btnCreateDb_Click(object sender, EventArgs e) 
     { 
       SqlCeEngine engine = new SqlCeEngine(form1ConnectionString); 
      try 
      { 
       engine.CreateDatabase(); 
       MessageBox.Show("DataBase '" +form1DatabasePath+ "' was created successfully"); 
      } 
      catch (System.Exception ex) 
      { 
       MessageBox.Show("Exception in CreateDatabase " + ex.ToString(), "Exception in CreateDatabase", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      finally 
      { 
       engine.Dispose(); 
      } 
     } 

     private void btnDeleteDb_Click(object sender, EventArgs e) 
     { 
      if (File.Exists(form1DatabasePath)) 
      { 
       try 
       { 
        File.Delete(form1DatabasePath); 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' was deleted successfully"); 
       } 
       catch (System.Exception ex) 
       { 
        MessageBox.Show(ex.ToString(), "Exception in DeleteDatabase '" +form1DatabasePath+ "'", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
      } 
     } 

     private void btnDoesDbExist_Click(object sender, EventArgs e) 
     { 
      if (File.Exists(form1DatabasePath)) 
      { 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' exists"); 
      } 
      else 
      { 
        MessageBox.Show("DataBase '" +form1DatabasePath+ "' does not exist"); 
      } 
     } 
    } 
} 
相關問題