标签: output-parameter

ADO.NET调用T-SQL存储过程会导致SqlTimeoutException

我有一个带签名的T-SQL存储过程

CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
Run Code Online (Sandbox Code Playgroud)

在Sql Server中直接执行时,该过程在5秒内运行,返回一些总计约100行的结果集.

调用使用ADO.NET此过程SqlDataAdapter.Fill方法来填充Dataset导致SqlTimeoutExceptionSqlCommand3分钟后(指定的超时间隔).

更改存储过程以使其不再具有输出参数,并且所需的输出值作为最后的结果集返回,解决了问题,并且整个过程在预期的5秒内运行.

但为什么?

我不想通过我的代码库来修改这种行为的所有实例,而不理解我是否真的解决了这个问题.

另一件需要注意的是,这只在一个特定的服务器上显而易见,它确实拥有比我们运行的其他类似数据库更大的数据集.肯定不是Sql Server设置?

UPDATE

进入框架源,问题似乎出现在元数据检索中.对象的ConsumeMetaData方法SqlDataReader无限期挂起.但是我在其他数据库上运行测试并且无法重现,因此当通过ADO.NET调用此过程时,这是一个特定于数据库的问题...很棒.

更新II

已确认如果我将代码更改为使用OleDbDataAdapterSQLOLEDB或SQLNCLI提供程序类型,则问题仍然存在.绝对与连接有关.

t-sql sql-server ado.net timeout output-parameter

30
推荐指数
1
解决办法
2万
查看次数

EF中存储过程的输出参数

我有一个包含大量复杂存储过程的现有数据库,我想通过EF 4使用这些过程.我已经完成了以下操作:

  1. 创建了一个EF数据对象Customer.
  2. 在EF中添加了存储过程
  3. 右键单击EF设计器并添加功能导入.
  4. 功能导入名称 - MyFunction,复杂类型.

结果代码:

CustomerEntities entity = new CustomerEntities();
var result = entity.MyFunction("XYZ", ref o_MyString);
Run Code Online (Sandbox Code Playgroud)

现在我的存储过程有一个输出参数,我以前用它来调用(在WebForm中).但我收到以下错误:

无法从'ref string'转换为'System.Data.Objects.ObjectParameter'

请帮忙

编辑

当我试图保存时,我收到以下错误

映射函数绑定指定具有不受支持的参数的函数Model.Store.P_GetCustomer:o_MyString.输出参数只能通过RowsAffectedParameter属性进行映射.使用结果绑定从函数调用返回值.

stored-procedures output-parameter entity-framework-4

13
推荐指数
1
解决办法
3万
查看次数

在WCF服务的方法中有输出参数是不好的做法吗?

我正在寻找除了通常的"out参数令人困惑并且指示方法做的不仅仅是一件事"式的参数以及更多关于WCF服务中输出参数特别糟糕的原因.我现在在哪里工作,我们在WCF服务中有一条规则反对他们,我正在努力找出原因!

.net c# wcf output-parameter

11
推荐指数
2
解决办法
1万
查看次数

如何将输出参数传递给存储过程?

我用以下格式编写了一个存储过程:

ALTER PROCEDURE usp_data_migration 
   (@sourceDatabase varchar(50),
    @sourceTable varchar(50),
    @targetDatabase varchar(50),
    @targetTable varchar(50),
    @finaloutput varchar(max) output)
AS
BEGIN
----Set of SQL Blocks


END
Run Code Online (Sandbox Code Playgroud)

然后,我正在执行程序:

DECLARE @finaloutput1 varchar(300)

EXEC usp_data_migration 'Yousuf', 'emp', '[City Branch]', 'emp_tgt', @finaloutput1 output 

SELECT @finaloutput1 
Run Code Online (Sandbox Code Playgroud)

通过这种方式执行我没有正确的输出.

当我执行这种方式时:

DECLARE @finaloutput1 varchar(300)

EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase = '[City Branch]',
                        @targetTable = 'emp_tgt',
                        @finaloutput1 output 

SELECT @finaloutput1 
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

消息119,级别15,状态1,行41
必须将参数编号5和后续参数作为"@name = value"传递.在使用"@name = value"形式之后,必须以"@name = value"形式传递所有后续参数.

如果我删除了输出参数并执行了该过程,我得到了我想要的输出但是我无法将结果作为输出.

EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server stored-procedures output-parameter output

8
推荐指数
2
解决办法
7万
查看次数

T-SQL存储过程 - 检测参数是否作为OUTPUT提供

请考虑以下T-SQL代码段:

CREATE PROC dbo.SquareNum(@i INT OUTPUT)
AS
BEGIN
    SET @i = @i * @i
    --SELECT @i
END
GO

DECLARE @a INT = 3, @b INT = 5
EXEC dbo.SquareNum @a OUTPUT
EXEC dbo.SquareNum @b
SELECT @a AS ASQUARE, @b AS BSQUARE
GO
DROP PROC dbo.SquareNum
Run Code Online (Sandbox Code Playgroud)

结果集是:

ASQUARE     BSQUARE
----------- -----------
9           5
Run Code Online (Sandbox Code Playgroud)

可以看出,@b不是平方,b/c它没有作为输出参数传入(OUTPUT传入参数时没有限定符).

我想知道是否有一种方法可以检查存储过程体(在本例中为dbo.SquareNum体),以查看参数是否确实已作为OUTPUT参数传入?

t-sql sql-server stored-procedures output-parameter

8
推荐指数
1
解决办法
578
查看次数

<Out()>属性.有用的目的是服务吗?

System.Runtime.InteropServices<Out()>属性存在.但这是为了什么?如果您可以使用以下示例作为答案的基础,我将很高兴.

 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub
Run Code Online (Sandbox Code Playgroud)

.net vb.net attributes output-parameter

7
推荐指数
1
解决办法
1927
查看次数

从存储过程输出最后插入的主键值

我对这个问题有点困难,因为我不确定如何在SQL Server中执行此操作.

基本上,我想在数据库中插入一个新行,获取刚刚插入的PK值(相同的查询)并将其输出回任何称为存储过程的行:

CREATE PROCEDURE Users_Insert
    -- Add the parameters for the stored procedure here
    @userid int output,
    @name varchar(50),
    @surname varchar(50),
    @email varchar(200),
    @password varchar(50),
    @location varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    insert into Users(FirstName, LastName, Email, Password, Location)
    values(@name, @surname, @email, @password, @location);
    GO
    @userid = @@IDENTITY;
END
Run Code Online (Sandbox Code Playgroud)

我在MySQL中完成了以下操作:

CREATE PROCEDURE Users_Insert(@userid int output, @name varchar(50), …
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures output-parameter

7
推荐指数
1
解决办法
2万
查看次数

存储过程输出参数返回舍入值

我正在使用输出参数从存储过程返回值.

存储过程中的声明是: @GrandTtl DECIMAL(19,3) OUT

SELECT查询:

SET @GrandTtl = (SELECT TOP 1 Bill_Amount 
                 FROM Tbl_Restaurant_Kitchen_Order_Bill_Details 
                 WHERE Bill_Number = @billno)
Run Code Online (Sandbox Code Playgroud)

例如,select查询返回值,4087.67然后4088从SQL Server到C#返回输出参数值.

这是调用存储过程的C#代码:

SqlCommand cmd = new SqlCommand("Sp_RestCC_BillDetails", con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter OutParam26 = cmd.Parameters.Add("@GrandTtl", SqlDbType.Decimal,19);

da = new SqlDataAdapter(cmd);

con.Open();
da.Fill(ds, "dtRestCC_Items");
con.Close();

objRCCBEL.GrandTtlOut = Convert.ToDecimal(cmd.Parameters["@GrandTtl"].Value);
Run Code Online (Sandbox Code Playgroud)

c# sql-server stored-procedures output-parameter sql-server-2008

6
推荐指数
1
解决办法
8579
查看次数

检索SQL语句的输出参数

我正在使用一个有两列的表,customer_idcustomer_name.

customer_name是一个简单的varchar,customer_id是一个自动递增的主键.

我想用我的C#应用​​程序插入一个customer_name,并检索它的值customer_id.

只需插入就可以通过使用来解决

using (SqlConnection connection = new SqlConnection(AppConstants.ConnectionString))
{
    using (SqlCommand command = new SqlCommand("INSERT INTO custom_customer (customer_name) VALUES (@name);"))
    {
        command.Parameters.Add(new SqlParameter("name", customer));
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我找到了该OUTPUT语句的一些文档,可用于检索值.

我认为正确的语法是

INSERT INTO custom_customer (customer_name) 
OUTPUT Inserted.customer_id 
VALUES (@name);
Run Code Online (Sandbox Code Playgroud)

我认为我需要使用

command.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

但后来我被卡住了.我该如何从查询中获取值?

c# sql sql-server ado.net output-parameter

6
推荐指数
2
解决办法
8617
查看次数

如何从Rails中的MySQL存储过程中获取输出参数?

我试图从MySQL存储过程中获取输出参数,让我们看一下下面的例子:

1在mysql中我创建了这个过程并且它有效.

CREATE PROCEDURE sp_name (out id int)
Begin
    select id into @id from table order by id desc limit 1;
End

mysql> call sp_deduct_credit_and_money(@id);
Query OK, 0 rows affected (0.01 sec)

mysql> select @id;
+--------------+
|          @id |
+--------------+
|           24 |
+--------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

2因此,它也适用于Rails,但它不会为我返回任何值:

ActiveRecord::Base.connection.execute("call sp_name(@id)")
ActiveRecord::Base.connection.execute("select @id")
Run Code Online (Sandbox Code Playgroud)

这是Rails中的日志

(2.0ms)  call sp_name(@id)
(0.1ms)  select @id
Run Code Online (Sandbox Code Playgroud)

我的问题是如何获得输出参数的返回值@id

mysql stored-procedures ruby-on-rails output-parameter

5
推荐指数
1
解决办法
4254
查看次数