1、设置所调用的存储过程需要的参数
public decimal CreateOrder(string orderId, int userId, string address) { SqlParameter[] parameters = new SqlParameter[] { new SqlParameter("@orderId",SqlDbType.NVarChar,30), new SqlParameter("@userId",SqlDbType.Int,4), new SqlParameter("@address",SqlDbType.NVarChar,255), new SqlParameter("@totalPrice",SqlDbType.Money) }; parameters[0].Value = orderId; parameters[1].Value = userId; parameters[2].Value = address; //设置参数为输出参数,默认是InPut(输入参数) parameters[3].Direction = ParameterDirection.Output; //调用执行存储过程的方法 DBUtility.DBHelperSQL.ExecuteNonQueryProc("usp_CreateOrder", parameters); return Convert.ToDecimal(parameters[3].Value); }
关键是设置参数为输出参数,默认是InPut(输入参数) parameters[3].Direction = ParameterDirection.Output;
2、执行存储过程的方法
public static decimal ExecuteNonQueryProc(string cmdtext, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { //设置SqlCommand的类型为存储过程--StoredProcedure cmd.CommandType = CommandType.StoredProcedure; //这个的cmdText是存储过程名 cmd.CommandText = cmdtext; //给这个存储过程传变量 cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } }
一开始我有一个疑问,ExecuteNonQuary 方法,返回的是受影响的行数,怎么会把输出的参数传出来?
原来,当你把参数的 Direction 设置为 OutPut 后,把这个参数传给存储过程,那么在存储过程里,这个参数就被赋值了
然后在程序里,调用参数的 Value 属性(parameters[3].Value)得到参数的值
意思就是,这个存储过程只要成功执行了,那么你传进去的那个设置为 OutPut 的参数就已经被赋值了,不用理会 ExecuteNonQuary 方法返回的值,只管运行这个方法就好