ExecuteNonQuery 卡住了,没有抛出错误

ExecuteNonQuery stuck without throwing error

这一定是个愚蠢的问题,但不知道我的代码有什么问题
我正在尝试在 oracle 数据库中插入一些数据,这是我的一段代码

try
{                
  OracleConnection con= new OracleConnection("Data Source=ANTI01T.world ;User Id=MyDB;Password=XYZ123 ;");
  con.Open();
  OracleCommand cmd = new OracleCommand();
  cmd.Connection =con;
  cmd.CommandText = query;
  cmd.CommandType = CommandType.Text;
  cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message);
}  

其中查询是

string query = @"INSERT INTO TB_RULE_HISTORY
                                (   N_RULE_ID,
                                    N_RULE_VERSION,
                                    DT_START_DATE,
                                    DT_END_DATE,
                                    N_CURRENCY_ID,
                                    N_VALUE1,
                                    N_VALUE2,
                                    N_PERCENTAGE,
                                    N_MONTHS)
                                    VALUES(" 
                                    + pRuleId.ToString() + " , "
                                    + pRuleVersion.ToString() + " , '"
                                    + DateTime.Now.Date.ToString("dd/MMM/yy") + "' , '"
                                    + pEndDate.ToString("dd/MMM/yy") + "' , "
                                    + pCurrencyId.ToString()+ " , "
                                    + pValue1.ToString()+ " , "
                                    + pValue2.ToString()+ " , "
                                    + pPercentage.ToString()+ " , "
                                    + pMonths.ToString() + ")";    

代码没有抛出任何错误它卡住了不知道在哪里
我所做的可能检查是我通过引用 Link1 从查询中删除了分号,因为使用 ; 执行查询给出 ORA-00911:无效字符,但现在它没有抛出任何错误,只是卡住了。
也没有正在使用的交易。
请建议可能的追踪方式

首先获取字符串查询的值,然后 运行 在 Oracle 中获取该值。有些字符串值用单引号括起来,有些像 pValue1、pValue2 没有。我将从您的字符串查询中获取实际的插入,然后 运行 that.

如果脚本中有时出现问题,Oracle 将挂起并且不执行任何操作。这可以通过 运行在 PL SQL 命令 window 中使用一个无效的脚本看出。它挂在那里等待响应。

其次,您是否运行使用与连接字符串相同的 ID 在 PL SQL 中插入?如果不是,则需要在插入内容前面加上 SCHEMA 名称前缀,例如 INSERT INTO SCHEMAX.TABLE_NAME。正如另一个人指出的那样,没有适用于 SQL 服务器的 Oracle 初始目录。

这可能是您的字符串值有问题 你可以尝试使用参数吗?它可以解决字符串值的问题 并且...出于多种原因使用参数是一种常见的做法

string query = "INSERT INTO TB_RULE_HISTORY
(   
N_RULE_ID,
N_RULE_VERSION,
DT_START_DATE,
DT_END_DATE,
N_CURRENCY_ID,
N_VALUE1,
N_VALUE2,
N_PERCENTAGE,
N_MONTHS)
VALUES(:pRuleId
,:pRuleVersion
,:pDateTimeStart
,:pDateTimeEnd
,:pCurrencyId
,:pValue1
,:pValue2
,:pPercentage
,:pMonths)";    


try
{                
  OracleConnection con= new OracleConnection("Data Source=ANTI01T.world ;User Id=AML_UAT;Password=AML_UAT;");
  con.Open();
  OracleCommand cmd = new OracleCommand();
  cmd.Connection =con;
  cmd.CommandText = query;
  cmd.CommandType = CommandType.Text;

  cmd.Parameters.AddWithValue("pRuleId", pRuleId);
  cmd.Parameters.AddWithValue("pRuleVersion", pRuleVersion);

  ...

  cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message);
}  

您的连接上的 NLS 日期格式可能存在问题,因为您使用字符串值传递日期并让连接隐式转换为 DATE 类型。

依赖隐式转换对于长期实施来说总是危险的,对于日期格式尤其危险,在这种情况下,由于环境设置,您的代码可以在一个部署的实例上运行,但不能在另一个部署的实例上运行。

因此,将您的日期字符串放入 SQL TO_DATE() 函数中,并明确指定格式。我还建议使用四位数年份来输入任何历史日期(出生日期等)或未来日期,因为让数据库在不知道数据上下文的情况下猜测世纪可能会导致不正确的结果。

string query = @"INSERT INTO TB_RULE_HISTORY
                                (   N_RULE_ID,
                                    N_RULE_VERSION,
                                    DT_START_DATE,
                                    DT_END_DATE,
                                    N_CURRENCY_ID,
                                    N_VALUE1,
                                    N_VALUE2,
                                    N_PERCENTAGE,
                                    N_MONTHS)
                                    VALUES(" 
                                    + pRuleId.ToString() + " , "
                                    + pRuleVersion.ToString() + " ,  TO_DATE('"
                                    + DateTime.Now.Date.ToString("dd/MMM/yy") + "','dd/mm/yy') , TO_DATE('"
                                    + pEndDate.ToString("dd/MMM/yy") + "','dd/mm/yy') , "
                                    + pCurrencyId.ToString()+ " , "
                                    + pValue1.ToString()+ " , "
                                    + pValue2.ToString()+ " , "
                                    + pPercentage.ToString()+ " , "
                                    + pMonths.ToString() + ")";    

我发现的问题是因为我的 oracle 事务不是自动提交。
因此它被绞死了。

我遇到了同样的问题。就我而言,我从另一个系统连接到我的数据库,并向现有的 table.

添加了一些列

之后为了验证和检查,我添加了一些新行,删除了一些行等,同时我是 debugging/executing 来自另一个系统的代码。

因此在执行 delete from tablename 时卡在了 cmd.ExecutenNonQuery()

所以从另一台 PC(我登录到我的数据库的地方),我试图退出数据库。

哪里被问到你做的交易没有变化..

你想承诺吗?还是回滚??

我选择了提交。然后我回到我的代码并执行它。在 ExecuteNonQuery.

处不再挂起

结论:数据库中的事务有问题