Создание локальной базы данных во время выполнения с помощью Visual Studio

Вопрос новичка - могу ли я попросить совета по программному созданию файлов локальной базы данных во время выполнения. Я хочу иметь возможность позже переименовывать, удалять их и т. Д. С помощью проводника Windows так же, как для текстовых и других файлов, и копировать их на другие компьютеры.

Это использует Visual Studio Community 15 с C#, установлен SQL Server Data Tools 14.0.50616.0. На компьютере установлен Microsoft SQL Server 2014.

Например, я удалил лишние части своей программы, чтобы оставить приведенный ниже код, который использует приложение Windows Form с 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, Также скачали и установили 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, и если да, то как это сделать?

2 ответа

В Solution Explorer под References, Проверь это System.Data.SqlServerCe в списке. Если нет, щелкните правой кнопкой мыши на References затем Add Reference -> Browse кнопку и выберите файл System.Data.SqlServerCe.dllвероятно в C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop, System.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");
            }
        }
    }
}

SQL Server не позволит вам удалить физические файлы базы данных, если эта база данных активна - НИКОГДА. Единственное, что вы когда-либо сможете сделать это, если база данных ОТКЛЮЧЕНА (как упоминалось ранее)

Так что я подозреваю, что вы говорите нам не совсем правильно??

Я бы изменил вашу логику проверки базы данных на;

выберите * из sys.database, где name = 'yourdatabasename'

Я бы запустил этот запрос в любом случае, когда вы удалили базу данных, просто чтобы посмотреть, что она возвращает.

Другие вопросы по тегам