【问题标题】:What would be the most convenient way to connect Visual Studio 2005 (C#) to Oracle8?将 Visual Studio 2005 (C#) 连接到 Oracle8 最方便的方法是什么?
【发布时间】:2010-09-18 20:35:36
【问题描述】:

我正在寻找在 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 添加连接字符串。

【问题讨论】:

    标签: c# .net visual-studio winforms oracle


    【解决方案1】:

    如果您想监控表,您是否考虑过使用触发器?一个例子可能是:

    • 您的应用程序侦听 TCP 港口
    • 您在一个 甲骨文表
    • 触发器调用一些 Oracle Java 代码...
    • ...发送 发送到应用 TCP 的简单消息 港口
    • 消息可能只是一个 通知,然后您可以阅读 从表。或者,你 可以发送整个 SQL 影响表作为消息 有效载荷。

    这可能会更好。

    【讨论】:

      【解决方案2】:

      关于连接字符串,由于您使用的是 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

      【讨论】:

        【解决方案3】:

        我会警告不要像您建议的那样构建架构。每秒打开一个到数据库的新连接以轮询更改是一项昂贵的操作。如果您尝试将此 Windows 窗体应用程序扩展到少数用户之外,情况会变得更糟。

        相反,您应该研究可以支持监控此类活动的内置 Oracle 软件包。

        编辑:您的示例中的“WHERE ROWNUM=1”在这里没有用。 Oracle 不保证根据您的查询以任何特定方式对结果进行排序。

        您的问题实际上是一个架构问题。按照您的建议轮询数据库表并不是进行应用程序运行状况监控的好方法。至少,您最好在中间层甚至数据库中拥有一个组件,定期写入日志文件、Windows 事件日志、表等,基本上说“我还在听”,并且只轮询那个单一的来源。

        【讨论】:

        • 感谢您的建议,介意详细说明此类内置 Oracle 软件包吗?非常感谢!
        • 嗯,这真的取决于你想要完成什么。 “最后插入的记录”的一般性质使我认为您正在尝试构建自己的系统来监控应用程序的运行状况,或者可能尝试审核用户正在执行的操作。
        • 我想要完成的是构建一个可视化应用程序来监控一些表,并在最后一条记录插入到一​​组特定表中时向操作员显示。
        • 但真正的问题是,“向操作员显示最后插入的记录应该完成的内容是什么?”这就是推动您在这里做出决策的原因。
        • 所以答案是,向操作员显示最后插入的记录应该向她表明那里有活动,所以如果假设该流量延迟了 10 分钟,则说明存在问题在那里发布事件的应用程序。
        【解决方案4】:

        @洛斯卡斯 AFAIK ODP.NET 数据提供程序仅在 Oracle 9i 上受支持。 MS Oracle data provider 适用于 8.1.7 及更高版本。

        @BQ

        打开一个到数据库的新连接以每秒轮询更改是一项昂贵的操作。

        实际上连接并没有在 con.Open() 上打开。它只是从打开的连接池中获取的。 con.Close() 返回到池的连接。所以,这个连接处理确实没有错。

        【讨论】:

        • 我意识到连接会在 Close() 上返回到池中,但如果他计划让他的应用程序扩展到几个用户之外,这将带来问题。特别是如果(并且您无法从原始问题中真正看出)他每分钟都为每张桌子建立新连接。
        【解决方案5】:

        ConnectionStrings.com 拥有您想要的几乎所有类型的连接字符串,包括 Oracle

        【讨论】:

          【解决方案6】:

          这是我们环境中的一个示例:

          <add key="ODP.NET.ConnectionString" value="Password=abcdefg;Persist Security Info=True;User ID=abc123;Data Source=blah;"/>
          

          用户名和密码设置得当,数据源是我们要连接的 Oracle 的 TNSNAMES.ORA 中的条目。

          【讨论】:

            【解决方案7】:

            根据我使用 Oracle 10g 的经验......

            根据我对 Oracle 10g 的经验,我建议使用 Oracle 数据提供程序 (ODP.Net),而不是使用 Microsoft for Oracle 数据提供程序。微软多年没有更新,也不支持 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>
            

            我还开发了将连接信息存储在应用程序设置中的应用程序,这对我们的应用程序来说效果很好。

            【讨论】:

            • 介意将连接字符串存储在应用程序设置中,更重要的是,如何将其转换为字符串?提前致谢。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-19
            • 1970-01-01
            相关资源
            最近更新 更多