net调用存储过程
A. .net调用存储过程实现查询
sqlConnection conn = WebHelper.getconn();
conn.Open();
SqlCommand cmd = new SqlCommand("p_qry", conn);
cmd.CommandType = CommandType.StoredProcere;
SqlParameter p1 = new SqlParameter("@begin_state", SqlDbType.nvarchar,10);
SqlParameter p2 = new SqlParameter("@end_state", SqlDbType.nvarchar,10);
p1.Value = Textbox1.text;
p2.Value = Textbox2.text;
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adp.Fill(dt);
return dt;
B. asp.net 调用存储过程
两种不同的存储过程调用方法
为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。
要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。
就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcere";
da.selectCommand.CommandType = CommandType.StoredProcere;
然后只要选择适当的方式执行此处过程,用于不同的目的即可。
(2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcere(string inputdate)):
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcere";
da.selectCommand.CommandType = CommandType.StoredProcere;
(以上代码相同,以下为要添加的代码)
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
这样就添加了一个输入参数。若需要添加输出参数:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
若要获得参储过程的返回值:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?
于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcere('para1','para2',para3)";
da.selectCommand.CommandType = CommandType.StoredProcere;
为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果!
两种调用方法的比较
通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。
用ASP.NET与SQL SERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQL SERVER,只是一些很考虑经济的才使用ACCESS等了。用SQL SERVER,为了使数据库的效率更好,一般都会才取存储过程,因存储过程执行速度快,并且可以实现一些高级的查询等功能。比如传入一些数据参数,但执行的SQL过程可能不同等。
下面就来个例子,建立一新的角色,要求角色的名字不能重复,以下是一存储过程。
CREATE PROCEDURE sp_AccountRole_Create@CategoryID int,@RoleName nvarchar(10),@Description nvarchar(50),@RoleID int outputAS DECLARE @Count int -- 查找是否有相同名称的记录 SELECT @Count = Count(RoleID) FROM Account_Role WHERE RoleName = @RoleName IF @Count = 0 INSERT INTO Account_Role (CategoryID, RoleName, Description) valueS (@CategoryID, @RoleName, @Description) SET @RoleID = @@IDENTITY RETURN 1GO 执行存储过程的C#过程:
SqlConnection DbConnection = new SqlConnection(mConnectionString);SqlCommand command = new SqlCommand( "sp_AccountRole_Create", DbConnection );DbConnection.Open(connectString);// 废置SqlCommand的属性为存储过程command.CommandType = CommandType.StoredProcere;command.Parameters.Add("@CategoryID", SqlDbType.Int, 4);command.Parameters.Add("@RoleName", SqlDbType.NVarChar, 10);command.Parameters.Add("@Description", SqlDbType.NVarChar, 50);command.Parameters.Add("@RoleID", SqlDbType.Int, 4);// 返回值command.Parameters.Add("Returnvalue", SqlDbType.Int, 4, // Size ParameterDirection.Returnvalue, false, // is nullable 0, // byte precision 0, // byte scale string.Empty, DataRowVersion.Default, null );command.parameters["@CategoryID"].value = permission.CategoryID;command.parameters["@RoleName"].value = permission.PermissionName;command.parameters["@Description"].value = permission.Description;// 可以返回新的ID值command.parameters["@RoleID"].Direction = ParameterDirection.Output;int rowsAffected = command.ExecuteNonQuery();int result = command.parameters["Returnvalue"].value;int newID = command.parameters["@RoleID"].value;
C. .net mvc 怎样调用 存储过程详细点最好有例子
由于问题主要是存储过程,以下例子的架构会直接点,Controller直接依赖SqlRepository,而未用到依赖注入。。
所以,架构方面千万不要参考了这个例子。。
费话不多说,先讲数据库。举例的数据库(SQLServer 2008)名为TestDB01,仅有的一张表表名为UserInfo,表有皆不可为空的三个字段,分别为UserID(int),UserName(nvarchar(50)),UserAge(smallint),其有一条记录为UserID:1,UserName:Lcng,UserAge22。
接下来是写在数据库里的存储过程,如下:
USE [TestDB01]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[myProcere]
@parameter1 int
AS
BEGIN
SET NOCOUNT ON;
SELECT * from [UserInfo] where [UserInfo].UserID = @parameter1
END
希望我复制粘贴时没有出错,当然,如果你对存储过程熟悉的话你会发现我的错误,如果有的话。。
存储过程表达的意思在此就不说了(想你应该熟悉存储过程),如果需要,请补充问题。。
接下来就是Visual Studio 2010里的工作了。
新建一个空ASP.NET MVC 2项目,我取的项目名是UsingProcereInMVC,往项目里加一个名为Repositories的文件夹,此文件夹用来存放对数据库的操作的类,一会儿会讲,先看Models文件夹。
往Models文件夹里加一个名叫Person的类,Person类如下:
public class Person
{
public string PersonName { get; set; }
public short PersonAge { get; set; }
}
现在回到Repositories文件夹,往这个文件夹里加一个名叫SqlRepository的类,SqlRepository类如下:
public class SqlRepository
{
private List<Person> personList = new List<Person>();
public List<Person> PersonList
{
get
{
return personList;
}
}
public SqlRepository(string connectionString)
{
SqlConnection sqlconn = new SqlConnection(connectionString);
SqlCommand sqlcmd = new SqlCommand("myProcere", sqlconn);
sqlcmd.CommandType = CommandType.StoredProcere;
SqlDataReader rd;
try
{
sqlconn.Open();
sqlcmd.Parameters.Add(new SqlParameter("@parameter1", SqlDbType.Int));
sqlcmd.Parameters["@parameter1"].Value = 1;
rd = sqlcmd.ExecuteReader();
while (rd.Read())
{
personList.Add(new Person { PersonAge = (short)rd[2], PersonName = rd[1].ToString() });
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
sqlconn.Close();
}
}
同样,希望我的复制粘贴没有出错。。
希望对于此类需要讲解的只有以下这些内容,如
SqlCommand sqlcmd = new SqlCommand("myProcere", sqlconn);
sqlcmd.CommandType = CommandType.StoredProcere;
如果你用过ASP.NET WebForm,那么对这两条中的第一条语句你应该很熟悉,相对于ASP.NET WebForm,SqlCommand sqlcmd = new SqlCommand("myProcere", sqlconn);只是把第一个参数由原来的SQL语句换成了定义在数据库里的存储过程的名字;而第二条语句只是告诉sqlcmd它的命令类型而已。
当然,我还要说的是,其实这根本就是在ASP.NET WebForm可以用的用法,只是我把它放到ASP.NET MVC里举例子了而已。。其实我们完全可以或说应当使用LINQ。。
还有两条要说的语句是
sqlcmd.Parameters.Add(new SqlParameter("@parameter1",SqlDbType.Int));
sqlcmd.Parameters["@parameter1"].Value = 1;
要说的是@parameter1就是定义存储过程里的那个参数,这里给这个参数的值为1,它完全可以根据你的需要而变。
接着看Controllers里的HomeController,它唯一的一个action就是Index(),定义如下
public ViewResult Index()
{
SqlRepository sr = new SqlRepository(WebConfigurationManager.ConnectionStrings["connectionString01"].ConnectionString);
return View(sr.PersonList);
}
如果对此有不明之处,请补充问题。。
最后是强类型(类型为List<UsingProcereInMVC.Models.Person>)的名叫Index的View,主要内容如下
<body>
<div>
<% foreach (var v in Model)
{ %>
Name:<%: v.PersonName %><br />
Age: <%: v.PersonAge %><br />
<% } %>
</div>
</body>
如果你按着这个例子做,显示的结果将会是
Name:Lc
Age: 22
祝你好运(当然,这条是不会显示的)。。
希望可以帮到你,如果还有疑问,请补充问题。
如果这对你有帮助,请标为最佳答案。
D. ASP.NET要如何调用数据库的存储过程
其实调用存储过程和调用普通的sql语句的过程是一样的。
1.创建连接字符串string SqlConnectionString="";
2.实例化连接SqlConnection cn = new SqlConnectio(SqlConnectionString);
3.SqlCommand cmd = new SqlCommand("存储过程的名字", cn);
4.执行命令cmd.cmd.ExecuteNonQuery();(这个方法根据你的存储过程而定)
应该这样就OK啦!
E. asp.net 调用存储过程
如果没有报错,那就在页面调用的开始加个断点,看看userid;username;departid的值是什么。然后在数据库里执行以下存储过程,把三个值带进去试一试,因为在数据库里分析一下会比较直接。
F. .Net程序中说的存储过程是什么意思
存储过程是数据库的一个概念
打个比方说,存储过程就相当于一个存在数据库中的方法,可以有输入参数(input),输出参数(output),返回值(return)
比如一个方法
public
string
GetData(int
id,out
int
rowCount)
参数id代表input
参数rowCount代表output,即可当输入参数,也可当输出参数
返回值类似
一个简单的存储过程:
create
proc
T_GetData
@id
int
input,
//输入参数
@rowCount
int
output
//可输入输出参数
类似于.net中的out
parameter
AS
begin
select
@rowCount
=
sum(rowname)
from
table1
where
id
=
@id
//这里给output参数赋值
return
'测试而已'
//这里返回值
end
GO
就创建了一个存储过程,可以跟调用方法一样很简单的调用它了
G. .net类中如何调用存储过程
1.在存储过程实现根据中传入参数的不同null与否,做修改或删除等动作。这种SQL语句写起来比较麻烦。
2.实现多个存储过程,然后分别写多个方法重载,如果表多的话系统中存储过程会变得巨大。
其实如果只是简单的SQL语句,完全没必要用存储过程。。。。
H. asp.net 调用存储过程
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection
conn=new
SqlConnection(“connectionString”);
SqlDataAdapter
da
=
new
SqlDataAdapter();
da.selectCommand
=
new
SqlCommand();
da.selectCommand.Connection
=
conn;
da.selectCommand.CommandText
=
"NameOfProcere";
da.selectCommand.CommandType
=
CommandType.StoredProcere;
(2)执行一个有参数的存储过程的代码如下
SqlConnection
conn=new
SqlConnection(“connectionString”);
SqlDataAdapter
da
=
new
SqlDataAdapter();
da.selectCommand
=
new
SqlCommand();
da.selectCommand.Connection
=
conn;
da.selectCommand.CommandText
=
"NameOfProcere";
da.selectCommand.CommandType
=
CommandType.StoredProcere;
param
=
new
SqlParameter("@ParameterName",
SqlDbType.DateTime);
param.Direction
=
ParameterDirection.Input;
param.Value
=
Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
若需要添加输出参数:
param
=
new
SqlParameter("@ParameterName",
SqlDbType.DateTime);
param.Direction
=
ParameterDirection.Output;
param.Value
=
Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
若要获得参储过程的返回值:
param
=
new
SqlParameter("@ParameterName",
SqlDbType.DateTime);
param.Direction
=
ParameterDirection.ReturnValue;
param.Value
=
Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
I. .net调用存储过程找不到
cmd.CommandText = sql;
cmd.CommandType = CommandType.StoredProcere;如果语句类型是存储过程,sql就只能使存储过程名称,
cmd.CommandText ='exec Room_Login zf,zf' 自然不存在名为 'exec Room_Login zf,zf' 的存储过程,
要么cmd.CommandText=Room_Login 然后使用SqlParameter传递参数 ,或者修改cmd.CommandType=CommandType.Text
J. .net调用存储过程
顶一个