簡體   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