C# 通过本地网络从web应用访问架构时出错

C# 通过本地网络从web应用访问架构时出错,c#,asp.net,sql-server,windows-authentication,C#,Asp.net,Sql Server,Windows Authentication,我有一个web应用程序在运行服务器的计算机上正常工作,但当我试图通过本地网络在另一台设备上运行该web应用程序时,我遇到以下错误: 指定的架构名称“WORKGROUP\LAPTOP-1”不存在,或者您没有使用它的权限 我尝试执行的命令如下: protected void Home_pt() { string nametime; string name; string time; string tname = null; SqlConnection conn

我有一个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();
    }
}
protectedvoid Home\u pt()
{
字符串名称时间;
字符串名;
串时间;
字符串tname=null;
SqlConnection conn=new SqlConnection(“数据源=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\Public website\\slDataBase.mdf;集成安全性=True;可信连接=True;”;
if(thiddenfield.Value==String.Empty)
{
显示(“错误:空tname”);
}
其他的
{
tname=thiddenfield.Value;
}
使用(var cmd=new SqlCommand(“从trecordTable中选择名称,其中名称=”“+tname+””,conn))
{
conn.Open();
使用(var reader=cmd.ExecuteReader())
{
列表名称DateList=新列表();
while(reader.Read())
{
name=reader[“name”].ToString();
时间=DateTime.Now.ToString(“MM dd yyyy”);
namedatelist.Add(名称+时间);
}
nametime=Regex.Replace(namedatelist[0].ToString(),“[^0-9a-zA-Z]+”,”);
会话[“nametime”]=nametime;
hftstate.Value=名称时间;
}
}
}
受保护的空白填充(对象发送方、事件参数)
{
var nametime=Session[“nametime”].ToString();
SqlConnection conn=new SqlConnection(“数据源=localhost\\SQLEXPRESS;AttachDbFilename=C:\\Users\\Public\\Public website\\slDataBase.mdf;集成安全性=True;可信连接=True;”;
conn.Open();
使用(var cmdtx1=new SqlCommand(“如果对象ID(“+nametime+”)为空,则创建表“+nametime+”([ID]INT-IDENTITY非空,[item]NVARCHAR(50)NULL,[CtrlType]NVARCHAR(50)NULL,[six]NVARCHAR(50)NULL,[seven]NVARCHAR(50)NULL,[eight]nvarcharchar(50)NULL);如果不存在(从“+nametime+”中选择项),则插入到“+nametime+“(项目、CtrlType、hflabel)值('At'、'atscroll'、'cstat')”,conn))
{
cmdtx1.ExecuteNonQuery();
}
}
我是否应该在SSMS中编辑权限


另外,我知道它容易被注入,但我想先解决这个问题。

哇,所以Ubercoder发布了大约30秒的帖子(然后被删除了?)奏效了

“我怀疑nametime没有被设置为包含所需的模式-通常是[dbo]

这应该行得通。”

Ubercoder如果你重新发布你的答案,我会将其标记为正确答案


有人能解释为什么这样做吗?

因为您使用的是
integratedsecurity=True;Trusted_Connection=True
在连接字符串中,哪个用户连接到数据库以及使用哪个默认架构取决于Windows环境

您的IIS可能被设置为对远程连接使用与本地连接不同的Windows用户凭据。或者,如果还为应用程序在IIS中启用了集成Windows身份验证,则客户端计算机上登录的Windows用户将用于对数据库进行身份验证

因此,要么不要使用集成安全性,要么确保所有希望能够连接的用户都可以访问模式dbo,并将其用作默认模式

有关如何为Windows网络组设置默认架构的信息,请参见


警告:个人意见

按照Ubercoder的建议在SQL语句中指定架构名称也可以,但这通常不是一个好主意,因为这会使将应用程序迁移到SQL server变得更加困难,在SQL server中,应用程序将与其他应用程序共享数据库,或者当您想要实现多租户场景时


开发人员很容易忘记在sql语句中添加模式前缀。在开发过程中,当开发人员使用dbo作为默认模式的登录时,这个错误就不会那么容易被发现。

nametime的值是多少??它是根据用户输入按程序生成的。基本上是一个输入的名字,然后是当前时间。我没有问它是如何创建的。我问它的价值是什么。您的问题就在那里。添加了其他代码以显示问题的来源。一个示例值是:“Pete01272017”,因此您认为它是导致问题的nametime变量,即使该命令在与服务器相同的机器上运行时工作正常?不使用集成安全性可以吗?这会产生什么类型的漏洞?使用什么类型的身份验证在很大程度上取决于您的应用程序场景。为Windows用户配置默认模式当然是更简单的方法。指定模式是一种很好的编码实践。Aaron Bertrand在这方面有一个很好的帖子。
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();
}