初心者の質問です。実行時にローカル データベース ファイルをプログラムで作成する方法についてアドバイスをお願いできますか。テキストやその他のファイルと同じように、後で Windows エクスプローラーを使用して名前の変更、削除などを行い、他のコンピューターにコピーできるようにしたいと考えています。
これは、Visual Studio Community 15 と C# を使用しており、SQL サーバー Data Tools 14.0.50616.0 がインストールされています。コンピューターには Microsoft SQL Server 2014 があります。
例として、プログラムの余分な部分を削除して、以下のコードを残しました。このコードでは、3 つのボタン ( btnCreateDb
、btnDeleteDb
、および) とデータベース名btnDoesDbExist
のコンボボックスを使用する Windows フォーム アプリケーションを使用しています。cbxDb
既存のフォルダにデータベースを作成しますC:\DbTemp
。
どうやら、新しいデータベースを作成および削除し、たとえば、フォルダー内にファイルを作成し、mydb1.mdf
それらmydb1.ldf
が存在することを示します。ただし、エクスプローラーを使用して 2 つのファイルを削除すると、データベースを削除または作成しようとすると例外がスローされます。そして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
ました。からもダウンロードしてインストールSQL Server Compact/SQLite Toolbox
しましhttps://visualstudiogallery.msdn.microsoft.com/0e313dfd-be80-4afb-b5e9-6e74d369f7a1
た。しかし、入力すると、Visual Studio でエラーが表示されますusing System.Data.SqlServerCe
。SqlCeEngine
またはと入力するときもSqlCecommand
、同じ理由であると思います。
Visual Studio では、SQL Server Data Tools
とSQL Server Compact & SQLite Toolbox
はインストールされた製品として表示されますが、 は表示されませんSQL Server Compact
。これを Visual Studio にインストールする必要がありますか。