【发布时间】:2014-05-07 21:24:32
【问题描述】:
我只是尝试 simple 使用 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();
}
}
}
输出:
然后是成功的简单选择:
【问题讨论】:
-
这似乎与 C# 无关。如果两条 SQL 语句之一失败,则应检查它是否有效。您是否尝试过使用查询工具执行该语句?
-
@PanagiotisKanavos 是的,我知道。当我问为什么它在 oracle 中失败时,你告诉那些在我的 Q 上发火的 SO 用户!他们想看 C# 代码。
-
您使用的是什么驱动程序版本,您连接的数据库版本是什么?其中一个可能太旧而无法支持
join语法。这似乎不太可能,但我们似乎仍然收到有关 8i 的问题,所以谁知道呢。 (你仍然可以在 Pro*C 中设置dbms=v8也有这个效果)。 -
@AlexPoole
8.1.7.0.0阅读我上面的编辑。 -
@mini-me - 那么这就是你的问题 *8-) 正如 Joe 所说,Oracle 直到 9i 才支持 ANSI 连接。您将不得不使用带有逗号分隔的表列表和
where子句中的所有连接条件的旧语法。当然,或者您可以迁移到受支持的版本...