我只是尝试简单使用oracle db加入C#。应该没什么大不了的。但它总是失败。它适用于MS-Access。问题出在哪儿 ? (OleDb或Odbc在这里没有区别,我试过了两个)
修改
代码:
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();
}
}
}
输出:
成功,简单的选择:
答案 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失败的表有任何约束。