繁体   English   中英

如何在C#中从Web服务的存储过程中获取多个输出参数?

[英]How can I get multiple output parameters from a stored procedure in a web service in C#?

我在C#中有一个Web服务,我使用它从表中进行查询,但是我想创建一个WebMethod来调用存储过程并获取多个输出参数。 我可以用输出参数执行它,当我尝试用输出参数调用它时它不起作用。

这是一个示例,我想获取更多2个参数。

存储过程:

CREATE OR REPLACE PROCEDURE O_CAPEREZ.GIO_SP (
    VNOMBRE IN VARCHAR2,
    SALUDO  OUT VARCHAR2 )
AS
BEGIN
    INSERT INTO G_PRUEBA_SP(NOMBRE)
    VALUES (vNOMBRE);

    SALUDO:= ('Hello: ' || vNOMBRE);
END;

这是我在Web服务中的代码,当我使用输出变量执行它时,出现此错误

[HYC00] [Oracle] [ODBC]未实现可选功能

C#代码:

[WebMethod]
public string AP_Data(string curp)
{
     string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

     using (OdbcConnection con = new OdbcConnection(constr))
     {
            OdbcCommand cmd = new OdbcCommand("{CALL GIO_SP(?,?)}", con);

            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@vNOMBRE", (curp));
            cmd.Parameters.Add("@vNOMBRE", OdbcType.VarChar, 18);

            cmd.Connection.Open();
            cmd.ExecuteNonQuery();

            cmd.Parameters["@SALUDO"].Direction = ParameterDirection.ReturnValue;
            cmd.Connection.Close();

            string ret = Convert.ToString(cmd.Parameters["@SALUDO"].Value);
            return ret;   
    }
}

即使不打算在此处设置值,也必须将参数添加到列表中:

 cmd.Parameters.Add("@SALUDO", OdbcType.VarChar, 18).Direction = ParameterDirection.Output;

我不知道Oracle的风格有所不同,但是在SQL中,我使用ParameterDirection.ReturnValue而不是ParameterDirection.Output

这是我在MS SQL Server 2008中执行的操作,但是请注意,数据类型和创建的变量的长度必须与表中的相同

存储的proc创建代码

USE DATABASE DATABASE_NAME
GO
CREATE PROC SP_METHOD
@ID_CATIGORY INT,
@NAME VARCHAR (50),
@DESCRIPTION VARCHAR (50)   
AS
INSERT INTO TABLE_NAME
       ([ID_CAT]
       ,[NAME_PRODUCT]
       ,[DESC_PRODUCT]          
       )
 VALUES
       ( @ID_CATIGORY 
        ,@NAME 
        ,@DESCRIPTION )        
       GO

在C#代码中

// Create SqlConnection 
       SqlConnection conn= new SqlConnection(@"Server=server_name; 
     DataBase=your_data_base_name;Integrated Security=false;User 
       Id=user_id;Password=password");

    // Open the Connection 
if (sqlconnection.State != ConnectionState.Open)
        {
            conn= .Open();
        }
// execute stored_procedure method don't change this 
public void ExecuteCommand(string stored_procedure, SqlParameter[] param)
    {
        SqlCommand sqlcomd = new SqlCommand();
        sqlcomd.CommandType = CommandType.StoredProcedure;
        sqlcomd.CommandText = stored_procedure;
        sqlcomd.Connection = sqlconnection;
        if (param !=null)
        {
            sqlcomd.Parameters.AddRange(param);
        }
        sqlcomd.ExecuteNonQuery();
    }
      // close connection method
      public void close_conn()
    {
        if (sqlconnection.State == ConnectionState.Open)
        {
            sqlconnection.Close();
        }
    }      
       // execute and retrieving data Method    
    public void Add_product(int ID_cat ,string Name_Product,string 
     Des_Product)
    {
       SqlParameter[] param = new SqlParameter[3];

        param[0] = new SqlParameter("@ID_CAT", SqlDbType.Int);
        param[0].Value = ID_cat;

        param[1] = new SqlParameter("@NAME_PRODUCT", SqlDbType.VarChar, 50);
        param[1].Value = Name_Product;

        param[2] = new SqlParameter("@DESC_PRODUCT", SqlDbType.VarChar, 50);
        param[2].Value = Des_Product;  

        ExecuteCommand("StoredProcedure_name", param);
        close_conn();
      }

最后你可以调用这个函数

   Add_product(Convert.ToInt32(ComboBox.SelectedValue),txt_name.Text, 
   txt_desc.Text);

如果有你不明白的部分

我已经看到了许多方法来实现这一目标。

一种方法是在存储过程中通过管道定界您的select语句,然后使用"Value1|Value2".Split('|')[0]获得Value1。

您还可以返回一个表,而不是使用多个参数

DataTable table = new DataTable();
DataAdapter adapter = new DataAdapter(cmd);
adapter.fill(table);
return table.Rows[0]["Greeting"] + table.Rows[0]["Name"];

在第二个示例中,您可以根据需要返回任意数量的“参数”,但是稍后必须在代码中将它们分配给它们的正确位置。

我也看到了实现此功能的XML方法,但是由于我个人并不认为这是一种很好的方法,因此在此不提供代码。 我所看到的完成方式是向父标记添加一堆XML属性,然后稍后返回并在代码中稍后找到每个标记的值。

在MYSQL中,它将像这样

CREATE PROCEDURE O_CAPEREZ.GIO_SP (
    @vNOMBRE VARCHAR(50))
AS
BEGIN
    INSERT INTO G_PRUEBA_SP(NOMBRE)
    VALUES (@vNOMBRE);

    select 'Hola' as Greeting, @vNOMBRE as Name
END

还请注意Marc_s的评论

在调用.ExecuteNonQuery()之前,需要设置参数的.Direction。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM