初學者的問題 - 請我可以詢問有關在運行時以編程方式創建本地數據庫文件的建議。我想稍後可以使用Windows資源管理器以與文本和其他文件相同的方式重命名,刪除它們,並將它們複製到其他計算機。使用Visual Studio在運行時創建本地數據庫
這是使用Visual Studio Community 15與C#,安裝SQL Server Data Tools 14.0.50616.0。計算機具有的Microsoft SQL Server 2014
對於我已刪除了我的程序留下下面的代碼,它採用了Windows窗體應用程序有3個按鈕(btnCreateDb
,btnDeleteDb
,並btnDoesDbExist
)和組合框的剩餘部分的示例cbxDb
爲數據庫名稱。它使數據庫位於現有文件夾C:\DbTemp
中。
它會顯然創建並刪除一個新的數據庫並生成文件,例如mydb1.mdf
和mydb1.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始終顯示錯誤。當我輸入SqlCeEngine
或SqlCecommand
時,我也出於同樣的原因。
在Visual Studio中,SQL Server Data Tools
和SQL Server Compact & SQLite Toolbox
顯示爲已安裝的產品,但未顯示爲SQL Server Compact
。我是否需要將它安裝到Visual Studio中?如果是這樣,它是如何完成的?
您不應該與數據文件交互。如果你真的想做這樣的事情,你必須使用'detach'和'attach'。此時,您的localdb sqlserver知道數據庫,但無法找到數據文件。 –
這可能會在你的場景中矯枉過正,但是你有沒有考慮過使用[Code-First Entity Framework Migrations](https://msdn.microsoft.com/en-gb/data/jj591621.aspx)? –
Sql Server是一個複雜的系統。當你創建一個數據庫時,你不需要添加幾個文件名,而是添加大量的系統和配置信息。這些信息存儲在內部數據庫(模型,主人,臨時等)中。使用Windows資源管理器刪除這些文件使Sql Server安裝處於不穩定狀態,因爲內部信息仍然存在,但文件仍在。如果您需要這種自由,請選擇不同的數據庫系統(基於文件的文件),如SQLite,Sql Server Compact甚至MS-Access。 – Steve