LocalDB更改在不同的mdf文件中持续存在 - 为什么?

时间:2014-12-26 21:24:42

标签: c# winforms localdb

我正在尝试重建最初使用sqlite的应用程序现在使用'localdb'。 (我想要一个可以在本地和运行时创建自己的数据库的应用程序,而不需要在目标机器上预先安装sql server或sql express实例)

我想放弃使用“第三方”库(sqlite),因为经验告诉我,让它从头开始工作可能会很痛苦,而且从头开始并且从头开始运行可能会更加直接。

使用从Web上复制(并略微修改)的代码我已经设法动态/编程地创建了一个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'已经存在。

如果我注释掉它运行的create table代码,但是select查询会返回多行,表示多次插入(每次应用程序运行一次)

我只是想了解为什么会这样。如果我希望应用程序在每次后续运行时从头开始创建数据库/表,我是否需要每次都删除数据库/表?

1 个答案:

答案 0 :(得分:2)

您的连接字符串中有初始目录“master”。您确定没有在master数据库中创建表而不是新创建的数据库吗?

创作后&分离数据库文件,您可以尝试将连接更改为:

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