我最近被要求将我们的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)
哪个效果不错。
关于如何摆脱这个讨厌的任务的任何想法?
如果您执行第一个代码块,它是否工作? – 2012-01-10 08:29:28
@HansKesting,nope - 我得到'ORA-00942:表或视图不存在'。 – Shai 2012-01-10 08:31:42
我认为表格是用区分大小写创建的,因此您需要引号来查询它,''tnuot_menu_elements“'确保区分大小写。伤心其“CREATE TABLE”结果tnuot_menu_elements“..”# – V4Vendetta 2012-01-10 08:48:26