Я пытаюсь перестроить приложение, которое изначально использовало sqlite, чтобы теперь использовать 'localdb'. (Я хочу приложение, которое может создавать свою собственную базу данных локально и во время выполнения, не требуя предварительно установленного экземпляра sql-сервера или sql-экспресса на целевой машине)Изменения LocalDB сохраняются в разных файлах mdf - Почему?
Я хочу отойти от использования библиотеки сторонних разработчиков (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» уже существует.
Если я закомментировать код создания таблицы она работает, но выберите запрос возвращает несколько строк с указанием нескольких вставок (по одному на каждый раз, когда запускается приложение)
Я просто пытаюсь понять, почему это происходит. Нужно ли мне каждый раз удалять базу данных/таблицу, если я хочу, чтобы приложение вел себя так, как будто оно создало базу данных/таблицу с нуля при каждом последующем запуске?
Казалось, что вы всегда подключен к основной базе данных, а не тот, который вы создали. Поэтому, когда вы создаете таблицу, она создается в master db. –