C#调用存储过程详解(带返回值、参数输入输出等)
本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下:
CREATEPROCEDURE[dbo].[GetNameById] @studentidvarchar(8), @studentnamenvarchar(50)OUTPUT AS BEGIN SELECT@studentname=studentnameFROMstudent WHEREstudentid=@studentid if@@Error<>0 RETURN-1 else RETURN0 END
using(SqlConnectionconn=newSqlConnection(connStr))
{
try
{
SqlCommandcmd=newSqlCommand("GetNameById",conn);
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@studentid","09888888");//给输入参数赋值
SqlParameterparOutput=cmd.Parameters.Add("@studentname",SqlDbType.NVarChar,50);//定义输出参数
parOutput.Direction=ParameterDirection.Output;//参数类型为Output
SqlParameterparReturn=newSqlParameter("@return",SqlDbType.Int);
parReturn.Direction=ParameterDirection.ReturnValue;//参数类型为ReturnValue
cmd.Parameters.Add(parReturn);
conn.Open();
cmd.ExecuteNonQuery();
MessageBox.Show(parOutput.Value.ToString());//显示输出参数的值
MessageBox.Show(parReturn.Value.ToString());//显示返回值
}
catch(System.Exceptionex)
{
MessageBox.Show(ex.Message);
}
}
CreatePROCEDUREAddOrderTran @countrynvarchar(100), @addsnvarchar(100), @ynamesnvarchar(100), @pidsnvarchar(100), @cellpnvarchar(100), @cphonenvarchar(100), @amountsnvarchar(100), @cartnumbernvarchar(100) as Declare@idint BEGINTRANSACTION insertintoOrders(Order_Country,Order_Adress,Order_UserName,Order_PostID,Cells,Order_Phone,Total_pay,CartNumber,IsPay) values(@country,@adds,@ynames,@pids,@cellp,@cphone,@amounts,@cartnumber,'0') Select@id=@@identity insertintoOrders_Item(OrderNumber,ProductsID,Products_Color,Products_Price,Order_Qty,Item_Total) select@id,Carts_Item.ProductsID,Carts_Item.Products_Color,Carts_Item.Products_Price,Carts_Item.Item_Qty,Carts_Item.Total_Pay fromCarts_ItemwhereCarts_Item.CartNumber=@cartnumber deleteCarts_ItemwhereCartNumber=@cartnumber IF@@error<>0--发生错误 BEGIN ROLLBACKTRANSACTION RETURN0 END ELSE BEGIN COMMITTRANSACTION RETURN@id--执行成功 END
#region执行存储过程
SqlParameter[]param=newSqlParameter[]
{
newSqlParameter("@country",country),
newSqlParameter("@adds",adds),
newSqlParameter("@ynames",ynames),
newSqlParameter("@pids",pids),
newSqlParameter("@cellp",cellp),
newSqlParameter("@cphone",cphone),
newSqlParameter("@amounts",amounts),
newSqlParameter("@cartnumber",cartnumber),
newSqlParameter("@return",SqlDbType.Int)
};
param[8].Direction=ParameterDirection.ReturnValue;
MSCL.SqlHelper.RunProcedure("AddOrderTran",param);
objectobj=param[8].Value;//接受返回值
//stringconnStr=System.Configuration.ConfigurationManager.AppSettings["ConStr"].ToString();
//using(SqlConnectionconn=newSqlConnection(connStr))
//{
//conn.Open();
//SqlCommandcmd=newSqlCommand("AddOrderTran",conn);
//cmd.CommandType=CommandType.StoredProcedure;
//SqlParameterpara1=newSqlParameter("@country",country);
//para1.Direction=ParameterDirection.Input;//参数方向为输入参数
//cmd.Parameters.Add(para1);
//SqlParameterpara2=newSqlParameter("@adds",adds);
//para2.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para2);
//SqlParameterpara3=newSqlParameter("@ynames",ynames);
//para3.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para3);
//SqlParameterpara4=newSqlParameter("@pids",pids);
//para4.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para4);
//SqlParameterpara5=newSqlParameter("@cellp",cellp);
//para5.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para5);
//SqlParameterpara6=newSqlParameter("@cphone",cphone);
//para6.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para6);
//SqlParameterpara7=newSqlParameter("@amounts",amounts);
//para7.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para7);
//SqlParameterpara8=newSqlParameter("@cartnumber",cartnumber);
//para8.Direction=ParameterDirection.Input;
//cmd.Parameters.Add(para8);
//SqlParameterparaReturn=newSqlParameter("@return",SqlDbType.Int);
//paraReturn.Direction=ParameterDirection.ReturnValue;//参数方向为返回参数
//cmd.Parameters.Add(paraReturn);
//cmd.ExecuteNonQuery();
//objectobj=paraReturn;
//if(obj.ToString()=="0")
//{
////存储过程执行失败
//}
//else
//{
////成功
//}
//}
//#endregion
本文的数据库用的是sqlserver自带数据Northwind
1.只返回单一记录集的存储过程
SqlConnectionsqlconn=newSqlConnection(conn); SqlCommandcmd=newSqlCommand(); //设置sql连接 cmd.Connection=sqlconn; //如果执行语句 cmd.CommandText="Categoriestest1"; //指定执行语句为存储过程 cmd.CommandType=CommandType.StoredProcedure; SqlDataAdapterdp=newSqlDataAdapter(cmd); DataSetds=newDataSet(); //填充dataset dp.Fill(ds); //以下是显示效果 GridView1.DataSource=ds; GridView1.DataBind();
存储过程Categoriestest1
CREATEPROCEDURECategoriestest1 AS select* fromCategories GO
2.没有输入输出的存储过程
SqlConnectionsqlconn=newSqlConnection(conn); SqlCommandcmd=newSqlCommand(); cmd.Connection=sqlconn; cmd.CommandText="Categoriestest2"; cmd.CommandType=CommandType.StoredProcedure; sqlconn.Open(); //执行并显示影响行数 Label1.Text=cmd.ExecuteNonQuery().ToString(); sqlconn.Close();
存储过程Categoriestest2
CREATEPROCEDURECategoriestest2AS
insertintodbo.Categories
(CategoryName,[Description],[Picture])
values('test1','test1',null)
GO
3.有返回值的存储过程
SqlConnectionsqlconn=newSqlConnection(conn);
SqlCommandcmd=newSqlCommand();
cmd.Connection=sqlconn;
cmd.CommandText="Categoriestest3";
cmd.CommandType=CommandType.StoredProcedure;
//创建参数
IDataParameter[]parameters={
newSqlParameter("rval",SqlDbType.Int,4)
};
//将参数类型设置为返回值类型
parameters[0].Direction=ParameterDirection.ReturnValue;
//添加参数
cmd.Parameters.Add(parameters[0]);
sqlconn.Open();
//执行存储过程并返回影响的行数
Label1.Text=cmd.ExecuteNonQuery().ToString();
sqlconn.Close();
//显示影响的行数和返回值
Label1.Text+="-"+parameters[0].Value.ToString();
存储过程Categoriestest3
CREATEPROCEDURECategoriestest3
AS
insertintodbo.Categories
(CategoryName,[Description],[Picture])
values('test1','test1',null)
return@@rowcount
GO
4.有输入参数和输出参数的存储过程
SqlConnectionsqlconn=newSqlConnection(conn);
SqlCommandcmd=newSqlCommand();
cmd.Connection=sqlconn;
cmd.CommandText="Categoriestest4";
cmd.CommandType=CommandType.StoredProcedure;
//创建参数
IDataParameter[]parameters={
newSqlParameter("@Id",SqlDbType.Int,4),
newSqlParameter("@CategoryName",SqlDbType.NVarChar,15),
};
//设置参数类型
parameters[0].Direction=ParameterDirection.Output;//设置为输出参数
parameters[1].Value="testCategoryName";
//添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
sqlconn.Open();
//执行存储过程并返回影响的行数
Label1.Text=cmd.ExecuteNonQuery().ToString();
sqlconn.Close();
//显示影响的行数和输出参数
Label1.Text+="-"+parameters[0].Value.ToString();
存储过程Categoriestest4
CREATEPROCEDURECategoriestest4 @idintoutput, @CategoryNamenvarchar(15) AS insertintodbo.Categories (CategoryName,[Description],[Picture]) values(@CategoryName,'test1',null) set@id=@@IDENTITY GO
5.同时具有返回值、输入参数、输出参数的存储过程
SqlConnectionsqlconn=newSqlConnection(conn);
SqlCommandcmd=newSqlCommand();
cmd.Connection=sqlconn;
cmd.CommandText="Categoriestest5";
cmd.CommandType=CommandType.StoredProcedure;
//创建参数
IDataParameter[]parameters={
newSqlParameter("@Id",SqlDbType.Int,4),
newSqlParameter("@CategoryName",SqlDbType.NVarChar,15),
newSqlParameter("rval",SqlDbType.Int,4)
};
//设置参数类型
parameters[0].Direction=ParameterDirection.Output;//设置为输出参数
parameters[1].Value="testCategoryName";//给输入参数赋值
parameters[2].Direction=ParameterDirection.ReturnValue;//设置为返回值
//添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
cmd.Parameters.Add(parameters[2]);
sqlconn.Open();
//执行存储过程并返回影响的行数
Label1.Text=cmd.ExecuteNonQuery().ToString();
sqlconn.Close();
//显示影响的行数,输出参数和返回值
Label1.Text+="-"+parameters[0].Value.ToString()+"-"+parameters[2].Value.ToString();
存储过程Categoriestest5
CREATEPROCEDURECategoriestest5 @idintoutput, @CategoryNamenvarchar(15) AS insertintodbo.Categories (CategoryName,[Description],[Picture]) values(@CategoryName,'test1',null) set@id=@@IDENTITY return@@rowcount GO
6.同时返回参数和记录集的存储过程
SqlConnectionsqlconn=newSqlConnection(conn);
SqlCommandcmd=newSqlCommand();
cmd.Connection=sqlconn;
cmd.CommandText="Categoriestest6";
cmd.CommandType=CommandType.StoredProcedure;
//创建参数
IDataParameter[]parameters={
newSqlParameter("@Id",SqlDbType.Int,4),
newSqlParameter("@CategoryName",SqlDbType.NVarChar,15),
newSqlParameter("rval",SqlDbType.Int,4)//返回值
};
//设置参数类型
parameters[0].Direction=ParameterDirection.Output;//设置为输出参数
parameters[1].Value="testCategoryName";//给输入参数赋值
parameters[2].Direction=ParameterDirection.ReturnValue;//设置为返回值
//添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
cmd.Parameters.Add(parameters[2]);
SqlDataAdapterdp=newSqlDataAdapter(cmd);
DataSetds=newDataSet();
//填充dataset
dp.Fill(ds);
//显示结果集
GridView1.DataSource=ds.Tables[0];
GridView1.DataBind();
Label1.Text="";
//显示输出参数和返回值
Label1.Text+=parameters[0].Value.ToString()+"-"+parameters[2].Value.ToString();
存储过程Categoriestest6
CREATEPROCEDURECategoriestest6 @idintoutput, @CategoryNamenvarchar(15) AS insertintodbo.Categories (CategoryName,[Description],[Picture]) values(@CategoryName,'test1',null) set@id=@@IDENTITY select*fromCategories return@@rowcount GO
7.返回多个记录集的存储过程
SqlConnectionsqlconn=newSqlConnection(conn); SqlCommandcmd=newSqlCommand(); cmd.Connection=sqlconn; cmd.CommandText="Categoriestest7"; cmd.CommandType=CommandType.StoredProcedure; SqlDataAdapterdp=newSqlDataAdapter(cmd); DataSetds=newDataSet(); //填充dataset dp.Fill(ds); //显示结果集1 GridView1.DataSource=ds.Tables[0]; GridView1.DataBind(); //显示结果集2 GridView2.DataSource=ds.Tables[1]; GridView2.DataBind();
存储过程Categoriestest7
CREATEPROCEDURECategoriestest7 AS select*fromCategories select*fromCategories GO
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。