ExecuteNonQuery卡住而不会抛出错误

时间:2015-12-03 10:42:06

标签: c# oracle winforms ado.net executenonquery

这一定是一个愚蠢的问题,但不知道我的代码有什么问题 我试图在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:无效的字符,但现在它不会丢失任何错误只是卡住了。
此外,没有使用交易 请建议可能的方法来追踪它

4 个答案:

答案 0 :(得分:1)

首先获取字符串查询的值并在Oracle中运行它。你有一些用单引号包围的字符串值,有些像pValue1,pValue2则没有。我会从你的字符串查询中获取实际的Insert,然后运行它。

如果脚本中有问题,Oracle将挂起并不执行任何操作。这可以通过在PL SQL命令窗口中运行无效脚本来看出。它挂在那里等待回复。

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

答案 1 :(得分:1)

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

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);
}  

答案 2 :(得分:1)

当您使用字符串值传递日期并让连接隐含地转换为DATE类型时,连接上的NLS日期格式可能会出现问题。

对于长期实施而言,依靠隐式转换始终是危险的,尤其是对于日期格式存在风险,在这种格式中,由于环境设置,您的代码可以在一个已部署的实例上工作,但不能在另一个实例上工作。

因此,将日期字符串放入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() + ")";    

答案 3 :(得分:0)

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