适用于 Oracle 数据库的 Microsoft BizTalk 适配器提供了一组针对 Oracle 数据库工件的标准操作。 通过使用这些操作,可以执行调用 Oracle 函数或过程等操作,或者对表执行基本的 SQL 数据操作语言(DML)操作。 然而,可能会有由业务逻辑驱动的场景,要求你执行 Oracle 数据库适配器未提供的操作。 例如,你可能想要:
对 Oracle 数据库适配器未公开的数据库项目执行操作;比如,获取 Oracle SEQUENCE 的 CURVAL 或 NEXTVAL。
执行数据定义语言操作;例如,创建一个表格。
对设计时不存在的数据库构件执行操作;例如,更新由您的业务逻辑创建的临时表中的记录。
对表执行比 Oracle 数据库适配器提供的操作更复杂的 DML 操作;例如,执行包含 JOIN 子句的查询。
对于此类方案,Oracle 数据库适配器会提供 SQLEXECUTE 操作。 通过使用 SQLEXECUTE作,可以对 Oracle 数据库执行参数化 SQL 语句。 SQLEXECUTE作支持由参数集组成的输入参数块,使你能够为每个集执行一次相同的 SQL 语句。 SQLEXECUTE操作在通用记录集中返回SQL语句的结果。
关于本主题中使用的示例
本主题中的示例使用名为 TID_SEQ 的 Oracle SEQUENCE。 SDK 示例提供了用于生成此 SEQUENCE 的脚本。 有关 SDK 示例的详细信息,请参阅 SDK 中的示例。
WCF 客户端类
WCF 服务模型为 SQLEXECUTE 操作生成了专用的 WCF 客户端 SQLEXECUTEClient。 以下代码展示了 SQLEXECUTEClient 和调用 SQLEXECUTE 操作的方法签名。
public partial class SQLEXECUTEClient : System.ServiceModel.ClientBase<SQLEXECUTE>, SQLEXECUTE {
...
public microsoft.lobservices.oracledb._2007._03.GenRecordRow[] SQLEXECUTE(string SQLSTATEMENT, string PARAMETERSCHEMA, microsoft.lobservices.oracledb._2007._03.PARAMETERDATA[] PARAMETERSET);
}
SQLEXECUTE操作返回一个通用记录集。 此记录集包含 SQLEXECUTE作执行的语句返回的值(如果有)。 可以将一组输入参数集通过 PARAMETERDATA 对象的集合传递给 SQLEXECUTE 操作,其中每个 PARAMETERDATA 对象都包含一组作为字符串表示的输入参数。 以下代码显示了 PARAMETERDATA 集的定义。
namespace microsoft.lobservices.oracledb._2007._03 {
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class PARAMETERDATA : object, System.Runtime.Serialization.IExtensibleDataObject {
...
private string[] PARAMETERField;
...
[System.Runtime.Serialization.DataMemberAttribute()]
public string[] PARAMETER {
get {
return this.PARAMETERField;
}
set {
this.PARAMETERField = value;
}
}
}
}
调用SQLEXECUTE操作
若要使用 WCF 客户端来调用 SQLEXECUTE 操作,请执行以下步骤。
为目标表或视图生成 SQLEXECUTEClient 类。
重要
在“添加适配器服务引用”对话框中的“选择类别”窗格中,SQLEXECUTE操作位于根节点(/)下。
创建 SQLEXECUTEClient 类的实例,并调用 SQLEXECUTE 方法对 Oracle 数据库执行 SQL 语句。
有关如何在 Oracle 数据库适配器上创建 WCF 客户端类和调用作的更多详细信息,请参阅 使用 Oracle 数据库适配器的 WCF 服务模型概述。
以下示例通过执行以下 SQL 语句,使用 SQLEXECUTEClient 获取 Oracle SEQUENCE TID_SEQ 的下一个值:
SELECT tid_seq.nextval id from DUAL
然后,输出将写入控制台。
using (SQLEXECUTEClient sqlClient = new SQLEXECUTEClient("OracleDBBinding_SQLEXECUTE"))
{
sqlClient.ClientCredentials.UserName.UserName = "SCOTT";
sqlClient.ClientCredentials.UserName.Password = "TIGER";
try
{
sqlClient.Open();
}
catch (Exception ex)
{
Console.WriteLine("Error opening SQL client " + ex.Message);
throw;
}
microsoft.lobservices.oracledb._2007._03.GenRecordRow[] sequenceRec =
new microsoft.lobservices.oracledb._2007._03.GenRecordRow[0];
try
{
sequenceRec = sqlClient.SQLEXECUTE("SELECT tid_seq.nextval id from DUAL", null, null);
}
catch (Exception ex)
{
Console.WriteLine("Error executing SQL client " + ex.Message);
throw;
}
if (sequenceRec.Length > 0)
{
Console.WriteLine("TID_SEQUENCE value is {0}", sequenceRec[0].GenRecordColumn[0].ColumnValue);
}
else
{
Console.WriteLine("Couldn't get next TID_SEQUENCE value");
}
}