【问题标题】:How to use OracleConnection with different queries C#如何使用具有不同查询的 OracleConnection C#
【发布时间】:2017-01-25 20:00:08
【问题描述】:

我不明白如何使用 OracleConnection 对象

将它用于所有查询?还是一个查询一个连接?

我的程序做:

1) 从 Oracle DB(光标)接收数据(~100.000 - 1.000.000 条记录)

2) 为每个选定的记录 (id) 更新另一个表中的值

什么是正确的:

1) 为每个查询创建 OracleConnection

using(OracleConnection connection = new OracleConnection(connectionString))  
{
    using(OracleCommand command = new OracleCommand(recieveSql, connection))
    {
        connection.Open();
        ...
        command.ExecuteNonQuery();
        ...
        using(OracleDataReader reader = command.ExecuteReader())
        {
            while(reader.Read())
            {
                int id = reader.GetInt32(0);
                string value = reader.GetInt32(1);
                UpdateRecord(id, value);
            }
        }
    }
}


private void UpdateRecord(int id, string value)
{
    using(OracleConnection connection = new OracleConnection(connectionString))  
    {
        using(OracleCommand command = new OracleCommand(updateSql, connection))
        {
            connection.Open();
            ...
            command.Parameters.AddWithValue("@id", id);
            command.Parameters.AddWithValue("@value", value);
            command.ExecuteNonQuery();
            ...
        }
    }
}

2) 对所有查询使用 1 个 OracleConnection

using(OracleConnection connection = new OracleConnection(connectionString))  
{
    using(OracleCommand command = new OracleCommand(recieveSql, connection))
    {
        connection.Open();
        ...
        command.ExecuteNonQuery();
        ...
        using(OracleDataReader reader = command.ExecuteReader())
        {
            while(reader.Read())
            {
                int id = reader.GetInt32(0);
                string value = reader.GetInt32(1);
                UpdateRecord(connection, id, value);
            }
        }
    }
}


private void UpdateRecord(OracleConnection connection, int id, string value)
{
    using(OracleCommand command = new OracleCommand(updateSql, connection))
    {
        ...
        command.Parameters.AddWithValue("@id", id);
        command.Parameters.AddWithValue("@value", value);
        command.ExecuteNonQuery();
        ...
    }
}

【问题讨论】:

  • 我会说所有这些更新打开 100.000 多个连接有明显的开销。但是,如果您没有为了这个问题而简化您的任务/代码,我会争论为什么要编写任何 C# 代码?从一个数据库到另一个数据库的简单 UPDATE 可以直接在 SQL 中完成。
  • 因为我想有机会在保存到数据库之前从程序中更改价值或用它做一些事情主要我只是想学习 C# - Oracle 通信和我的程序没有做一些有用的事情.. .

标签: c# oracle odac


【解决方案1】:

在你的情况下,我更喜欢第二个,只有 1 个数据库连接。

请记住,打开OracleConnection 在客户端和数据服务器端都是昂贵的。

通常,准则是 1 个线程 => 1 OracleConnection

如果您有多个线程或者您仍想使用多个OracleConnection,您可以定义一个OracleConnection 池,只需在连接字符串中设置一些参数。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2021-08-14
    • 2017-10-09
    • 2023-03-07
    • 2017-05-15
    相关资源
    最近更新 更多