2014-12-26 2 views
0

Я пытаюсь перестроить приложение, которое изначально использовало 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» уже существует.

Если я закомментировать код создания таблицы она работает, но выберите запрос возвращает несколько строк с указанием нескольких вставок (по одному на каждый раз, когда запускается приложение)

Я просто пытаюсь понять, почему это происходит. Нужно ли мне каждый раз удалять базу данных/таблицу, если я хочу, чтобы приложение вел себя так, как будто оно создало базу данных/таблицу с нуля при каждом последующем запуске?

+1

Казалось, что вы всегда подключен к основной базе данных, а не тот, который вы создали. Поэтому, когда вы создаете таблицу, она создается в master db. –

ответ

2

У вас есть начальный каталог «master» в вашей строке подключения. Вы уверены, что не создали таблицы в основной базе данных вместо недавно созданной базы данных?

После создания & Detach файла базы данных, вы можете попытаться изменить соединение:

SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;Integrated Security=True;AttachDbFilename=c:\xxx\xxx\xxx.mdf"); 
+0

Это было скопировано дословно из другого вопроса переполнения стека. Существует ли «мастер» где-то, кроме файла? Где-то еще в системе? Прости наивный вопрос. – MrVimes

+0

База данных «master» в sqlserver - это системная база данных, содержащая информацию о зарегистрированных базах данных, резервных копиях, запросах, ... –

+0

Я вижу. Если я изменил его с «master» на имя, указанное для базы данных, он затем дал мне сообщение об ошибке входа в систему. Я предполагаю, что * было проще и меньше болеть в заднице, чтобы использовать sqlite. – MrVimes