初学者提问 - 请问如何在运行时编程创建本地数据库文件?我希望稍后能够像文本和其他文件一样使用Windows资源管理器对它们进行重命名、删除等操作,并将它们复制到其他计算机上。
我使用的是Visual Studio Community 15和C#,安装了SQL Server Data Tools 14.0.50616.0。计算机上有Microsoft SQL Server 2014。
以下是一个示例程序,只保留了其中与问题相关的代码。它使用一个带有3个按钮(btnCreateDb、btnDeleteDb和btnDoesDbExist)和一个名为cbxDb的组合框来指定数据库名称的Windows窗体应用程序。它会在现有文件夹C:\DbTemp中创建数据库。
它似乎可以创建和删除新的数据库并生成文件,例如mydb1.mdf和mydb1.ldf,然后显示它们存在。但是,如果我使用资源管理器删除这两个文件,则尝试删除或创建数据库时会引发异常;而btnDoesDbExist将显示它仍然存在。
为什么在Windows资源管理器中删除文件后,数据库仍然存在?btnDoesDatabaseExist下的代码没有引用文件路径,所以它必须看到了其他内容,但是在哪里呢?这是程序用户创建、删除和检测这些数据库的正确方法吗?
我使用的是Visual Studio Community 15和C#,安装了SQL Server Data Tools 14.0.50616.0。计算机上有Microsoft SQL Server 2014。
以下是一个示例程序,只保留了其中与问题相关的代码。它使用一个带有3个按钮(btnCreateDb、btnDeleteDb和btnDoesDbExist)和一个名为cbxDb的组合框来指定数据库名称的Windows窗体应用程序。它会在现有文件夹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 中吗?如果需要,如何进行安装?
SQL Server Compact
,但正如上文所述,遇到了一些困难。 - egginstone