通过本地网络从Web应用程序访问架构时出错

时间:2017-01-27 10:25:01

标签: c# asp.net sql-server windows-integrated-auth

我有一个在运行服务器的计算机上正常运行的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中编辑权限?

另外,我认识到它易受注射,但我想首先解决这个问题。

2 个答案:

答案 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是默认模式时,在开发期间不会轻易发现此错误。