通过本地网络从 Web 应用程序访问架构时出错
Error accessing Schema from web app over over local network
我有一个在 运行 连接服务器的计算机上正常工作的 Web 应用程序,但是当我尝试 运行 通过本地网络在另一台设备上使用该 Web 应用程序时,出现此错误:
The specified schema name "WORKGROUP\LAPTOP-1" either does not exist or you do not have permission to use it.
我要执行的命令如下:
protected void Home_pt()
{
string nametime;
string name;
string time;
string tname = null;
SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");
if (thiddenfield.Value == String.Empty)
{
Show("error: empty tname");
}
else
{
tname = thiddenfield.Value;
}
using (var cmd = new SqlCommand("SELECT name FROM trecordTable WHERE name='" + tname + "'", conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader())
{
List<string> namedatelist = new List<string>();
while (reader.Read())
{
name = reader["name"].ToString();
time = DateTime.Now.ToString("MM-dd-yyyy");
namedatelist.Add(name + time);
}
nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", "");
Session["nametime"] = nametime;
hftstate.Value = nametime;
}
}
}
protected void Fill_t(object sender, EventArgs e)
{
var nametime = Session["nametime"].ToString();
SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");
conn.Open();
using (var cmdtx1 = new SqlCommand("IF OBJECT_ID('" + nametime + "') IS NULL CREATE TABLE " + nametime + "([Id] INT IDENTITY NOT NULL, [item] NVARCHAR(50) NULL, [CtrlType] NVARCHAR(50) NULL, [six] NVARCHAR(50) NULL, [seven] NVARCHAR(50) NULL, [eight] NVARCHAR(50) NULL); IF NOT EXISTS(SELECT item FROM " + nametime + ") INSERT INTO " + nametime + " (item,CtrlType,hflabel) VALUES ('At','atscroll','cstat')", conn))
{
cmdtx1.ExecuteNonQuery();
}
}
我应该在 SSMS 中编辑权限吗?
此外,我知道它容易受到注入攻击,但我想先解决这个问题。
哇,所以 post 由 Ubercoder 发布了大约 30 秒(然后删除了?)!
“我怀疑 nametime 没有被设置为包含所需的模式 - 通常这是 [dbo]
这应该有效
using (var cmdtx1 = new SqlCommand(
"IF OBJECT_ID('[dbo]." + nametime + @"') IS NULL
CREATE TABLE [dbo]." + nametime + @"
([Id] INT IDENTITY NOT NULL,
[item] NVARCHAR(50) NULL,
[CtrlType] NVARCHAR(50) NULL,
[six] NVARCHAR(50) NULL,
[seven] NVARCHAR(50) NULL,
[eight] NVARCHAR(50) NULL
);
IF NOT EXISTS(SELECT item FROM [dbo]." + nametime + @")
INSERT INTO [dbo]." + nametime + @"
(item,CtrlType,hflabel)
VALUES ('At','atscroll','cstat')",
conn))
{
cmdtx1.ExecuteNonQuery();
}
Ubercoder 如果您重新post您的答案,我会将其标记为正确答案。
任何人都可以解释为什么这样做吗?
因为你在连接字符串中使用了Integrated Security=True;Trusted_Connection=True
,哪个用户连接到数据库以及使用哪个默认模式取决于Windows环境。
您的 IIS 可能设置为对远程连接使用不同于本地连接的 Windows 用户凭据。或者,当您还在 IIS 中为您的应用程序启用集成 Windows 身份验证时,客户端计算机上的登录 Windows 用户将用于对数据库进行身份验证。
因此,要么不使用集成安全性,要么确保所有希望能够连接的用户都可以访问架构 dbo 并将其用作默认架构。
请参阅 this article 了解如何为 Windows 网络组设置默认架构。
警告:个人意见
按照 Ubercoder 的建议在 SQL 语句中指定模式名称也可以,但这通常不是一个好主意,因为这会使应用程序迁移到 SQL 服务器用于与不同的应用程序共享数据库,或者当您想要实现 multi-tenant-scenario.
开发人员也很容易忘记在 sql 语句中添加模式前缀。当开发人员使用默认架构为 dbo 的登录名时,在开发过程中不会轻易发现此错误。
我有一个在 运行 连接服务器的计算机上正常工作的 Web 应用程序,但是当我尝试 运行 通过本地网络在另一台设备上使用该 Web 应用程序时,出现此错误:
The specified schema name "WORKGROUP\LAPTOP-1" either does not exist or you do not have permission to use it.
我要执行的命令如下:
protected void Home_pt()
{
string nametime;
string name;
string time;
string tname = null;
SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");
if (thiddenfield.Value == String.Empty)
{
Show("error: empty tname");
}
else
{
tname = thiddenfield.Value;
}
using (var cmd = new SqlCommand("SELECT name FROM trecordTable WHERE name='" + tname + "'", conn))
{
conn.Open();
using (var reader = cmd.ExecuteReader())
{
List<string> namedatelist = new List<string>();
while (reader.Read())
{
name = reader["name"].ToString();
time = DateTime.Now.ToString("MM-dd-yyyy");
namedatelist.Add(name + time);
}
nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", "");
Session["nametime"] = nametime;
hftstate.Value = nametime;
}
}
}
protected void Fill_t(object sender, EventArgs e)
{
var nametime = Session["nametime"].ToString();
SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");
conn.Open();
using (var cmdtx1 = new SqlCommand("IF OBJECT_ID('" + nametime + "') IS NULL CREATE TABLE " + nametime + "([Id] INT IDENTITY NOT NULL, [item] NVARCHAR(50) NULL, [CtrlType] NVARCHAR(50) NULL, [six] NVARCHAR(50) NULL, [seven] NVARCHAR(50) NULL, [eight] NVARCHAR(50) NULL); IF NOT EXISTS(SELECT item FROM " + nametime + ") INSERT INTO " + nametime + " (item,CtrlType,hflabel) VALUES ('At','atscroll','cstat')", conn))
{
cmdtx1.ExecuteNonQuery();
}
}
我应该在 SSMS 中编辑权限吗?
此外,我知道它容易受到注入攻击,但我想先解决这个问题。
哇,所以 post 由 Ubercoder 发布了大约 30 秒(然后删除了?)!
“我怀疑 nametime 没有被设置为包含所需的模式 - 通常这是 [dbo]
这应该有效
using (var cmdtx1 = new SqlCommand(
"IF OBJECT_ID('[dbo]." + nametime + @"') IS NULL
CREATE TABLE [dbo]." + nametime + @"
([Id] INT IDENTITY NOT NULL,
[item] NVARCHAR(50) NULL,
[CtrlType] NVARCHAR(50) NULL,
[six] NVARCHAR(50) NULL,
[seven] NVARCHAR(50) NULL,
[eight] NVARCHAR(50) NULL
);
IF NOT EXISTS(SELECT item FROM [dbo]." + nametime + @")
INSERT INTO [dbo]." + nametime + @"
(item,CtrlType,hflabel)
VALUES ('At','atscroll','cstat')",
conn))
{
cmdtx1.ExecuteNonQuery();
}
Ubercoder 如果您重新post您的答案,我会将其标记为正确答案。
任何人都可以解释为什么这样做吗?
因为你在连接字符串中使用了Integrated Security=True;Trusted_Connection=True
,哪个用户连接到数据库以及使用哪个默认模式取决于Windows环境。
您的 IIS 可能设置为对远程连接使用不同于本地连接的 Windows 用户凭据。或者,当您还在 IIS 中为您的应用程序启用集成 Windows 身份验证时,客户端计算机上的登录 Windows 用户将用于对数据库进行身份验证。
因此,要么不使用集成安全性,要么确保所有希望能够连接的用户都可以访问架构 dbo 并将其用作默认架构。
请参阅 this article 了解如何为 Windows 网络组设置默认架构。
警告:个人意见
按照 Ubercoder 的建议在 SQL 语句中指定模式名称也可以,但这通常不是一个好主意,因为这会使应用程序迁移到 SQL 服务器用于与不同的应用程序共享数据库,或者当您想要实现 multi-tenant-scenario.
开发人员也很容易忘记在 sql 语句中添加模式前缀。当开发人员使用默认架构为 dbo 的登录名时,在开发过程中不会轻易发现此错误。