我正在寻找在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());
}
我刚刚更新了执行连接所需的代码。将Exception类型更改为更具体的OracleException。通过Properties.Settings添加了连接字符串。
答案 0 :(得分:4)
ConnectionStrings.com几乎包含了您需要的所有类型的连接字符串,包括Oracle。
答案 1 :(得分:2)
以下是我们环境中的示例:
<add key="ODP.NET.ConnectionString" value="Password=abcdefg;Persist Security Info=True;User ID=abc123;Data Source=blah;"/>
如果用户名和密码设置得恰当,而数据源是我们要连接的Oracle TNSNAMES.ORA的条目。
答案 2 :(得分:1)
根据我对Oracle 10g的经验....
我建议使用Oracle数据提供程序(ODP.Net),而不是根据我使用Oracle 10g的经验使用Microsoft for Oracle数据提供程序。 Microsoft已经多年没有更新,并且不支持Oracle 10g中的所有内容,所以我肯定会检查Oracle 8中的内容。
在app.config文件中的连接字符串上Microsoft guidance之后,您应该将其存储为:
<?xml version='1.0' encoding='utf-8'?>
<configuration>
<connectionStrings>
<clear />
<add name="Name"
providerName="System.Data.ProviderName"
connectionString="Valid Connection String;" />
</connectionStrings>
</configuration>
我还使用存储在应用程序设置中的连接信息处理应用程序,这对我们的应用程序运行良好。
答案 3 :(得分:1)
@Loscas 仅在Oracle 9i上支持AFAIK ODP.NET数据提供程序。 MS Oracle data provider适用于8.1.7及更高版本。
@BQ
打开与数据库的新连接以每秒轮询一次更改是一项昂贵的操作。
实际上con.Open()上没有打开连接。它只是从开放式连接池中取出。 con.Close()返回到池的连接。所以,这种连接处理确实没有错。
答案 4 :(得分:0)
我会警告不要像你建议的那样建造一个建筑。打开与数据库的新连接以每秒轮询更改是一项昂贵的操作。如果您尝试将此Windows窗体应用程序扩展到少数用户之外,情况会变得更糟。
相反,您应该查看可以支持监控此类活动的内置Oracle软件包。
编辑:你的例子中的“WHERE ROWNUM = 1”在这里没用。 Oracle不保证根据您的查询以任何特定方式订购结果。
您的问题确实是一个架构问题。如您所建议的轮询数据库表不是进行应用程序运行状况监视的好方法。至少,你最好让中间层甚至数据库中的组件定期写入日志文件,Windows事件日志,表格等,基本上说“我还在听”,只有这是一个独特的来源。
答案 5 :(得分:0)
如果要监控表,是否考虑使用触发器?一个例子可能是:
这可能会更好。
答案 6 :(得分:0)
关于连接字符串,由于您使用的是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"];
仅供参考,这是我关于这个主题的博客文章: Quick and dirty connection to Oracle using ADO.NET