C# Visual Studio:|数据目录|连接字符串中的关键字与 mdf 文件冲突
C# Visual Studio: |DataDirectory| keyword in connection string conflicts mdf files
与 2 位开发人员一起处理 windows 表单应用程序项目。通过tfs共享源代码,由于每台PC的数据目录不同,已将数据目录路径替换为|DataDirectory|
关键字。 (C:\Users\username\Documents\Visual Studio 20XX\Projects\solution folder\solution folder
)
已在连接字符串中使用此相对路径作为
class ConnectionManager
{
public static SqlConnection dbcon()
{
string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\systemdb.mdf;Integrated Security=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
return con;
}
}
问题是当C#应用程序向SQL服务器数据库发送数据时,显示数据已经添加到数据库中,但实际上数据库并没有更新。
发现连接字符串与位于根文件夹中的 .mdf
文件与位于 bin\debug
中的 .mdf
文件冲突。 SELECT
查询在使用 |DataDirectory|
时工作正常。 INSERT 查询在使用 |DataDirectory|
时不起作用,但在使用实际目录路径而不是 |DataDirectory|
.
时工作正常
如何解决这个问题?要求是:
从 tfs 获取最新版本后不需要每次都修改目录路径,需要像 |DataDirectory|
这样的东西始终保持。
连接字符串不应与根文件夹和 bin\debug
文件夹中的 .mdf
文件冲突。
整个 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 中创建您的数据库,为其指定一个合乎逻辑的名称(例如 systemdb
)
使用它的逻辑 数据库名称 连接到它(当你在服务器上创建它时给定的) - 不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
Data Source=.\SQLEXPRESS;Database=systemdb;Integrated Security=True
其他一切完全和以前一样...
另请参阅 Aaron Bertrand 的精彩博客 post Bad habits to kick: using AttachDbFileName 了解更多背景信息。
与 2 位开发人员一起处理 windows 表单应用程序项目。通过tfs共享源代码,由于每台PC的数据目录不同,已将数据目录路径替换为|DataDirectory|
关键字。 (C:\Users\username\Documents\Visual Studio 20XX\Projects\solution folder\solution folder
)
已在连接字符串中使用此相对路径作为
class ConnectionManager
{
public static SqlConnection dbcon()
{
string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\systemdb.mdf;Integrated Security=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
return con;
}
}
问题是当C#应用程序向SQL服务器数据库发送数据时,显示数据已经添加到数据库中,但实际上数据库并没有更新。
发现连接字符串与位于根文件夹中的 .mdf
文件与位于 bin\debug
中的 .mdf
文件冲突。 SELECT
查询在使用 |DataDirectory|
时工作正常。 INSERT 查询在使用 |DataDirectory|
时不起作用,但在使用实际目录路径而不是 |DataDirectory|
.
如何解决这个问题?要求是:
从 tfs 获取最新版本后不需要每次都修改目录路径,需要像
|DataDirectory|
这样的东西始终保持。连接字符串不应与根文件夹和
bin\debug
文件夹中的.mdf
文件冲突。
整个 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 中创建您的数据库,为其指定一个合乎逻辑的名称(例如
systemdb
)使用它的逻辑 数据库名称 连接到它(当你在服务器上创建它时给定的) - 不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
Data Source=.\SQLEXPRESS;Database=systemdb;Integrated Security=True
其他一切完全和以前一样...
另请参阅 Aaron Bertrand 的精彩博客 post Bad habits to kick: using AttachDbFileName 了解更多背景信息。