【问题标题】:.NET Oracle SQL Command not executing.NET Oracle SQL 命令未执行
【发布时间】:2017-04-25 16:19:43
【问题描述】:

我有一个函数可以从存储 rtf 字符串的 Oracle DB 中提取一个 CLOB 列。

public static string GetRTFNoteParsed(string limsNoteNum, string radioEnv)
{
    var rtfNote = "";
    string oradb = GetDBconfig(radioEnv);
    OracleConnection conn = new OracleConnection(oradb);

    using (conn)
    {
        try
        {
            conn.Open();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            if (limsNoteNum != null)
            {
                //rtf notes are not stored as plain text. This regex takes it out
                cmd.CommandText = "SELECT REGEXP_REPLACE(REGEXP_REPLACE(NOTE_CONTENTS, '\\(fcharset|colortbl)[^;]+;', ''), '(\\[^ ]+ ?)|[{}]', '') FROM LIMS_NOTES WHERE NOTE_ID = " + limsNoteNum;
                //cmd.CommandText = "SELECT NOTE_CONTENTS FROM LIMS_NOTES WHERE NOTE_ID = 86253";
            }
            cmd.CommandType = CommandType.Text;

            OracleDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    rtfNote = dr.GetValue(0).ToString();
                }
            }

            if (conn != null)
            {
                conn.Dispose();
            }
        }
        catch (Exception e4)
        {
            log.Error("Error with data pulling", e4);
            return (null);
        }
        finally
        {
            if (conn != null)
            {
                conn.Dispose();
            }
        }
        return rtfNote.ToString();

        }
    }

我知道问题与命令有关,因为注释掉的命令有效(但仍以 rtf 格式格式化)。我知道导致我出现问题的命令在 SQL Developer 中运行良好,注释掉的命令也是如此。但是当我在我的 .NET 应用程序中运行它时,我得到了“ORA-01002: fetch out of sequence”。有什么想法吗?

【问题讨论】:

标签: sql .net oracle oracle-sqldeveloper


【解决方案1】:

我无法重现您的错误ORA-01002: fetch out of sequence,但运行您的代码时确实收到了错误ORA-12725: unmatched parentheses in regular expression。解决方法是在查询中使用 C# 逐字字符串,换句话说,替换

cmd.CommandText = "SELECT REGEXP_REPLACE(REGEXP_REPLACE(......";

cmd.CommandText = @"SELECT REGEXP_REPLACE(REGEXP_REPLACE(......";

使用逐字字符串会阻止 C# 处理字符串中的反斜杠,尤其是将 \\ 替换为 \


此外,如果我不建议您使用参数化 SQL 而不是连接字符串,那将是我的疏忽,因为您的代码目前容易受到 SQL 注入的影响。替换

    cmd.CommandText = @"SELECT ... FROM LIMS_NOTES WHERE NOTE_ID = " + limsNoteNum;

    cmd.CommandText = @"SELECT ... FROM LIMS_NOTES WHERE NOTE_ID = :note_id";

并添加行

    cmd.Parameters.Add(new OracleParameter("note_id", OracleDbType.Varchar2, limsNoteNum, ParameterDirection.Input));

【讨论】:

  • 效果很好,感谢您的额外建议。即使在将命令设置为逐字字符串之后,C# 在设置命令文本时仍会随意将每个“\\”设置为“\\\\”。但无论哪种方式,该命令仍然有效,所以谢谢
  • 我不确定'C# 将每个“\\” 变成“\\\\”' 是什么意思。如果我在 VS 调试器中查看 SQL 文本的字符串值,我会看到这种行为,但这就是调试器的操作方式。请尝试将 SQL 文本写入您的日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
相关资源
最近更新 更多