本地数据库更改保留在不同的 mdf 文件中 - 为什么
本文关键字:mdf 文件 为什么 数据库 保留 | 更新日期: 2023-09-27 18:35:19
我正在尝试重建一个最初使用 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"已经存在。
如果我注释掉它运行的创建表代码,但选择查询返回多行指示多次插入(每次应用程序运行时一个)
我只是想了解为什么会发生这种情况。 如果我希望应用程序在每次后续运行时都表现得像从头开始创建数据库/表一样,我是否需要每次都删除数据库/表?
连接字符串中有初始目录"master"。是否确定尚未在 master 数据库中创建表,而不是在新创建的数据库中创建表?
创建并分离数据库文件后,您可以尝试将连接更改为:
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)'v11.0;Integrated Security=True;AttachDbFilename=c:'xxx'xxx'xxx.mdf");