从c#程序访问Oracle
本文关键字:Oracle 访问 程序 | 更新日期: 2023-09-27 18:14:44
对于解决这个问题我将非常感谢。
我不是专业开发人员,而是一个"业余爱好者","继承"了一份报道工作(多亏了我对编程的兴趣——"从不自愿"的经典例子!)。
我试图从c#访问Oracle 10g数据库。
为了使事情尽可能简单,我有一个带有单个按钮的裸WPF表单。在按钮的click事件中,我得到了以下代码(顺便说一下,它在不同PC上设置的早期程序中工作得很好)-
using System.Data;
using System.Data.OracleClient;
...
string oraStr1 = "Data Source=(DESCRIPTION=(ADDRESS_LIST =(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVICE_NAME=myDB)));Password=myPassword;User ID=myUser;";
DataTable oraTable = new DataTable();
string queryString = "Select surname,forenames from person table where surname = 'Smith'";
using ( OracleConnection oraConnect = new OracleConnection( oraStr1 ) )
{
try
{
OracleCommand OraCmd = new OracleCommand( queryString, oraConnect );
oraConnect.Open();
OracleDataAdapter OraAdapter = new OracleDataAdapter();
OraAdapter.SelectCommand = OraCmd;
OraAdapter.Fill( oraTable );
}
finally
{
oraConnect.Close();
}
现在… (c# Express Edition)应用程序在远程服务器上的VM中运行。我在这个VM上的共享也安装了Oracle Database 10g Client Release 2(10.2.0.1.0)。
另外,我已经让IT安装了Oracle数据访问组件。
在虚拟机中运行ODBCAD32时,drivers选项卡中没有列出Oracle驱动程序。
我相信安装的驱动程序失败了,这阻止了我的程序启动任何连接。但是,我没有证据,我想知道这里有学问的人是否能给我一些建议,以便获得……?
IDE错误消息的前几行为-
System.Exception was unhandled
Message="OCIEnvCreate failed with return code -1 but error message text was not available."
Source="System.Data.OracleClient"
StackTrace:
at System.Data.OracleClient.OciHandle..ctor(OciHandle parentHandle, HTYPE handleType, MODE ocimode, HANDLEFLAG handleflags)
at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OracleClient.OracleConnection.Open()
很抱歉这么啰嗦,但正如你所看到的,这个设置相当复杂…:)
我没有资格告诉IT他们的工作,但我会感谢任何建议,我可以传递?
我建议不要在数据提供程序和自定义sql上发疯。
获取一个支持Oracle(如NHibernate)的ORM,让它来完成工作。你唯一关心的是将表映射到你的对象,然后用一种中立的语言编写查询(现在nhibernate支持linq和lambda表达式,所以它不可能比这更容易)。
快乐编码:)
与ADO。如果Oracle驱动程序没有显示在ODBC小程序中,我不会感到惊讶-您正在使用OLEDB连接,这与ODBC不同。
看起来好像你正在使用System.Data。OracleClient,这是微软的Oracle客户端,而不是Oracle公司的客户端——该客户端已被弃用(微软将在未来停止支持它),我不建议您使用它。
请看下面的示例代码:http://www.carlprothman.net/Default.aspx?tabid=86#OracleNETDataProviderFromOracle
或在这里:http://www.connectionstrings.com/Providers/oracle-provider-for-ole-db-oraoledb
下面是一些连接字符串示例:http://www.connectionstrings.com/oracle
我是这样做的,但需要找到新的方法,因为OracleClient的一部分在4.0和4.5中已经过时了
string sqlquery = "select * from person";
DataGridView1.DataSource = PullTableResults(sqlquery);
private static DataTable PullTableResults(string sqlquery)
{
try
{
if (showMessages)
{
MessageBox.Show(sqlquery);
}
var conn = new OracleConnection(Oradb);
conn.Open();
var cmd = new OracleCommand(sqlquery, conn);
cmd.CommandType = CommandType.Text;
var dr = cmd.ExecuteReader();
var read = dr.Read();
var table = new DataTable();
var oda = new OracleDataAdapter(cmd);
int fill = oda.Fill(table);
conn.Close();
conn.Dispose();
return table;
}
catch (Exception ex)
{
const string Message = "Database Exception";
if (showMessages)
{
MessageBox.Show(Message + ex);
}
var table = new DataTable();
return table; // return empty table cause there was error
}
}