简单的 Oracle 查询返回 OracleCommand.CommandText 无效
Posted
技术标签:
【中文标题】简单的 Oracle 查询返回 OracleCommand.CommandText 无效【英文标题】:Simple Oracle query returns OracleCommand.CommandText is invalid 【发布时间】:2021-12-29 17:54:21 【问题描述】:我有一条 SQL 语句,我尝试在 C# 和 Oracle 中运行,但出现 OracleCommand.CommandText 错误。 我的代码创建了一个外部表,其中从 .tsv 文件加载数据并将其插入到我的表 CI_FT 中。最后它删除了外部表。
我看不出有什么原因会显示 OracleCommand.CommandText。
查询如下:
CREATE TABLE STGMUAG.CI_FT_EXT
(FT_ID CHAR(12) DEFAULT ' ' NOT NULL ENABLE,
SIBLING_ID CHAR(12) DEFAULT ' ' NOT NULL ENABLE
)
ORGANIZATION EXTERNAL
(
DEFAULT DIRECTORY FLAT_FILES
ACCESS PARAMETERS
(
records delimited by '\\r\\n'
skip 1
fields terminated by '\\t'
)
LOCATION('STGMUAG_CI_FT.tsv')
);
INSERT INTO STGMUAG.CI_FT (
FT_ID,
SIBLING_ID
)
SELECT
FT_ID,
SIBLING_ID
FROM STGMUAG.CI_FT_EXT;
DROP TABLE STGMUAG.CI_FT_EXT;
这是我的 C# 脚本
public void ExecNonQuery(string sqlStmt, OracleConnection con, ref string currentSql)
try
var sqlArr = sqlStmt.Split(';');
foreach (string sql in sqlArr)
currentSql = sql;
OracleCommand cmd = new OracleCommand(sql, con);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
bool fireAgain = false;
Dts.Events.FireInformation(0, "PSRM Execute SQL", string.Format("SQL command 0 executed successfully.", sql), "", 0, ref fireAgain);
catch (Exception e)
Dts.Events.FireError(0, "PSRM Execute SQL", "SQL command failed. "+ e.Message, null,0);
throw;
【问题讨论】:
您的代码将您的脚本分成 3 个语句。这三个语句中的哪一个是失败的?我不知道你为什么每次都要创建和删除表——通常你只需要做一次。 @CaiusJard 我应该在哪里添加 RemoveEmptyEntries?我想检查添加是否可以修复它。可能是第 4 条语句,即空字符串,可能导致它。 我很难确定是哪个 sql 导致了错误。 在日志中说:currentSql = "" 【参考方案1】:您可以执行以下操作之一:
删除 SQL 字符串末尾的最后一个分号 致电sqlStmt.Trim().Split(new[]';', StringSplitOptions.RemoveEmptyEntries)
将if(string.IsNullOrWhiteSpace(sql)) continue;
放在循环的第一行
后 2 个代码有点多,但如果您有一天不小心在字符串中输入了 ;;
,它们将阻止此错误再次出现。只有第三个选项可以防止输入错误 ; ;
我很难确定是哪个 sql 导致了错误
小贴士,也可以考虑这样的事情,也许:
Dts.Events.FireError(0, "PSRM Execute SQL", "SQL command failed. "+ e.Message+
" the faulting SQL was:" + currentSql, null, 0);
【讨论】:
删除分号就可以了。谢谢! 好地方。 Oracle SQL 没有;
字符。以上是关于简单的 Oracle 查询返回 OracleCommand.CommandText 无效的主要内容,如果未能解决你的问题,请参考以下文章