我在SQL Server Management Studio中创建了一个数据库,并将其称为SalonDatabase。我试图在VS C#中连接到数据库。为此我创建了两个connectionString,其中只有一个工作,所以我想知道原因。
这个有效:
string connString = @"Data Source=.\SQLEXPRESS;initial catalog=SalonDatabase;Integrated Security=SSPI";
但是,即使我知道该文件位于该目录中
,以下情况也不起作用string connString = @"Data Source=.\SQLEXPRESS;
Initial Catalog=C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\SALONDATABASE.MDF;Integrated Security=SSPI";
我得到的错误是:
无法打开登录请求的数据库“C:\ PROGRAM FILES \ MICROSOFT SQL SERVER \ MSSQL10_50.SQLEXPRESS \ MSSQL \ DATA \ SALONDATABASE.MDF”。登录失败。用户'USER-PC \ USER'
登录失败
现在我以管理员身份登录计算机。我还阅读了SQL服务器中的用户实例,但我没有看到这就是第二次连接失败的原因。
答案 0 :(得分:1)
使用SQL Server Management Studio
创建数据库,因此请勿使用AttachDBFileName。您可以使用Visual Studio的Server Explorer(从View Menu)工具获取连接字符串。
从Server-Explorer添加连接+右键单击Data Connections + Add Connection +选择Microsoft Sql Server数据源(更改)。
添加连接后,单击鼠标右键选择/打开属性窗口。
Data Source=.\sqlexpress;Initial Catalog=SalonDatabase;Integrated Security=True
答案 1 :(得分:0)
将您的连接修改为'附加'您的mdf。鉴于您的.mdf路径有空格,请务必将其括在单引号中。
Server=.\SQLExpress;
AttachDbFilename='C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\SALONDATABASE.MDF';
Database=dbname;
Integrated Security=SSPI;
Trusted_Connection=Yes;
答案 2 :(得分:0)
Initial Catalog
用于在我们连接到服务器时设置默认数据库名称。
当您传递数据库文件的完整路径时,连接String会搜索名为C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\SALONDATABASE.MDF
的数据库
实际上不存在,因此它失败了。
您可以使用初始方法,如果您想使用完整路径,那么AttachDbFilename
可以按照P.Campbell的建议使用
答案 3 :(得分:0)
默认情况下,使用SQL Server(任何版本)时,服务器部分会为您处理所有与文件相关的杂项。您只需创建一个新数据库(或附加现有数据库)并为其提供逻辑数据库名称,然后仅通过此数据库名称引用该数据库 - 您不关心(并且不关心)需要)关于构成数据库的实际文件。
这就是您的第一个连接字符串有效的原因 - 您告诉SQL Server(Express)您希望使用名为SalonDatabase
的数据库,SQL Server知道这涉及哪些文件。
Microsoft引入了这一概念,即能够“动态”创建SQL Server Express的用户实例并附加物理.MDF文件(而不是按逻辑名称引用数据库)开发工具使事情变得更容易 - 但坦率地说,在我看来,这是一个相当混乱的概念,并且有很多缺点。
在这种情况下,您基本上告诉SQL Server您的连接字符串(使用AttachDbFileName=salondatabase.mdf
和User Instance=True
)它应该为您的用户上下文启动单独的SQL Server Express实例,并自动附加该物理MDF文件指定为其数据库,并为您提供访问权限。
正如另一条评论所提到的,它是一个不赞成使用的功能 - SQL Server 2012将为本地数据库带来一个新的,希望更加流畅的概念。所以在我看来,你应该尽量避免使用这个功能 - 它比其他任何东西都麻烦。