我的存储过程有一个输出参数:
@ID INT OUT
如何使用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(); }
BQ... 114
其他反应表明这一点,但实际上你只需要创建一个SqlParameter
,设置Direction
来Output
,并把它添加到SqlCommand
的Parameters
集合.然后执行存储过程并获取参数的值.
使用您的代码示例:
// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s using (SqlConnection conn = new SqlConnection(connectionString)) 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 idFromString = int.Parse(outputIdParam.Value.ToString()); // 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(); }
在获取时要小心Parameters[].Value
,因为需要将类型转换为object
您声明的类型.而SqlDbType
当您创建使用SqlParameter
需求来匹配数据库类型.如果您只是将其输出到控制台,您可能只是在使用Parameters["@Param"].Value.ToString()
(通过Console.Write()
或String.Format()
调用显式或隐式).
编辑:超过3.5年和几乎20k的观点,并没有人提到它甚至没有编译,原因是我在原帖中的"小心"评论中指定的原因.尼斯.根据@Walter Stabosz和@Stephen Kennedy的好评来修复它,并匹配来自@abatishchev的问题中的更新代码编辑.
其他反应表明这一点,但实际上你只需要创建一个SqlParameter
,设置Direction
来Output
,并把它添加到SqlCommand
的Parameters
集合.然后执行存储过程并获取参数的值.
使用您的代码示例:
// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s using (SqlConnection conn = new SqlConnection(connectionString)) 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 idFromString = int.Parse(outputIdParam.Value.ToString()); // 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(); }
在获取时要小心Parameters[].Value
,因为需要将类型转换为object
您声明的类型.而SqlDbType
当您创建使用SqlParameter
需求来匹配数据库类型.如果您只是将其输出到控制台,您可能只是在使用Parameters["@Param"].Value.ToString()
(通过Console.Write()
或String.Format()
调用显式或隐式).
编辑:超过3.5年和几乎20k的观点,并没有人提到它甚至没有编译,原因是我在原帖中的"小心"评论中指定的原因.尼斯.根据@Walter Stabosz和@Stephen Kennedy的好评来修复它,并匹配来自@abatishchev的问题中的更新代码编辑.
对于任何希望使用带有存储过程的阅读器执行类似操作的人,请注意必须关闭阅读器才能检索输出值.
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; }
不是我的代码,而是我认为的一个好例子
来源:http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID = 624
using System;
using System.Data;
using System.Data.SqlClient;
class OutputParams
{
[STAThread]
static void Main(string[] 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.ToString());
Console.ReadLine();
}
}
string ConnectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; using (SqlConnection con = new SqlConnection(ConnectionString)) { //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(); //Retrieve the value of the output parameter string EmployeeId = outPutParameter.Value.ToString(); }
字体http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output