为什么SQL连接在Oracle中失败?

时间:2014-03-28 12:09:14

标签: sql database oracle join

我只是尝试简单使用oracle db加入C#。应该没什么大不了的。但它总是失败。它适用于MS-Access。问题出在哪儿 ? (OleDb或Odbc在这里没有区别,我试过了两个)

修改

  • 可能是Oracle版本的问题吗? (似乎我们正在使用8.1.7.0.0和8.1.5.0.0模块)

代码:

using System;
using System.Data.Odbc;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string n = Environment.NewLine + "--------------------------------" + Environment.NewLine + Environment.NewLine;

            // connect
            string connectionString = "dsn=TEST;uid=read;pwd=myPwd";
            OdbcConnection connection = new OdbcConnection(connectionString);
            connection.Open();

            // select (key is actually text not numeral)
            string query = "select * from INFOR.ZEITEN where (KEY = 0)";
            query = "select a.KEY, b.GREG from INFOR.ZEITEN a inner join INFOR.ZEITEN b on (a.AUSWEIS = b.AUSWEIS) where (a.KEY like '1')";

            try
            {
                query = query.Replace(Environment.NewLine, " ");
                Console.WriteLine(n + query);
                OdbcCommand command = new OdbcCommand(query, connection);
                OdbcDataReader reader = command.ExecuteReader(); // throws exception
                if (reader != null)
                    Console.WriteLine(n + "success, now read with reader!");
            }
            catch (Exception e)
            {
                Console.WriteLine(n + e.Message + n + e.StackTrace);
            }

            // wait
            Console.ReadKey();
        }
    }
}

输出:

enter image description here

成功,简单的选择:

enter image description here

4 个答案:

答案 0 :(得分:4)

首先在9i中支持ANSI连接(例如inner join)。您需要使用旧语法:

select a.KEY, b.GREG 
 from INFOR.ZEITEN a,
      INFOR.ZEITEN b 
where (a.AUSWEIS = b.AUSWEIS) 
      and  (a.KEY like '1')

请注意,like运算符在这种情况下等同于=,但您可能知道

答案 1 :(得分:1)

单词key是保留字。这意味着身份是一个非常糟糕的选择。你需要用双引号来逃避它。这可能有效:

        query = "select a.\"KEY\", b.GREG
                 from INFOR.ZEITEN a inner join
                      INFOR.ZEITEN b
                      on (a.AUSWEIS = b.AUSWEIS)
                 where (a.\"KEY\" like '1')";

我猜测\"将在此上下文中起作用,但可能还有另一种方法可以插入此字符。

答案 2 :(得分:1)

我认为KEY是数字,因此您无法使用LIKE。这是因为WHERE KEY = 0工作正常。

答案 3 :(得分:0)

错误是什么?你可以编辑你的问题并添加系统向你投掷的实际错误吗? 首先,我个人建议使用ODP .NET(适用于.NET的Oracle数据提供程序)。您可以下载Oracle 12c here的最新版本。或者查找您需要的版本。 ODBC是一个用C编写的非常旧的驱动程序,使用本机Windows RPC技术工作。 对于完整的.NET支持,最好使用ODP .NET。 其次,检查是否对导致sql失败的表有任何约束。