Récupère la valeur du paramètre de sortie dans ADO.NET

Ma procédure stockée a un paramètre de sortie:

@ID INT OUT 

Comment puis-je récupérer ceci en utilisant ado.net?

 using (SqlConnection conn = new SqlConnection(...)) { SqlCommand cmd = new SqlCommand("sproc", conn); cmd.CommandType = CommandType.StoredProcedure; // add parameters conn.Open(); // *** read output parameter here, how? conn.Close(); } 

L’autre réponse montre ceci, mais vous devez simplement créer un SqlParameter , définir la Direction sur Output et l’append à la collection Parameters SqlCommand . Ensuite, exécutez la procédure stockée et obtenez la valeur du paramètre.

En utilisant votre exemple de code:

 // SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s using (SqlConnection conn = new SqlConnection(connectionSsortingng)) using (SqlCommand cmd = new SqlCommand("sproc", conn)) { // Create parameter with Direction as Output (and correct name and type) SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(outputIdParam); conn.Open(); cmd.ExecuteNonQuery(); // Some various ways to grab the output depending on how you would like to // handle a null value returned from the query (shown in comment for each). // Note: You can use either the SqlParameter variable declared // above or access it through the Parameters collection by name: // outputIdParam.Value == cmd.Parameters["@ID"].Value // Throws FormatException int idFromSsortingng = int.Parse(outputIdParam.Value.ToSsortingng()); // Throws InvalidCastException int idFromCast = (int)outputIdParam.Value; // idAsNullableInt remains null int? idAsNullableInt = outputIdParam.Value as int?; // idOrDefaultValue is 0 (or any other value specified to the ?? operator) int idOrDefaultValue = outputIdParam.Value as int? ?? default(int); conn.Close(); } 

Soyez prudent lorsque vous obtenez les Parameters[].Value , car le type doit être converti d’un object à ce que vous déclarez. Et le SqlDbType utilisé lorsque vous créez le SqlParameter doit correspondre au type dans la firebase database. Si vous voulez simplement le sortir sur la console, vous pouvez simplement utiliser Parameters["@Param"].Value.ToSsortingng() (explicitement ou implicitement via un appel Console.Write() ou Ssortingng.Format() ).

EDIT: Plus de 3,5 ans et près de 20 000 vues et personne n’a pris la peine de mentionner qu’il n’avait même pas été compilé pour la raison spécifiée dans mon commentaire “attention” dans le message original. Agréable. Corrigé sur la base des bons commentaires de @Walter Stabosz et @Stephen Kennedy et de faire correspondre le code de mise à jour modifié dans la question de @abatishchev.

Pour ceux qui cherchent à faire quelque chose de similaire en utilisant un lecteur avec la procédure stockée, notez que le lecteur doit être fermé pour récupérer la valeur de sortie.

 using (SqlConnection conn = new SqlConnection()) { SqlCommand cmd = new SqlCommand("sproc", conn); cmd.CommandType = CommandType.StoredProcedure; // add parameters SqlParameter outputParam = cmd.Parameters.Add("@ID", SqlDbType.Int); outputParam.Direction = ParameterDirection.Output; conn.Open(); using(IDataReader reader = cmd.ExecuteReader()) { while(reader.Read()) { //read in data } } // reader is closed/disposed after exiting the using statement int id = outputParam.Value; } 

Pas mon code, mais un bon exemple je pense

source: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624

 using System; using System.Data; using System.Data.SqlClient; class OutputParams { [STAThread] static void Main(ssortingng[] args) { using( SqlConnection cn = new SqlConnection("server=(local);Database=Northwind;user id=sa;password=;")) { SqlCommand cmd = new SqlCommand("CustOrderOne", cn); cmd.CommandType=CommandType.StoredProcedure ; SqlParameter parm= new SqlParameter("@CustomerID",SqlDbType.NChar) ; parm.Value="ALFKI"; parm.Direction =ParameterDirection.Input ; cmd.Parameters.Add(parm); SqlParameter parm2= new SqlParameter("@ProductName",SqlDbType.VarChar); parm2.Size=50; parm2.Direction=ParameterDirection.Output; cmd.Parameters.Add(parm2); SqlParameter parm3=new SqlParameter("@Quantity",SqlDbType.Int); parm3.Direction=ParameterDirection.Output; cmd.Parameters.Add(parm3); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); Console.WriteLine(cmd.Parameters["@ProductName"].Value); Console.WriteLine(cmd.Parameters["@Quantity"].Value.ToSsortingng()); Console.ReadLine(); } } 
 ssortingng ConnectionSsortingng = ConfigurationManager.ConnectionSsortingngs["DBCS"].ConnectionSsortingng; using (SqlConnection con = new SqlConnection(ConnectionSsortingng)) { //Create the SqlCommand object SqlCommand cmd = new SqlCommand(“spAddEmployee”, con); //Specify that the SqlCommand is a stored procedure cmd.CommandType = System.Data.CommandType.StoredProcedure; //Add the input parameters to the command object cmd.Parameters.AddWithValue(“@Name”, txtEmployeeName.Text); cmd.Parameters.AddWithValue(“@Gender”, ddlGender.SelectedValue); cmd.Parameters.AddWithValue(“@Salary”, txtSalary.Text); //Add the output parameter to the command object SqlParameter outPutParameter = new SqlParameter(); outPutParameter.ParameterName = “@EmployeeId”; outPutParameter.SqlDbType = System.Data.SqlDbType.Int; outPutParameter.Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add(outPutParameter); //Open the connection and execute the query con.Open(); cmd.ExecuteNonQuery(); //Resortingeve the value of the output parameter ssortingng EmployeeId = outPutParameter.Value.ToSsortingng(); } 

Police http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output

 public static class SqlParameterExtensions { public static T GetValueOrDefault(this SqlParameter sqlParameter) { if (sqlParameter.Value == DBNull.Value || sqlParameter.Value == null) { if (typeof(T).IsValueType) return (T)Activator.CreateInstance(typeof(T)); return (default(T)); } return (T)sqlParameter.Value; } } // Usage using (SqlConnection conn = new SqlConnection(connectionSsortingng)) using (SqlCommand cmd = new SqlCommand("storedProcedure", conn)) { SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(outputIdParam); conn.Open(); cmd.ExecuteNonQuery(); int result = outputIdParam.GetValueOrDefault(); } 

Vous pouvez obtenir votre résultat par code ci-dessous:

 using (SqlConnection conn = new SqlConnection(...)) { SqlCommand cmd = new SqlCommand("sproc", conn); cmd.CommandType = CommandType.StoredProcedure; // add other parameters parameters //Add the output parameter to the command object SqlParameter outPutParameter = new SqlParameter(); outPutParameter.ParameterName = "@Id"; outPutParameter.SqlDbType = System.Data.SqlDbType.Int; outPutParameter.Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add(outPutParameter); conn.Open(); cmd.ExecuteNonQuery(); //Resortingeve the value of the output parameter ssortingng Id = outPutParameter.Value.ToSsortingng(); // *** read output parameter here, how? conn.Close(); } 

Cela me semble plus explicite:

int? id = outputIdParam.Value est DbNull? default (int?): outputIdParam.Value;

Créez le SqlParamObject qui vous donnerait le contrôle pour accéder aux méthodes sur les parameters

:

SqlParameter param = new SqlParameter ();

SET le nom de votre paramètre (il devrait être le même que vous auriez déclaré une variable pour contenir la valeur dans votre firebase database)

: param.ParameterName = "@yourParamterName";

Effacer le détenteur de la valeur pour contenir vos données de sortie

: param.Value = 0;

Définir la direction de votre choix (dans votre cas, cela devrait être la sortie)

: param.Direction = System.Data.ParameterDirection.Output;