繁体   English   中英

C#无效的对象名称ASP.NET

[英]C# Invalid object name ASP.NET

我正在尝试从我的表tblEmployees检索记录到我的数据gridview dgvEmployees 我不确定有什么问题,可能是因为语法错误? 但是在使用MS Visual C#2010 Express(仅限WinForms)之前,代码已经运行。 我目前正在使用MS Visual Studio(ASP.NET - C#)创建一个包含winforms的网页。 这是我的代码:

    SqlConnection sConn;
    SqlDataAdapter daEmp;
    DataSet dsEmp;

    const string sStr = "Server = MYSERVER\\SQLEXPRESS; Database = EMPLOYEES; Integrated Security = SSPI";

    protected void Page_Load(object sender, EventArgs e)
    {
        sConn = new SqlConnection(sStr);
        daEmp = new SqlDataAdapter("Select * from tblEmployees", sConn);
        dsEmp = new DataSet();

        daEmp.Fill(dsEmp, "tblEmployees");

        dsEmp.Tables["tblEmployees"].PrimaryKey = new DataColumn[] { dsEmp.Tables["tblEmployees"].Columns["EmployeeID"] };

        dgvEmployees.DataSource = dsEmp.Tables["tblEmployees"];

    }

这是此行的错误消息(daEmp.Fill(dsEmp, "tblEmployees");

Invalid object name 'tblEmployees'

请帮忙。 谢谢!

您现在正在网站上运行该应用程序,因此当您在连接字符串中使用Integrated Security = SSPI时,将连接到SQL Server的用户是在IIS中运行应用程序池的用户。

你需要:

  1. 为应用程序池用户授予对数据库的访问权限(对于默认用户不是一个好主意)。
  2. 将连接池的用户更改为有权访问数据库的用户。
  3. 指定在连接字符串中具有访问权限的用户。

错误是指SQL查询而不是DataSet 换句话说,问题不在于C#。 您需要检查连接字符串并确保该表存在于DB中。

daEmp = new SqlDataAdapter("Select * from tblEmployees", sConn);

此查询不正确: Select * from tblEmployees

您可以通过将查询更改为: Select * from IDONTEXIST来验证这Select * from IDONTEXIST

你会看到一个类似的错误:

无效的对象名称IDONTEXIST

您应该首先验证您的连接字符串:

  • 确保它连接到您认为的SQL Server实例。
  • 确保它为您认为存在的数据库中的连接建立数据库上下文。
  • 确保它与您认为的凭据连接。
  • 确保这些凭据映射到您认为应该的SQL Server用户
  • SQL Server用户具有您认为它执行的默认架构,并且它具有在数据库中授予的适当权限。

几乎可以肯定,您的问题来自上面列出的一个或多个问题。

如果连接的数据库上下文与您认为的数据库不同,则可能找不到您要查找的对象。

如果对象引用不是模式限定的,则可能在解析对象引用时遇到问题。 SQL查询中的对象引用应该始终至少是模式限定的。 而不是说

select * from tblEmployees

你应该说

select * from dbo.tblEmployees

其中dbo是拥有该对象的架构。 在运行时按以下顺序查找任何非模式限定的对象引用

  1. 首先,针对所需名称的对象探测当前用户的默认模式。
  2. 如果失败,则探测dbo模式(“数据库所有者”)以查找所需名称的对象。

对于存储过程,查找更复杂:

  1. 在当前数据库中探测当前用户的默认架构。
  2. 探测当前数据库中的'dbo'模式。

如果存储过程名称以“sp_”开头,

  1. 在“主”数据库中探测当前用户的默认架构。
  2. 探测'master'数据库中的'dbo'模式。

如果有问题的对象属于另一个模式,除非由所有者模式限定,否则将找不到该模式。

由于多个查找问题,缺少模式限定可能会阻止执行计划缓存,这意味着必须在每次执行查询时重新编译查询计划。 毋庸置疑,这对性能有不利影响。

此外,如果您的数据库用户是'dev'并且有问题的开发人员在6个月前在开发过程中创建了一个名为'dev.foo'的表或其他对象,那么您可能会感到有趣......结果。 现在你已经投入生产并以用户'dev'连接。 select * from foo执行select * from foo将优先绑定到dev.foo ,而不是DBA创建的实际生产表'dbo.foo'。 您的用户会想知道为什么他们的数据丢失了,或者您会想知道为什么当您通过SQL Management Studio查看它们时,应用程序抱怨缺少列时会出现错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM