【问题标题】:can get table_name but not column_name可以获取 table_name 但不能获取 column_name
【发布时间】:2016-12-16 14:42:26
【问题描述】:

这是我的代码

 string queryString = "";
            if (table == "") queryString = "select table_name from all_tables";
            else queryString = "SELECT column_name FROM all_tab_columns " +
                               "WHERE table_name = '"+table+"'"; 
using (OracleConnection connection = new OracleConnection(conexionbase))
                {
                    try
                    {                        
                        {
                            connection.Open();
                            if (connection != null && connection.State != ConnectionState.Closed)
                            {
                                var nuevadataAdapter = new OracleDataAdapter(queryString, connection);
                                var nuevadataSet = new DataSet();
                                nuevadataAdapter.Fill(nuevadataSet);
                                for (int i = 0; i < nuevadataSet.Tables[0].Rows.Count; i++)
                                {
                                  DropDownList2.Items.Add(nuevadataSet.Tables[0].Rows[i][0].ToString());
                                }
                                connection.Close();
                            }
                            else
                                else DropDownList2.Items.Add("Cant Make a Connection.");
                        }
                }
                catch (Exception ex)
                {
                    else DropDownList2.Items.Add(ex.Message);
                }

            }

列和表的代码相同。 当“列”值为空时,它只显示数据库中的所有表名,并且做得恰到好处。 但是当“column”值有一个列名,并且它建立连接时,它会显示一条消息“OracleConnection.ConnectionString 无效”。

我不知道为什么会这样,我可以建立连接并显示所有 table_names,但无法获取列名。 我只使用 ODAC 无法访问数据库本身,我也尝试使用“DESCRIBE name_of_table”,但没有成功。

获取表中所有列名的正确方法是什么?可能是我无法访问所有列吗?它是一个外部数据库。

【问题讨论】:

  • 可能无法访问表中的所有列名。例如,目录(系统)表有许多视图和同义词,具有不同权限的用户只能看到选定的列。从dba_tab_columns 读取目录表(或视图)的列名可能会比从all_tab_columns 读取更多的列。
  • 您是否能够直接访问数据库(使用 SQL Developer、Toad、SQL*Plus 等前端)?您是否能够直接执行查询,以确认您得到正确的答案? (或者,您可以请有权访问数据库的人为您运行它吗?)该查询对我来说很好。
  • 我没有这些,只有正在开发的平台和连接字符串。
  • 你能否编写一个不同的、更简单的代码 sn-p 来尝试从一个表的 all_tab_columns 中检索列名?这行得通吗?
  • 它没有用,我也尝试了很多列,但没有用。

标签: c# asp.net oracle


【解决方案1】:

尝试做这样的查询:

string queryString = @"select tb.table_name 
from all_tables tb
left join all_tab_columns  tc 
     on tb.table_name = tc.TABLE_NAME
where
     tc.COLUMN_NAME like '%"+ column + "%'";

【讨论】:

    【解决方案2】:

    这是在单个 SELECT 语句中获取结果的方法(刚刚在我的 Oracle DB 上进行了测试,都使用空字符串,与 Oracle 中的 NULL 相同,并且使用实际的表名)。当我传入一个与数据库中任何表的名称都不匹配的非空字符串时,我得到一个空结果集。查询仍然运行良好,它只返回零行。

    :var_table 是一个绑定变量;这是您在C# 代码中插入变量的地方。

    在所有情况下,union all 的一个分支将被执行(而另一个将几乎立即被运行时丢弃)。

    select  table_name from all_tables
      where :var_table is null
    union all
    select  column_name from all_tab_columns
      where table_name = :var_table;
    

    【讨论】:

    • 抱歉,我应该将 :var_table 更改为 ":mytablename" 还是不带冒号的 "mytablename"?无论如何,它都不起作用。
    • @proXima - 我不会尝试使用变量表名,我会先尝试使用硬编码的表名。在这种情况下,它前面不应该有冒号,它应该用单引号括起来(正如你在代码中所做的那样,正确!) - 而且,非常重要的是,表名应该全部大写。也许这就是问题所在?除非转义,否则系统表中的表名和列名总是全部大写。只需为您知道数据库中存在的表选择一个表名,然后尝试这种方式。
    • 我有大写的 table_names 并且它不起作用:c
    【解决方案3】:
    public string get(string tblname)
            {
                string queryString = "";
                if (tblname == "") queryString = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES";
                else queryString = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS  " +
                                   "WHERE table_name = '" + tblname + "'";
                return queryString;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2022-01-12
      • 2010-12-08
      • 2016-11-13
      • 1970-01-01
      • 2020-07-22
      • 2012-10-14
      相关资源
      最近更新 更多