我糊涂了.从表面上看,在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自己的文档不使用此属性.那有什么用呢?
所以我的问题是:
有没有办法在执行后立即访问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推送到日志数据库中以供将来参考.
提前致谢.
我必须清除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) 我想重用一个 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) 在"使用"块中,如果在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)
如果在查找记录时抛出异常,我希望执行停止.
有没有更好的方法来处理这个?
在Oracle 9i中,在命令行程序中.如何dbms_output.put_line在前一个BEGIN和最后一个之间受影响的行数(更新/删除/插入)COMMIT?
另外,如何打印已执行指令的数量(DML,DDL)?