C#作的WinForm程序,Oracle数据库,如何能够不用客户端安装Oracle Client

时间:2022-02-10 05:52:50
使用WebService比直接访问数据库慢6、7倍

数据库处理基本上都是存储过程调用,如果使用Remoting技术的话,该如何作?

24 个解决方案

#1


ODBC数据库引擎是系统自带的,使用它就不用安装Oracle客户端了,
不过我没有试过,仅供参考。

#2


表用ODBC,很慢的说,.NET不是提供了Oracle访问的类了吗,直接访问就是了

#3


两位看来都没有试过,无论ODBC还是System.Data.OracleClient,安装Oracle Net*Clinet都是先决条件

#4


你是说安装oracle client,这个问题是没法解决的,你必须安装他才能与oracle server连接,他是server和app的一个桥梁。
不象sql server,ms已经集成了。

#5


BCB中有ODAC控件,可直接通过TCP/IP访问Oracle,.Net中不知道有没有?

另外使用WebService的话只需在Web Server上装Oracle client,不用为每个WinForm宿主安装Oracle Client,但速度慢了很多,约1:7

使用Remoting不知情况如何,希望有经验的指点一下

#6


I'm sorry,确实没有试过
不过...你的问题和Remoting有什么关系?

#7


找到Oracle客户端所需的核心的大约26个DLL,将其拷入你的目标机器;

在目标机器的注册表中建立\Software\Oracle的项,并添加$Oracle_home
的键值。

试几次,应该可以的。

#8


不装怎么可以呢?

#9


你用Remoting,就可以不用每个客户端都安装oracle client
但需要在作为Remoting Host的那台服务器上需要安装oracle client.

#10


还有:
    如果不需要经过防火墙,最好用Remoting,速度,性能都比Web Service要好.

#11


有这个问题处理经验的大侠谈一下在Oracle数据库访问的具体问题中,Remoting封装什么对象更合适,仅仅封装OracleConnect是否可以,该如何作?

#12


可以把OracleConnect作为服务端激活对象发布。
其实你不如单独做一个class封装与数据库的连接。然后每次返回Dataset等等。这样可以比较方便。或者你就把microsoft的SQLHelper改一下,假定为OracleHelper,把所有static去掉。然后发布那个对象就可以了。
或者再进一步,把SQLHelp每个函数的ConnectString 记录成OracleHelper的属性。在使用前初始化。其他函数只是把static,把connectionstring(或者是一个OracleConnect)改成使用域就可以了

MSN:colinfly@hotmail.com

#13


我看楼主要是对Romoting不是很了解的话,还是用ODBC把,如果ODBC都不会配,那我佩服你了

下面有一些Oracle的连接方式

Oracle 
ODBC 


 New version:
"Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;" 


 Old version:
"Driver={Microsoft ODBC Driver for Oracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword;" 


 OLEDB, OleDbConnection (.NET) 


 Standard security:
"Provider=msdaora;Data Source=MyOracleDB;User Id=UserName;Password=asdasd;" 
This one's from Microsoft, the following are from Oracle
 Standard Security:
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=Username;Password=asdasd;" 


 Trusted Connection:
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;" 


 OracleConnection (.NET) 


 Standard:
"Data Source=Oracle8i;Integrated Security=yes"; 
This one works only with Oracle 8i release 3 or later
 Declare the OracleConnection:

C#:
using System.Data.OracleClient;
OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString = "my connectionstring";
oOracleConn.Open(); 

VB.NET:
Imports System.Data.OracleClient
Dim oOracleConn As OracleConnection = New OracleConnection()
oOracleConn.ConnectionString = "my connectionstring"
oOracleConn.Open() 

#14


BCB中有ODAC控件,可直接通过TCP/IP访问Oracle,.Net中不知道有没有?
===================================================================

我原来用过bcb,好象没注意这个odac控件,再说oracle client有几十M,这个控件能行吗?

#15


服务端:
TcpChannel chan;
chan = new TcpChannel(8089);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.SingleCall);

客户端:
System.Data.OracleClient.OracleConnection obj = (System.Data.OracleClient.OracleConnection)Activator.GetObject(typeof(System.Data.OracleClient.OracleConnection), "tcp://localhost:8089/SayHello");
try
{
  obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";
  string strSql = "select * from tab";
  System.Data.OracleClient.OracleDataAdapter oda = new   System.Data.OracleClient.OracleDataAdapter( strSql, obj );
  System.Data.DataSet ds = new DataSet();
  oda.Fill( ds );
  dataGrid1.DataSource = ds;
}
catch( System.Exception ee )
{
  MessageBox.Show( ee.Message );
}

输出错误提示:The ConnectionString property has not been initialized.

如何解?

#16


to: junqiang(笨笨) 
ODAC是一个第三方控件 http://www.crlab.com/
该公司有一个类似与System.Data.OracleClient的.Net组件,但只能通过OCI访问

#17


obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";
 是运行到这句出错吗?

#18


to: caozi(浩子) 
到: oda.Fill( ds );
obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";没出错,但似乎没有效果

#19


望这个话题继续讨论,UP一下

#20


我到www.crlab.com上看了一下,他还有个OraDirect .NET组件,这个是不是也可以直接访问Oracle数据库呢

#21


是不是你应用了RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.SingleCall);
它是掉用一次创建一次,obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";完了后它会释放了,
System.Data.OracleClient.OracleDataAdapter( strSql, obj );
obj.ConnectionString 这时是一个空值了。
改为RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.Singleton);试下。

#22


看了你的代码,你想把连接(connection)代理过来,这是不可以的,因为他不能跨进程。你可select在服务器做,把dataset传到client。

#23


>我到www.crlab.com上看了一下,他还有个OraDirect .NET组件,
>这个是不是也可以直接访问Oracle数据库呢

别提这个了。我用过他针对pg的数据库类。结果,免费版的一次查询最多只能够返回六列。

#24


caozi(浩子) :
WellKnownObjectMode.SingleCall改为WellKnownObjectMode.Singleton
错误提示如下
权限被拒绝: 无法远程调用非公共或静态方法。
想来应该是 junqiang(笨笨) 说的问题

genuinekl(genuinekl) :
该组件类似与System.Data.OracleClient,目前只能通过OCI访问,而且在我简单的测试中都出Bug

#1


ODBC数据库引擎是系统自带的,使用它就不用安装Oracle客户端了,
不过我没有试过,仅供参考。

#2


表用ODBC,很慢的说,.NET不是提供了Oracle访问的类了吗,直接访问就是了

#3


两位看来都没有试过,无论ODBC还是System.Data.OracleClient,安装Oracle Net*Clinet都是先决条件

#4


你是说安装oracle client,这个问题是没法解决的,你必须安装他才能与oracle server连接,他是server和app的一个桥梁。
不象sql server,ms已经集成了。

#5


BCB中有ODAC控件,可直接通过TCP/IP访问Oracle,.Net中不知道有没有?

另外使用WebService的话只需在Web Server上装Oracle client,不用为每个WinForm宿主安装Oracle Client,但速度慢了很多,约1:7

使用Remoting不知情况如何,希望有经验的指点一下

#6


I'm sorry,确实没有试过
不过...你的问题和Remoting有什么关系?

#7


找到Oracle客户端所需的核心的大约26个DLL,将其拷入你的目标机器;

在目标机器的注册表中建立\Software\Oracle的项,并添加$Oracle_home
的键值。

试几次,应该可以的。

#8


不装怎么可以呢?

#9


你用Remoting,就可以不用每个客户端都安装oracle client
但需要在作为Remoting Host的那台服务器上需要安装oracle client.

#10


还有:
    如果不需要经过防火墙,最好用Remoting,速度,性能都比Web Service要好.

#11


有这个问题处理经验的大侠谈一下在Oracle数据库访问的具体问题中,Remoting封装什么对象更合适,仅仅封装OracleConnect是否可以,该如何作?

#12


可以把OracleConnect作为服务端激活对象发布。
其实你不如单独做一个class封装与数据库的连接。然后每次返回Dataset等等。这样可以比较方便。或者你就把microsoft的SQLHelper改一下,假定为OracleHelper,把所有static去掉。然后发布那个对象就可以了。
或者再进一步,把SQLHelp每个函数的ConnectString 记录成OracleHelper的属性。在使用前初始化。其他函数只是把static,把connectionstring(或者是一个OracleConnect)改成使用域就可以了

MSN:colinfly@hotmail.com

#13


我看楼主要是对Romoting不是很了解的话,还是用ODBC把,如果ODBC都不会配,那我佩服你了

下面有一些Oracle的连接方式

Oracle 
ODBC 


 New version:
"Driver={Microsoft ODBC for Oracle};Server=OracleServer.world;Uid=Username;Pwd=asdasd;" 


 Old version:
"Driver={Microsoft ODBC Driver for Oracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword;" 


 OLEDB, OleDbConnection (.NET) 


 Standard security:
"Provider=msdaora;Data Source=MyOracleDB;User Id=UserName;Password=asdasd;" 
This one's from Microsoft, the following are from Oracle
 Standard Security:
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=Username;Password=asdasd;" 


 Trusted Connection:
"Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;" 


 OracleConnection (.NET) 


 Standard:
"Data Source=Oracle8i;Integrated Security=yes"; 
This one works only with Oracle 8i release 3 or later
 Declare the OracleConnection:

C#:
using System.Data.OracleClient;
OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString = "my connectionstring";
oOracleConn.Open(); 

VB.NET:
Imports System.Data.OracleClient
Dim oOracleConn As OracleConnection = New OracleConnection()
oOracleConn.ConnectionString = "my connectionstring"
oOracleConn.Open() 

#14


BCB中有ODAC控件,可直接通过TCP/IP访问Oracle,.Net中不知道有没有?
===================================================================

我原来用过bcb,好象没注意这个odac控件,再说oracle client有几十M,这个控件能行吗?

#15


服务端:
TcpChannel chan;
chan = new TcpChannel(8089);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.SingleCall);

客户端:
System.Data.OracleClient.OracleConnection obj = (System.Data.OracleClient.OracleConnection)Activator.GetObject(typeof(System.Data.OracleClient.OracleConnection), "tcp://localhost:8089/SayHello");
try
{
  obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";
  string strSql = "select * from tab";
  System.Data.OracleClient.OracleDataAdapter oda = new   System.Data.OracleClient.OracleDataAdapter( strSql, obj );
  System.Data.DataSet ds = new DataSet();
  oda.Fill( ds );
  dataGrid1.DataSource = ds;
}
catch( System.Exception ee )
{
  MessageBox.Show( ee.Message );
}

输出错误提示:The ConnectionString property has not been initialized.

如何解?

#16


to: junqiang(笨笨) 
ODAC是一个第三方控件 http://www.crlab.com/
该公司有一个类似与System.Data.OracleClient的.Net组件,但只能通过OCI访问

#17


obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";
 是运行到这句出错吗?

#18


to: caozi(浩子) 
到: oda.Fill( ds );
obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";没出错,但似乎没有效果

#19


望这个话题继续讨论,UP一下

#20


我到www.crlab.com上看了一下,他还有个OraDirect .NET组件,这个是不是也可以直接访问Oracle数据库呢

#21


是不是你应用了RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.SingleCall);
它是掉用一次创建一次,obj.ConnectionString = "user id=scott;data source=DEV;password=tiger";完了后它会释放了,
System.Data.OracleClient.OracleDataAdapter( strSql, obj );
obj.ConnectionString 这时是一个空值了。
改为RemotingConfiguration.RegisterWellKnownServiceType( typeof(System.Data.OracleClient.OracleConnection), "SayHello", WellKnownObjectMode.Singleton);试下。

#22


看了你的代码,你想把连接(connection)代理过来,这是不可以的,因为他不能跨进程。你可select在服务器做,把dataset传到client。

#23


>我到www.crlab.com上看了一下,他还有个OraDirect .NET组件,
>这个是不是也可以直接访问Oracle数据库呢

别提这个了。我用过他针对pg的数据库类。结果,免费版的一次查询最多只能够返回六列。

#24


caozi(浩子) :
WellKnownObjectMode.SingleCall改为WellKnownObjectMode.Singleton
错误提示如下
权限被拒绝: 无法远程调用非公共或静态方法。
想来应该是 junqiang(笨笨) 说的问题

genuinekl(genuinekl) :
该组件类似与System.Data.OracleClient,目前只能通过OCI访问,而且在我简单的测试中都出Bug