将Visual Studio 2005(C#)连接到Oracle8最方便的方法是什么
本文关键字:Oracle8 方便 是什么 方法 连接 Studio Visual 2005 | 更新日期: 2023-09-27 17:48:52
我正在寻找在Oracle 8和Visual Studio 2005应用程序之间建立连接的最佳实践。目标是用C#编写的Windows窗体应用程序,该应用程序每秒访问数据库一次,以监视表查找其最后插入的记录。我正在考虑使用"应用程序设置"将连接字符串存储在那里,但我很想听听你们的意见。提前感谢!
这是一个非常初级的草案:
using System.Data;
using System.Data.OracleClient;
try
{
StringBuilder str = new StringBuilder();
string ora = Properties.Settings.Default.OracleConnectionString;
OracleConnection con = new OracleConnection(ora);
OracleCommand cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT timestamp FROM jde_out WHERE rownum = 1";
cmd.CommandType = CommandType.Text;
con.Open();
OracleDataReader rdr = cmd.ExecuteReader();
rdr.Read();
str.AppendLine(cmd.ExecuteScalar().ToString());
this.lblJDEtime.Text = str.ToString();
rdr.Close();
con.Close();
}
catch (OracleException err)
{
MessageBox.Show("Exception caught:'n'n" + err.ToString());
}
我刚刚更新了执行连接所需的代码。将异常类型更改为更具体的OracleException。通过Properties.Settings.
ConnectionStrings.com几乎拥有您想要的所有类型的连接字符串,包括Oracle。
下面是我们环境中的一个示例:
<add key="ODP.NET.ConnectionString" value="Password=abcdefg;Persist Security Info=True;User ID=abc123;Data Source=blah;"/>
用户名和密码设置正确,数据源是我们连接到的Oracle TNSNAMES.ORA中的条目。
基于我使用Oracle 10g的经验。。。。
根据我使用Oracle 10g的经验,我建议使用Oracle数据提供程序(ODP.Net),而不要使用Microsoft for Oracle数据提供器。微软的已经好几年没有更新了,也不支持Oracle10g中的所有内容,所以我肯定会在Oracle8中查看一下。
按照Microsoft关于app.config文件中连接字符串的指导,您应该将其存储为:
<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings>
<clear />
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
</configuration>
我还使用了存储在应用程序设置中的连接信息的应用程序,这对我们的应用程序来说很好。
@LoscasAFAIK ODP.NET数据提供程序仅在Oracle 9i以上版本上受支持。MS Oracle数据提供程序适用于8.1.7及更高版本。
@BQ
打开数据库的新连接以每秒轮询更改是一项昂贵的操作。
实际上,这个连接不是在con.Open()上打开的。它只是从打开的连接池中获取的。con.Close()返回到池的连接。因此,这种连接处理确实没有什么问题。
我警告不要像您建议的那样构建体系结构。打开数据库的新连接以每秒轮询更改是一项昂贵的操作。如果您试图将此Windows窗体应用程序扩展到少数用户之外,情况会更糟。
相反,您应该研究可以支持监视此类活动的内置Oracle软件包。
编辑:您的示例中的"WHERE ROWNUM=1"在这里没有用处。Oracle不能保证根据您的查询以任何特定的方式对结果进行排序。
您的问题实际上是一个体系结构问题。按照您的建议轮询数据库表不是进行应用程序运行状况监视的好方法。至少,您最好让一个位于中间层的组件,甚至数据库,定期写入日志文件、Windows事件日志、表等,这些文件基本上说"我仍在听",并且只轮询单个源。
关于连接字符串,由于您使用的是System.Data.OracleClient,我还建议格式化Oracle连接字符串,使其独立于tnsname.ora:
string connectionString = @"
SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP
(HOST=OracleHost)(PORT=OraclePort))
(CONNECT_DATA=(SERVICE_NAME=OracleServiceName)))
;uid=UserID;pwd=Password;";
您可以将其存储在App.config文件中,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="My.Database.Connection" value="SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP
(HOST=OracleHost)(PORT=OraclePort))
(CONNECT_DATA=(SERVICE_NAME=OracleServiceName)))
;uid=UserID;pwd=Password;" />
</appSettings>
</configuration>
然后使用访问
connectionString = ConfigurationSettings.AppSettings["My.Database.Connection"];
仅供参考,以下是我关于这个主题的博客文章:使用ADO.NET 快速而肮脏地连接到Oracle
如果要监视表,是否考虑使用触发器?例如:
- 您的应用程序在TCP上侦听端口
- 您在Oracle表
- 触发器调用一些Oracle Java代码
- 。。。发送发送到应用程序TCP的简单消息端口
- 信息可能只是通知,然后您可以阅读从表中选择。或者,您可以发送整个SQL作为消息影响了表有效载荷
这可能会更好。