代码之家  ›  专栏  ›  技术社区  ›  Bitterblue

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

  •  2
  • Bitterblue  · 技术社区  · 12 年前

    我只是试着 易于理解的 使用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 回复  |  直到 12 年前
        1
  •  4
  •   Joe    12 年前

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

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

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

        2
  •  1
  •   Hamlet Hakobyan    12 年前

    我认为 KEY 是数字,则不能使用 LIKE 。这是因为 WHERE KEY = 0 工作正常。

        3
  •  1
  •   Gordon Linoff    12 年前

    这个词 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')";
    

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

        4
  •  0
  •   DragoRaptor    12 年前

    错误是什么?你能编辑你的问题并添加系统向你抛出的实际错误吗? 首先,我个人建议使用ODP.NET(用于.NET的Oracle数据提供程序) here 。或查找所需的版本。 ODBC是一个用C语言编写的非常古老的驱动程序,使用本机Windows RPC技术工作。 对于完整的.NET支持,最好使用ODP.NET。 其次,检查表上是否存在导致sql失败的任何约束。

    推荐文章