gpt4 book ai didi

c# - SqlConnection 忽略用户的默认架构

转载 作者:太空狗 更新时间:2023-10-29 23:32:36 26 4
gpt4 key购买 nike

很抱歉拖了这么久,但我看到了太多信息太少的问题...如果有人在前几行看到我的错误,我会很高兴...

我有一个 SQL Server 2008 R2 数据库,在通过 C# SqlConnection 连接时无法获得我认为应该正确的行为。

我有两个使用 Visual C# 2010 Express 构建的 C# 应用程序:

  • 一个用于数据导入/导出/报告和浏览
  • 一个用于做一些复杂的处理

这一切都在 Windows 7 上,包括所有更新等...

这两个应用程序各自使用的一些表是共享的公用表,而其他的则需要保持分离。因为我需要能够在两侧之间转换和传输数据,所以我想将所有这些保存在一个数据库中。

为了保持一定程度的分离,我创建了两个模式、两个用户、两个角色和两个登录名,例如:

CREATE LOGIN [Import_User] WITH PASSWORD=N'*****'
CREATE LOGIN [Engine_User] WITH PASSWORD=N'*****'

CREATE USER [Import_User] FOR LOGIN [Import_User] WITH DEFAULT_SCHEMA=[Import_Schema]
CREATE USER [Engine_User] FOR LOGIN [Engine_User] WITH DEFAULT_SCHEMA=[Engine_Schema]

CREATE ROLE [Import_Role] AUTHORIZATION [dbo]
CREATE ROLE [Engine_Role] AUTHORIZATION [dbo]

EXEC('CREATE SCHEMA [Import_Schema] AUTHORIZATION [Import_User]')
EXEC('CREATE SCHEMA [Engine_Schema] AUTHORIZATION [Engine_User]')

-- Import role permissions on the Import schema
GRANT EXECUTE, DELETE, INSERT, SELECT, UPDATE, REFERENCES ON SCHEMA::[Import_Schema] TO [Import_Role]

-- Engine_Role permissions on the engine schema
GRANT EXECUTE, DELETE, INSERT, SELECT, UPDATE, REFERENCES ON SCHEMA::[Engine_Schema] TO [Engine_Role]

EXEC sp_addrolemember N'Import_Role', N'Import_User'
EXEC sp_addrolemember N'Engine_Role', N'Engine_User'

GRANT CONNECT TO [Import_User]
GRANT CONNECT TO [Engine_User]

然后我在每个模式中创建一些表和存储过程,以适合每个角色。引擎模式中可能有 20 个表,导入模式中有 30 个左右。其中一些在两个模式中非常相似,但不完全相同,例如:

CREATE TABLE [Engine_Schema].[Problem](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Description] [varchar](max) NULL,
CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED ( [ID] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCK = ON) ON [PRIMARY])
ON [PRIMARY]

CREATE TABLE [Import_Schema].[Problem](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Client] [varchar](50) NOT NULL,
[Description] [varchar](max) NULL,
CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED ( [ID] ASC )
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCK = ON) ON [PRIMARY])
ON [PRIMARY]

当我通过 SSMS 检查使用这两个登录名时,这一切似乎都工作正常 - 每个登录名都准确地看到我期望的表和 SP。在每种情况下,我都可以在 SSMS 中运行查询和 USP,而无需使用模式前缀,因为这些连接使用我为每个登录名/用户设置的默认模式。如果我以“sa”身份登录,那么我当然可以看到两个模式中的所有内容。

在我的 C# 代码中,我像这样连接到数据库:

SqlConnection dbConnection = new SqlConnection(""server=laptop; database=test; user id=Engine_User; password=*****; Trusted_Connection=yes; connection timeout=30");
dbConnection.Open();

然后我尝试像这样直接查询数据库表:

using (SqlCommand cmdSelectProblems = new SqlCommand()) {
cmdSelectProblems.Connection = dbConnection;
cmdSelectProblems.CommandText = "Select ID, Name from Problem order by Name";
DataTable dataTableProblems = new DataTable();
using (SqlDataAdapter dataAdapterProblems = new SqlDataAdapter(cmdSelectProblems)) {
dataAdapterProblems.Fill(dataTableProblems);
...

或者我可以像这样尝试使用我的存储过程之一:

using (SqlCommand cmd = new SqlCommand()) {
cmd.Connection = dbConnection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SelectProblems";
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
da.Fill(_problemsTable);
}

但是当我尝试像这些示例一样通过我的 C# 代码使用连接时,我会收到如下错误:

Invalid object name 'Problem'

Could not find stored procedure 'SelectProblems'

我似乎需要使用显式模式前缀来访问数据库中那些相同的 DB 对象。就我测试过的内容而言,使用模式前缀明确包含的所有内容都可以在我的 C# 代码中运行,因此将直接表查询更改为:

  cmdSelectProblems.CommandText = "Select ID, Name from [Engine_Schema].Problem order by Name";

或尝试访问具有架构前缀的 USP,例如:

  cmd.CommandText = "[Engine_Schema].SelectProblems";

然后一切正常。

现在我知道使用显式模式名称是最佳实践,但我有一大堆 C# 代码和存储过程代码,这些代码是在不使用这些模式前缀的情况下编写的。如果我可以使 C# SqlConnection 查询遵循我已定义和使用的登录的默认架构,那将真的简单得多。我相信这应该按照我设置的方式正常工作,但我想我一定是遗漏了什么地方。

到目前为止,我已经在这上面浪费了两天时间,而且我所阅读的所有内容都表明这应该一切正常。

最佳答案

server=laptop; database=test; user id=Engine_User; password=*;
Trusted_Connection=yes; connection timeout=30

这是您的问题 - 您使用的是 Windows 身份验证而不是 SQL 身份验证。将您的连接字符串更改为 Trusted_Connection=no 并且一切正常。

关于c# - SqlConnection 忽略用户的默认架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15075512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com