Я пытаюсь перестроить приложение, которое изначально использовало sqlite, чтобы теперь использовать «localdb». (Мне нужно приложение, которое может создавать свою собственную базу данных локально и во время выполнения, не требуя предварительно установленного экземпляра SQL Server или SQL Express на целевой машине)
Я хочу отказаться от использования «сторонней» библиотеки (sqlite), поскольку опыт подсказывает мне, что заставить ее работать с нуля может быть сложно, и перейти к чему-то предположительно более простому, чтобы начать работу с нуля.
Используя код, скопированный (и слегка измененный) из Интернета, мне удалось создать файл mdf динамически/программно, но я озадачен тем, что произойдет, если я запущу его более одного раза, даже если я каждый раз выбираю новое имя файла. А именно, похоже, каким-то образом сохраняются изменения/дополнения, сделанные при каждом запуске. Ниже приведен соответствующий код...
public partial class Form1 : Form
{
SqlConnection conn;
public void CreateSqlDatabase(string filename)
{
string databaseName =
System.IO.Path.GetFileNameWithoutExtension(filename);
conn = new SqlConnection(
String.Format(
@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"
));
conn.Open();
using (var command = conn.CreateCommand())
{
command.CommandText =
String.Format(
"CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')"
, databaseName, filename);
command.ExecuteNonQuery();
command.CommandText =
String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName);
command.ExecuteNonQuery();
}
conn.Close();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
CreateSqlDatabase(openFileDialog1.FileName);
}
}
private void button2_Click(object sender, EventArgs e)
{
conn.Open();
SqlCommand comm = conn.CreateCommand();
comm.CommandText =
"create table mytable (id int, name nvarchar(100))";
comm.ExecuteNonQuery();
comm.CommandText =
"insert into mytable (id,name) values (10,'testing')";
comm.ExecuteNonQuery();
comm.CommandText = "select * from mytable";
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
textBox1.Text +=
reader["id"].ToString() + ", " + reader["name"].ToString() + "\r\n";
}
conn.Close();
}
}
Если я запускаю приложение один раз, оно работает нормально.
Если я запускаю приложение во второй раз и выбираю другое имя файла для базы данных, оно сообщает мне, что «mytable» уже существует.
Если я закомментирую код создания таблицы, он запустится, но запрос на выборку вернет несколько строк, указывающих на несколько вставок (по одной при каждом запуске приложения)
Я просто пытаюсь понять, почему это происходит. Нужно ли мне каждый раз удалять базу данных/таблицу, если я хочу, чтобы приложение вело себя так, как если бы оно создавало базу данных/таблицу с нуля при каждом последующем запуске?