【发布时间】:2011-05-14 03:13:01
【问题描述】:
我知道有人问过这个问题before,但这些解决方案似乎不适用于我。
我目前正在尝试这样做:
- 为 oracle 构建“CREATE PROCEDURE”脚本字符串
- 使用企业库 5.0 创建 SQL 命令并将此字符串作为参数传递
- 将过程保存在 oracle 数据库中
到目前为止,第 3 点似乎有效,如果我打开 SQL Developer 并展开过程树列表,那么我实际上可以看到该过程,但带有红十字圆圈,这意味着它虽然运行相同的代码,但它存在编译器错误,这非常小,在 SQL Developer 查询窗口中可以正常工作并编译它。我不确定 SQL Developer 在幕后做了什么,因为运行该“CREATE PROCEDURE”脚本不会引发任何错误,然后我可以查看并执行该过程,但不能从 C# 执行它。
我在开头的链接中读到我应该调用IDBCommand.Prepare(),但该方法仅在您的 SQLCommand.CommandType 类型为 StoredProcedure 时才相关,因为我实际上并没有调用过程而是运行纯sql to CREATE the procedure 然后这行不通,不过,我只是为了测试,创建了一个新命令,我分配给 StoredProcedure 然后在该命令上调用 Prepare() 方法,最后是 ExecuteNonQuery() 方法这会引发对象(存储过程)不可用的异常,这是有道理的,因为它尚未编译...
所以,我想知道是否有人真的知道如何创建一个过程并从 C# 编译它,我们目前正在使用企业库,但我不介意直接向 oracle 提供者“硬编码”一些东西,只要它可以工作.
顺便说一句,在告诉我从代码创建过程是一种不好的做法之前,我告诉你,不幸的是,这是客户的项目,我们没有做出任何决定,实际上我们正在尝试将东西从 SQL Server 迁移到甲骨文。
【问题讨论】:
-
好吧,事实证明,出于某种原因,如果您愿意,在具有 CREATE PROCEDURE 命令的字符串上使用回车符 (CR) 或换行符会导致此问题,所以,不知何故,这被预言机错误地解释了,谁知道是什么原因。无论如何,我“有点”通过执行 mySqlStr.Replace(System.Environment.NewLine, string.Empty) 解决了它,这样命令进入了由 10g Express 正确解析的单行。