Создание локальной базы данных во время выполнения с помощью 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'
Я бы запустил этот запрос в любом случае, когда вы удалили базу данных, просто чтобы посмотреть, что она возвращает.