执行非查询卡住没有抛出错误
本文关键字:出错 错误 查询 执行 | 更新日期: 2023-09-27 18:25:25
这一定是一个愚蠢的问题,但不知道我的代码
出了什么问题我正在尝试在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 这样的字符串值则不是。我会从您的字符串查询中获取实际的插入,然后运行它。
如果脚本有时出现问题,Oracle 将挂起并且不执行任何操作。这可以通过在 PL SQL 命令窗口中运行无效脚本来查看。它挂在那里等待回应。
其次,是否使用与连接字符串相同的 ID 在 PL SQL 中运行插入? 如果没有,则需要在插入物前面加上架构名称的前缀,例如插入到架构中。TABLE_NAME。 正如另一个人指出的那样,没有适用于SQL Server的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 格式可能存在问题,因为您传递带有字符串值的日期并让连接隐式转换为 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() + ")";
我发现的问题是由于我的预言机事务不是自动提交的。
因此,它被绞死了。
我遇到了同样的问题。就我而言,我从另一个系统连接到我的数据库,并向现有表添加了一些列。
之后进行验证和检查,我添加了一些新行,删除了一些行等,同时我正在从另一个系统调试/执行我的代码。
结果它在执行delete from tablename
时卡在cmd.ExecutenNonQuery()
。
因此,从另一台PC(我登录到数据库的地方(上,我尝试退出数据库。
要求你所做的交易保持不变的地方。
你想承诺吗?还是回滚??
我选择了提交。然后我回到我的代码并执行它。没有进一步挂在ExecuteNonQuery
.
结论:数据库中的事务有问题