创建本地数据库文件然后将应用程序连接到它的正确方法是什么?即使您更改项目文件夹的位置,我也希望它能够正常工作。
知道我做的是:项目 - >添加新项目 - >基于服务的数据库和我创建一个,然后我去数据 - >添加新数据源,我添加创建的数据库,然后获取连接字符串。
好的,一切都很好,我可以按照自己的意愿连接到它但是当我关闭应用程序时(并非总是),我的所有数据都会从数据库中删除。
例如,此代码:
SqlConnection c = new SqlConnection(@"DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DB.mdf;Integrated Security=True;User Instance=True");
c.Open();
SqlCommand cmd;
cmd = new SqlCommand("CREATE TABLE Persons (id int primary key, nume char(20), age int)");
cmd.ExecuteNonQuery();
cmd = new SqlCommand("INSERT INTO Persons VALUES (@id, @name, @age)", c);
cmd.Parameters.AddWithValue("@id", 1);
cmd.Parameters.AddWithValue("@name", "Catalin");
cmd.Parameters.AddWithValue("@age", 20);
cmd.ExecuteNonQuery();
我第一次运行它来创建表并向其添加一个项目然后,如果我第二次运行它而没有使用sqlcommand创建表人员,它告诉我没有Persons对象,但是如果我第二次使用相同的代码运行项目,它告诉我已经有一个Persons对象......
我正在使用Visual C#Express Edition 2010。
答案 0 :(得分:7)
整个用户实例和AttachDbFileName = 方法存在缺陷 - 充其量!在Visual Studio中运行应用程序时,它将复制.mdf
文件(从App_Data
目录到输出目录 - 通常是.\bin\debug
- 应用程序运行的地方)和最有可能,您的INSERT
工作正常 - 但您最后只是查看错误的.mdf文件!
如果你想坚持这种方法,那么尝试在myConnection.Close()
调用上设置一个断点 - 然后用SQL Server Mgmt Studio Express检查.mdf
文件 - 我几乎可以肯定你的数据在那里。
我认为真正的解决方案将是
安装SQL Server Express(你已经完成了)
安装SQL Server Management Studio Express
在 SSMS Express 中创建数据库,为其指定一个逻辑名称(例如MyDatabase
)
使用其逻辑数据库名称(在服务器上创建时给定)连接到它 - 并且不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
Data Source=.\\SQLEXPRESS;Database=MyDatabase;Integrated Security=True
其他所有内容都完全与以前相同......
另请参阅Aaron Bertrand的优秀博客文章Bad habits to kick: using AttachDbFileName以获取更多背景信息。
答案 1 :(得分:2)
将复制到输出目录设置从始终复制更改为数据库文件属性页中的复制如果更新。每次运行应用程序时,新数据库文件都会从项目复制到bin
文件夹,因此上一次运行的所有数据都将被删除。
答案 2 :(得分:0)
我想出了一个非常简单的答案,但也许这样做不是最佳用法。 无论如何,我将数据库添加到项目中,然后通过这样做直接连接到它:
string path = Path.GetDirectoryName(Path.GetDirectoryName(Directory.GetCurrentDirectory)));
SqlConnection c = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=""" + path + @"Database1.mdf"";Integrated Security=True;User Instance=True");
这样,如果您在多台PC之间移动项目,连接仍然有效(我最需要它)。 这也适用于.SDF文件,它也更容易。