asp执行存储过程
⑴ asp 调用oracle存储过程有返回记录集时经常是出现未指定错误'80004005'
Microsoft JET Database Engine (0x80004005)未指定的错误解决1、系统可能没有注册msjetoledb40.dll,解决办法是 点 开始--->运行, 输入 regsvr32 msjetoledb40.dll, 回车即可;2、数据库所在文1、系统可能没有注册msjetoledb40.dll,解决办法是 点 开始--->运行, 输入 regsvr32 msjetoledb40.dll, 回车即可;2、数据库所在文件夹权限 打开办法是:打开我的电脑,然后点菜单上的“文件夹选项”--->查看,然后把“使用简单文件夹共享(推荐)”前面的钩去掉,然后点“确认”;接下来回到需要打开权限的文件夹(数据库存放的文件夹),右键---> 属性--->安全,然后点“添加”--->"高级"--->立即查找--->然后在下面的地方选择“everyone”--->确定--->点刚才加入的"everyone",然后在下面的大框编辑everyone权限为完全控制,保存即可。3、需要打开guest用户 打开方法:我的电脑--->控制面板--->管理工具---->计算机管理--->本地用户和组---用户---找到"guest",双击,然后把弹出来的狂上的“帐户已停用”前的钩去掉,保存即可。4、temp(临时文件夹)权限 打开办法:windows--->temp,单击右键选择-属性,你就会看到一个叫做“安全”的选项,添加一个everyone,权限设置为完全控制,再将你正在使用windows的用户也设置为完全控制。试试吧,就这几个问题
出现错误的这个几率大些
1.查看数据库连接语句没有发现错误;
2.查看文件夹的权限已经全部给了everyone;
3.打开数据库的同时,系统会在临时文件夹 %SystemRoot%/temp/ 下创建临时文件,而 %systemRoot%/temp/ 的权限不够解决:%SystemRoot%/temp/ 的权限加上(IUSER_电脑名的读写) 此错是WINDOWS目录下没有TEMP文件夹导致出错,建一个TEMP文件夹后则一切正常.
4.TEMP文件最好也把权限设置为everyone
⑵ asp.net调用存储过程返回值问题
你的用法不对,存储过程的返回值不是用来返回数据的,存储过程只能返回int,而且这个int的目的是用来表示存储过程执行状态的,比如执行成功,执行错误等等。你这种情况要用output parameter,比较符合标准。
但其实这不是重点,重点是ExecuteScalar是返回结果集第一行第一列的值,不是return value,你搞错了。
⑶ 在ASP中调用存储过程的几种方法
1. 这也是最简单的方法,两个输入参数,无返回值:
set connection = server.createobject("adodb.connection")
connection.open someDSN
Connection.Execute "procname varvalue1, varvalue2"
'将所有对象清为nothing,释放资源
connection.close
set connection = nothing
2. 如果要返回 Recordset 集:
set connection = server.createobject("adodb.connection")
connection.open someDSN
set rs = server.createobject("adodb.recordset")
rs.Open "Exec procname varvalue1, varvalue2",connection
'将所有对象清为nothing,释放资源
rs.close
connection.close
set rs = nothing
set connection = nothing
3. 以上两种方法都不能有返回值,(Recordset除外),如果要得到返回值,需要用Command的方法。
首先说明,返回值有两种。一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存
储这些值的变量名称需要在调用参数中先行指定。
这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值。
网络转载
⑷ 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;