使用C#检查Oracle SQL数据库中是否存在表

3
这段代码:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='xxx'

上面的代码抛出了一个异常:

ORA-00900: 无效的SQL语句

我做错了什么?这段代码很久以前可以正常工作,我敢发誓。

TABLES 中是否有名为 MyTable 的列名? - Bert
不,那是个打错了的字...请看更新后的文本。 - msfanboy
6个回答

5

Oracle不支持INFORMATION_SCHEMA,您需要使用ALL_TABLES,请参见此处


1
它实际上是ANSI标准的一部分,SQL Server并不是唯一支持它的数据库管理系统。 - vc 74
感谢您的澄清,vc 74。我刚刚注意到它是ANSI标准的一部分。 - Mark Sherretta
是的,只是另一个标准的Oracle不愿意遵守... ;) - vc 74

5
假设您想要检查当前连接的模式,我会使用 user_tables 表:
SELECT table_name 
FROM USER_TABLES
WHERE table_name='xxx'

如果您想检查表是否在不同的模式中,请使用 all_tables。不要忘记添加拥有者谓词,因为该表可能存在于多个模式中:
SELECT table_name 
FROM ALL_TABLES
WHERE table_name='xxx' AND owner='yourschemahere'

3

您曾从其他数据库管理系统迁移过来吗?

据我所知,Oracle不支持INFORMATION_SCHEMA(甚至没有其子集),但您可以通过查询数据字典来检索大量元数据。

数据字典可以让您检索到更多信息。


2

0

Kevin Burton的实际代码版本答案,包括有和没有模式的两个版本:

    public Boolean TableExists(OracleConnection connection, String tableName)
    {
        return TableExists(connection, tableName, null)
    }

    public Boolean TableExists(OracleConnection connection, String tableName, String schema)
    {
        String sql;
        if (schema == null)
            sql = "SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME=:table";
        else
            sql = "SELECT TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME=:table AND OWNER=:schema";
        OracleCommand command = new OracleCommand(sql, connection)
        command.Parameters.AddWithValue("table", tableName);
        if (schema != null)
            command.Parameters.AddWithValue("schema", schema);
        using (DbDataReader reader = command.ExecuteReader())
            return reader.HasRows;
    }

0
在我的最近一个项目中,有一个要求是使用C#检查Oracle数据库中是否存在某些表。
先决条件:
- Oracle .Net程序集 - 包含连接字符串的App.Config文件
为了满足这个要求,我想出了以下解决方案。
private static void CheckIfOracleTableExists()
{
 try
   {
       string connectionString = ConfigurationManager.ConnectionStrings["dbConnectString"].ConnectionString;
       if (connectionString == null) throw new Exception();

       using (OracleConnection orclConn = new OracleConnection(connectionString))
       using (OracleCommand orclCmd = new OracleCommand())
           {
           orclConn.Open();
           orclCmd.Connection = orclConn;

           string commandText = String.Format("SELECT COUNT(*) FROM " + DbTestName);

           orclCmd.CommandText = commandText;
           orclCmd.CommandType = CommandType.Text;
           orclCmd.CommandTimeout = Convert.ToInt32(DbTimeout);

           try
           {
               orclCmd.ExecuteScalar();
               {
                   if (orclCmd.RowSize == 0) return;
                   TableExists = true;

                   orclConn.Close();
                   orclConn.Dispose();
                   orclCmd.Dispose();
               }
            }
            catch (OracleException oex)
            {
               if (oex.ToString().Contains("table or view does not exist"))
                  {
                     Console.WriteLine("\r\n\tTable not found.");
                  }
                  TableExists = false;
            }
            catch (OracleException oex)
            {
                Console.WriteLine("{0}", oex);
                TableExists = false;
            }
            catch (Exception ex)
            {
                if (ex.ToString().Contains("Object reference not set to an instance of an object"))

                Console.WriteLine("\r\n\t Invalid Connection String.");
            }
            TableExists = false;
           }
    }    
}//// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /

1
如果您能够简洁明了地阐述您的解决方案,我认为您的答案会更有用。 - Josh E
设置一个全局变量并且不返回任何值?太丑陋了。 - Nyerguds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接