【问题标题】:Simple Oracle query returns OracleCommand.CommandText is invalid简单的 Oracle 查询返回 OracleCommand.CommandText 无效
【发布时间】: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 = ""

标签: c# sql oracle


【解决方案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 没有; 字符。
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多