Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能使用System.Data.SqlClient获取表的名称?_C#_Sql Server_Database Design - Fatal编程技术网

C# 为什么不能使用System.Data.SqlClient获取表的名称?

C# 为什么不能使用System.Data.SqlClient获取表的名称?,c#,sql-server,database-design,C#,Sql Server,Database Design,我没有创建并且不拥有此数据库。我的工作通常只是将数据放入其中,所以我不必过多地考虑DBA方面。我正在处理一个辅助项目,不明白为什么不能列出所有的表名。我已经找到了几种方法来收集这些信息,但是在c环境中没有一种方法适合我。我每次返回0行。当在azure data studio中作为查询执行时,它们确实可以工作。无论使用哪种方法枚举表,我都能返回99行正确数量的表。我的连接字符串指定要在服务器中使用的数据库 名为workingQuery的查询返回预期信息1行15个字段。所以我知道我的连接字符串是正确

我没有创建并且不拥有此数据库。我的工作通常只是将数据放入其中,所以我不必过多地考虑DBA方面。我正在处理一个辅助项目,不明白为什么不能列出所有的表名。我已经找到了几种方法来收集这些信息,但是在c环境中没有一种方法适合我。我每次返回0行。当在azure data studio中作为查询执行时,它们确实可以工作。无论使用哪种方法枚举表,我都能返回99行正确数量的表。我的连接字符串指定要在服务器中使用的数据库

名为workingQuery的查询返回预期信息1行15个字段。所以我知道我的连接字符串是正确的,我的代码是有效的

我有一个测试函数,我正在尝试许多查询

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    List<string> fields = new List<string>();
    string workingQuery = "SELECT TOP (1) * FROM myRealTable";
    string failingTablesQuery1 = "SELECT name FROM sysobjects WHERE xtype = 'U'";
    string failingTablesQuery2 = "SELECT name AS table_name FROM sys.tables GO";
    string failingTablesQuery3 = "SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE'";

    using (var command = conn.CreateCommand())
    {
        command.CommandText = workingQuery;

        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
            for (int i = 0; i < reader.FieldCount; i++)
            {
                fields.Add(reader[i].ToString());
            }
        conn.Close();
        return fields; 
    }
}
除了原始sql查询之外,我也尝试过。它也不返回任何行

我试着预先使用myDatabaseName;对前面的查询没有影响

我只能假设这是数据库设置方式的问题。有人能帮我找出导致这个问题的原因吗

解决方案:
我的连接字符串的凭据不具有此操作所需的权限。

在SQL Server中,对元数据的访问由视图定义权限控制。您可能有权从表中进行选择,但无权查看其定义或在目录中查找它。默认情况下,对对象的任何权限都意味着视图定义,但可以拒绝给用户。看


因此,请检查您在这两个位置使用的标识是否相同,以及该标识是否对表具有视图定义权限。

在SQL Server中,对元数据的访问由视图定义权限控制。您可能有权从表中进行选择,但无权查看其定义或在目录中查找它。默认情况下,对对象的任何权限都意味着视图定义,但可以拒绝给用户。看


因此,请检查您在这两个位置使用的标识是否相同,并且该标识是否对表具有查看定义权限。

您说/暗示它们不工作,但您没有告诉我们它们不工作的原因。什么是不工作?我将编辑我的问题。工作就是要说我能把争吵弄回来。“不工作”的意思是在应该返回的时候没有返回行。我认为sys名称空间是相关的。不知何故,非用户对象的对象不可按连接字符串或运行时的行为方式查询。我会将您的sysobjects查询放在视图或存储过程中—您将拥有视图或sp,然后查看是否可以查询它。所有这些都是猜测。你使用的是正确的身份吗?您可能对对象缺乏查看定义权限。@DavidBrowne Microsoft这是我的问题。我以为我在手动测试时使用了相同的权限。然而,在手动测试时,我实际上使用的是我的个人凭据,而不是生产凭据。谢谢。你说/暗示他们不工作,但你没有告诉我们为什么他们不工作。什么是不工作?我将编辑我的问题。工作就是要说我能把争吵弄回来。“不工作”的意思是在应该返回的时候没有返回行。我认为sys名称空间是相关的。不知何故,非用户对象的对象不可按连接字符串或运行时的行为方式查询。我会将您的sysobjects查询放在视图或存储过程中—您将拥有视图或sp,然后查看是否可以查询它。所有这些都是猜测。你使用的是正确的身份吗?您可能对对象缺乏查看定义权限。@DavidBrowne Microsoft这是我的问题。我以为我在手动测试时使用了相同的权限。然而,在手动测试时,我实际上使用的是我的个人凭据,而不是生产凭据。非常感谢。