5

初心者の質問です。実行時にローカル データベース ファイルをプログラムで作成する方法についてアドバイスをお願いできますか。テキストやその他のファイルと同じように、後で Windows エクスプローラーを使用して名前の変更、削除などを行い、他のコンピューターにコピーできるようにしたいと考えています。

これは、Visual Studio Community 15 と C# を使用しており、SQL サーバー Data Tools 14.0.50616.0 がインストールされています。コンピューターには Microsoft SQL Server 2014 があります。

例として、プログラムの余分な部分を削除して、以下のコードを残しました。このコードでは、3 つのボタン ( btnCreateDbbtnDeleteDb、および) とデータベース名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.SqlServerCeSqlCeEngineまたはと入力するときもSqlCecommand、同じ理由であると思います。

Visual Studio では、SQL Server Data ToolsSQL Server Compact & SQLite Toolboxはインストールされた製品として表示されますが、 は表示されませんSQL Server Compact。これを Visual Studio にインストールする必要がありますか。

4

2 に答える 2

0

データベースがアクティブな場合、SQL Server ではデータベースの物理ファイルを削除できません。これを行うことができるのは、データベースが DETACHED の場合だけです (前述のように)。

だから私はあなたが私たちに言っていることがまったく正しくないのではないかと思います??

「データベースの存在を確認する」ロジックを次のように変更します。

select * from sys.databases where name = 'yourdatabasename'

データベースを削除したときに、返される内容を確認するために、とにかくこのクエリを実行します。

于 2016-02-09T14:26:11.760 に答える