在WCF中使用ADO.NET和Oracle的示例

时间:2011-06-23 17:46:53

标签: wcf ado.net

没有任何Linq或Entity Framework,我想看一个在WCF中使用ADO.NET和Oracle的示例。我已经看过ABC和不同的合同,但是假设正在使用Restful WCF服务发送1到几个参数,我想看一个使用这种类型代码的例子:

            connection = new OracleConnection(EnvironmentSettings.connectionString);
            connection.Open();

            command = new OracleCommand("H16.WEB_FACILITY.get_facility_info", connection);
            command.CommandType = CommandType.StoredProcedure;

            // Input Parameters
            command.Parameters.Add("pfcode", OracleDbType.Varchar2, facilityCode, ParameterDirection.Input);
            // Output Parameters
            command.Parameters.Add("pfacility", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

            adapter = new OracleDataAdapter(command);
            DataSet ds = new DataSet();
            adapter.Fill(ds);

这样我就可以做一个WCF良好实践设计的CRUD操作。故障合同/数据合同等......我看到很多例子,但不是特别针对那些看起来如此简单的事情。我想这就是为什么这么多人仍然在做asmx ...我想要转换我正在进行的项目,我到处都看到大量的asmx网络服务,并希望有专家或者这样做的人指出我的正确的方向甚至更好地告诉我如何将ADO代码写入WCF ...提前感谢。

1 个答案:

答案 0 :(得分:1)

对于你究竟是什么意思略有说服力,但Linq和EntityFramework与WCF无关,并且范例在使用它们时没有改变。你可以做一些简单的事情:

[ServiceContract]
public class MyService
{

    [OperationContract]
    public DataSet LoadData(string facilityCode)
    {
        command = new OracleCommand("H16.WEB_FACILITY.get_facility_info", connection);
        command.CommandType = CommandType.StoredProcedure;

        // Input Parameters
        command.Parameters.Add("pfcode", OracleDbType.Varchar2, facilityCode, ParameterDirection.Input);
        // Output Parameters
        command.Parameters.Add("pfacility", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

        adapter = new OracleDataAdapter(command);
        DataSet ds = new DataSet();
        adapter.Fill(ds);

        return ds;
    }

}

在实践中,您可能希望使用[DataContract]类,并返回而不是DataSet,但唯一真正的改变是将结果读入真实类而不是DataSet,类似的东西:

[DataContract]
public class MyData
{
    [DataMember]
    public string Facility { get; set; }
}

然后你的服务方法返回而不是DataSet:

[OperationContract]
public MyData LoadData(string facilityCode)
{
    MyData data;
    // read from Oracle into data object...
    return data;
}

您还可以查看WCF Transaction Flow来控制数据库事务范围。这是让每个WCF服务操作都被捕获在自己的事务范围内的好方法,甚至可以根据需要从WCF客户端控制事务。


[FaultContract] s本身就是一个主题,但如果你谷歌的话,你可以找到一些很好的例子。基本上,您将设置自己的异常类型,然后将其添加到服务中,如:

[ServiceContract]
[FaultContract(typeof(MyException))]
public class MyService

并告诉WCF将MyException的序列化信息添加到WSDL中,然后您的操作可以throw new MyException();并且将序列化回客户端,这样他们就会得到您的异常。