2012-01-10 76 views
0

我最近被要求将我们的MSSQL数据库迁移到Oracle数据库。Oracle客户端需要列名周围的括号?

我正在使用旧的传统方式来执行sql查询。

由于某种原因,我不知道,Oracle要求我在列名称周围放置括号(为什么?) 是否有解决方法?

下面的代码将失败,因为括号(使用远低于MSSQL工作)

using (var msq = new OracleConnection(sConnectionString)) 
{ 
    msq.Open(); 
    OracleCommand msc = msq.CreateCommand(); 
    msc.CommandText = @"SELECT level_1,element_id FROM tnuot_menu_tree 
         WHERE level_1 IN 
          (SELECT mt.level_1 FROM tnuot_menu_tree mt 
           WHERE mt.element_id IN 
           (SELECT element_tree_id FROM tnuot_menu_elements 
           WHERE UPPER(element_link) LIKE :url)) 
         AND level_2 = 0 AND level_3 = 0"; 

    msc.Parameters.Add("url", SqlDbType.VarChar); 
    msc.Parameters["url"].Value = "%" + sName.ToUpper(); 
    OracleDataReader mrdr = msc.ExecuteReader(); 

    while (mrdr.Read()) 
    { 
     sResult.arDirectResult.Add(mrdr[0].ToString()); 
     sResult.arDirectResult.Add(mrdr[1].ToString()); 
     break; 
    } 

    msc.Dispose(); 
    mrdr.Dispose(); 
    msq.Close(); 
} 

相反,在VS服务器资源管理器中,最后一个查询被“翻译”到

SELECT "level_1", "element_id" 
FROM "tnuot_menu_tree" 
WHERE ("level_1" IN 
    (SELECT "level_1" FROM "tnuot_menu_tree" mt 
    WHERE ("element_id" IN 
     (SELECT "element_tree_id" FROM "tnuot_menu_elements" 
      WHERE (UPPER("element_link") LIKE '%DEFAULT.ASPX'))))) 
AND ("level_2" = 0) AND ("level_3" = 0) 

哪个效果不错。

关于如何摆脱这个讨厌的任务的任何想法?

+0

如果您执行第一个代码块,它是否工作? – 2012-01-10 08:29:28

+0

@HansKesting,nope - 我得到'ORA-00942:表或视图不存在'。 – Shai 2012-01-10 08:31:42

+3

我认为表格是用区分大小写创建的,因此您需要引号来查询它,''tnuot_menu_elements“'确保区分大小写。伤心其“CREATE TABLE”结果tnuot_menu_elements“..”# – V4Vendetta 2012-01-10 08:48:26

回答

5

也许,它不是必要的括号;这是双引号。这是Oracle等同于SQLServer使用方括号的方式 - 在此可能需要这样做,因为这些表是使用小写名称创建的,但没有双引号将Oracle自动将名称转换为大写。

3

您的第一个和第二个查询之间的主要区别是引号(而不是括号)。额外的括号不是必需的。他们似乎是VS服务器浏览器的一个奇怪的工件。

与流行的看法相反,Oracle区分大小写。列名称level_1LEVEL_1是不同的。如果您的列名和表名都是大写,则大小写无关紧要,因为Oracle会将SQL语句中所有未加引号的标识符转换为大写。

但是,如果您的列名和表名使用小写字母,则必须将列名放在双引号中才能保留正确的外框。