我正在尝试重建最初使用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查询会返回多行,表示多次插入(每次应用程序运行一次)
我只是想了解为什么会这样。如果我希望应用程序在每次后续运行时从头开始创建数据库/表,我是否需要每次都删除数据库/表?
答案 0 :(得分:2)
您的连接字符串中有初始目录“master”。您确定没有在master数据库中创建表而不是新创建的数据库吗?
创作后&分离数据库文件,您可以尝试将连接更改为:
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;Integrated Security=True;AttachDbFilename=c:\xxx\xxx\xxx.mdf");