Oracle客户端需要围绕列名称括起来吗?

时间:2012-01-10 08:24:23

标签: c# asp.net sql oracle

我最近被要求将我们的MSSQL数据库迁移到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)

效果很好。

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

2 个答案:

答案 0 :(得分:5)

可能不是必要的括号;这是双引号。这是Oracle相当于SQLServer使用方括号 - 这可能是必要的,因为这些表是使用小写名称创建的,但如果没有双引号,Oracle会自动将名称转换为大写。

答案 1 :(得分:3)

第一个和第二个查询之间的主要区别是引号(而不是括号)。不需要额外的括号。它们似乎是VS服务器资源管理器中的一个奇怪的工件。

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

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