我有一个在运行服务器的计算机上正常运行的Web应用程序,但是当我尝试通过本地网络在另一台设备上运行Web应用程序时,我收到此错误:
指定的架构名称" WORKGROUP \ LAPTOP-1"要么不存在,要么您没有权限使用它。
我试图执行的命令如下:
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中编辑权限?
另外,我认识到它易受注射,但我想首先解决这个问题。
答案 0 :(得分:1)
&#34;我怀疑nametime没有被设置为包含所需的模式 - 通常这是[dbo]
这应该有效&#34;
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如果您重新发布答案,我会将其标记为正确答案。
任何人都可以解释为什么会这样吗?
答案 1 :(得分:1)
因为您在连接字符串中使用Integrated Security=True;Trusted_Connection=True
,哪个用户连接到数据库以及使用哪个默认架构取决于Windows环境。
您的IIS可能设置为使用不同的Windows用户凭据进行远程连接而不是本地连接。或者,如果您还在IIS中为应用程序启用了集成的Windows身份验证,则客户端计算机上登录的Windows用户将用于对数据库进行身份验证。
因此要么不使用集成安全性,要么确保所有想要连接的用户都可以访问模式dbo并将其用作默认模式。
有关如何为Windows网络组设置默认架构的信息,请参阅this article。
警告:个人意见
在Ubercoder建议的SQL语句中指定模式名称也可以正常工作,但这通常不是一个好主意,因为这使得将应用程序迁移到SQL服务器时要困难得多。具有不同应用程序的数据库,或者当您要实现多租户方案时。
开发人员也很容易忘记在sql语句中添加模式前缀。当开发人员使用登录时dbo是默认模式时,在开发期间不会轻易发现此错误。