标签: oraclecommand

使用C#和ODP.NET执行Oracle事务

我糊涂了.从表面上看,在C#中执行事务似乎很简单.从这里:

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm

string constr = "User Id=scott;Password=tiger;Data Source=oracle";
OracleConnection con = new OracleConnection(constr);
con.Open();

OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT COUNT(*) FROM MyTable";

// Start a transaction
OracleTransaction txn = con.BeginTransaction(
  IsolationLevel.ReadCommitted);

try
{
  // Insert the same row twice into MyTable
  cmd.CommandText = "INSERT INTO MyTable VALUES (1)";
  cmd.ExecuteNonQuery();
  cmd.ExecuteNonQuery(); // This may throw an exception
  txn.Commit();
}....
Run Code Online (Sandbox Code Playgroud)

因此,创建一个连接,在该连接上开始一个事务,然后关闭,直到你想要提交或回滚.

但是,其他来源,例如:

https://forums.oracle.com/thread/319121

提倡设置OracleCommand对象本身的Transaction属性.例如

cmd.Transaction = txn;
Run Code Online (Sandbox Code Playgroud)

还有其他消息来源说这个属性是只读的.它实际上并不是只读的,但似乎没有任何地方可以清楚地说出它的作用.

因此,我的困惑是OracleCommand对象上存在Transaction属性似乎表明它应该用作执行该命令作为事务的一部分,但Oracle自己的文档不使用此属性.那有什么用呢?

所以我的问题是:

  1. 我是否需要设置OracleCommand的Transaction属性,如果是,那究竟是做什么的?
  2. 如果我在连接上启动了一个事务,那么即使我没有在这些命令上设置Transaction属性,那么在该连接上执行所有后续命令(直到提交或回滚)为该事务的一部分?

c# transactions oracle11g oraclecommand

11
推荐指数
1
解决办法
1万
查看次数

参数替换C#后查看确切的sql

有没有办法在执行后立即访问CommandText?我有以下代码:

cmd = new OracleCommand(sql.ToString(), conn);
cmd.Parameters.Add(new OracleParameter("@parm", parmValue));


OracleDataAdapter da = new OracleDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
Run Code Online (Sandbox Code Playgroud)

我需要知道的是在数据库中执行的sql命令字符串已经包含在sql中的parmValue值.换句话说,我一定不能在查询中看到字符串"@parm",而是查看它的值.

我需要这个,以便我可以将这个sql推送到日志数据库中以供将来参考.

提前致谢.

c# sql logging oraclecommand

8
推荐指数
1
解决办法
1923
查看次数

OracleCommand命令,ExecuteNonQuery问题

我必须清除oracle数据库中的某些表,但是当我遇到运行以下代码的问题时

public static void ClearDataTables(IList<string> tableNames)
        {
            string connectionString = "CONNECTIONSTRING";
            using (OracleConnection connection = new OracleConnection())
            {
                connection.ConnectionString = connectionString;
                connection.Open();
                foreach (string table in tableNames)
                {
                    OracleCommand command = connection.CreateCommand();
                    string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table);
                    command.CommandText = sql;
                    command.ExecuteNonQuery();
                }
                connection.Close();
            }
        }
Run Code Online (Sandbox Code Playgroud)

我用这个列表调用这个方法

ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"});
Run Code Online (Sandbox Code Playgroud)

它可以很好地运行前两个表,但是在第三个表上,它会卡住,应用程序会永远运行...

有趣的是,当我切换"GROUP_REPORT_EMAIL_LIST"和"GROUP_EQUIPMENT_GROUP_STN_XREF"时,应用程序在命中第二个表名后永远运行.

总而言之,当函数命中"GROUP_EQUIPMENT_GROUP_STN_XREF"时,该函数将永远运行.我已经验证了生成的SQL是通过在toad上测试它来实现的.

其他人遇到过这个问题?

编辑 - 前两个表确实在运行时被清除.

string connectionString = "CONNECTIONSTRING";
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                connection.Open();
                OracleCommand command = connection.CreateCommand();
                OracleTransaction trans …
Run Code Online (Sandbox Code Playgroud)

c# sql oracle10g oraclecommand executenonquery

4
推荐指数
1
解决办法
1万
查看次数

System.ObjectDisposedException:无法访问已处理的对象。对象名称:'OracleConnection' 重用 OracleConnection 对象

我想重用一个 OracleConnection 对象来进行更多的查询,所以我写了一个简单的类:

public static class DbConnectionsManager
    {
        /// <summary>
        /// 
        /// </summary>
        private static OracleConnection _dbConnection = null;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="aConnectionString"></param>
        /// <returns></returns>
        public static OracleConnection GetDatabaseConnection(string aConnectionString) 
        {
            try
            {
                if (_dbConnection == null)
                {
                    _dbConnection = new OracleConnection(aConnectionString);
                    _dbConnection.Open();
                    return _dbConnection;
                }

                if (_dbConnection.State == System.Data.ConnectionState.Closed)
                {
                    _dbConnection.ConnectionString = aConnectionString;
                    _dbConnection.Open();
                    return _dbConnection;
                }

                if (!_dbConnection.ConnectionString.Equals(aConnectionString))
                {
                    _dbConnection.Close();
                    _dbConnection.ConnectionString = aConnectionString;
                    _dbConnection.Open();
                    return _dbConnection;
                }

                return null;
            }
            catch (Exception e)
            { …
Run Code Online (Sandbox Code Playgroud)

c# oracle database-connection oraclecommand

3
推荐指数
1
解决办法
5735
查看次数

在"使用"块中,OracleConnection已关闭

在"使用"块中,如果在catch语句中发出System.Environment.Exit(0),则关闭OracleConnection?

例:

        OracleConnection oracleConnection = getOracleConnection();

        using (oracleConnection)
        {

            try
            {

                oracleConnection.Open();
                OracleCommand cmd = getApplicantsCmd(oracleConnection);
                OracleDataReader rdr = cmd.ExecuteReader(); 

                List<Applicant> applicants = new List<Applicant>();
                while (rdr.Read())
                {
                    Applicant applicant = new Applicant();
                    applicant.email = (string)rdr["GOREMAL_EMAIL_ADDRESS"];
                    applicants.Add(applicant);                   
                }

                return applicants;

            }
            catch (Exception ex)
            {
                Console.WriteLine("Failure getting applicant records: " + ex.Message);
                System.Environment.Exit(0);
                return null;
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果在查找记录时抛出异常,我希望执行停止.

有没有更好的方法来处理这个?

c# using try-catch exit oraclecommand

1
推荐指数
1
解决办法
5441
查看次数

打印执行的COMMITTED行数和/或命令数

在Oracle 9i中,在命令行程序中.如何dbms_output.put_line在前一个BEGIN和最后一个之间受影响的行数(更新/删除/插入)COMMIT

另外,如何打印已执行指令的数量(DML,DDL)?

oracle oracle9i oraclecommand

1
推荐指数
1
解决办法
956
查看次数