[英]How can I get output value from the stored procedure in C# using Entity Framework
[英]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.