gpt4 book ai didi

c# - 具有 varbinary(max) OUTPUT 的 CLR 存储过程失败,但与 T-SQL 相同的过程

转载 作者:行者123 更新时间:2023-11-30 17:14:55 25 4
gpt4 key购买 nike

我有一个存储过程:

CREATE PROCEDURE [dbo].[brbackup]
@dataID [nvarchar](max),
@backupdata [varbinary](max) OUTPUT
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLBackupRestore].[StoredProcedures].[BackupStuff]
GO

映射回这个 CLR 存储过程代码:

public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void BackupStuff(string dataID, out byte [] backupdata)
{
[..body omitted..]
}
}

这很好用,我可以像这样在服务器上的 t-sql 中调用它:

declare @backupdata varbinary(max);
exec brbackup "dataIDNumber", @backupdata output;

我得到了预期的输出(@backupdata 中有几兆字节的数据)。我想做的是通过客户端从 C# 调用它,但这不起作用:

    static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("myConnString");
conn.Open();
SqlCommand cmd = new SqlCommand("brbackup", conn);
cmd.CommandTimeout = 0;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@dataID", "dataIDNumber");
SqlParameter p = new SqlParameter("@backupdata",
SqlDbType.VarBinary, -1);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
}

这个查询没有给出错误,它运行了一段时间(如预期的那样),但是 p.Value 除了一个 byte[0] 什么都没有>。我试过将长度设置为 -1 以外的其他值,并将 p.Value 设置为足够大的 byte[] 来保存结果,但没有任何乐趣.

然而,奇怪的是,创建一个小的 t-sql 存储过程来环绕 CLR 存储过程确实有效:

CREATE PROCEDURE AA_JUST_TESTING
@stuff varbinary(max) output
AS
BEGIN
declare @backupdata varbinary(max);
exec brbackup 'dataIDNumber', @backupdata output;
set @stuff = @backup;
END
GO

然后使用此 C# 代码调用包装器 AA_JUST_TESTING:

        SqlConnection conn = new SqlConnection("myConnString");
conn.Open();
SqlCommand cmd = new SqlCommand("AA_JUST_TESTING", conn);
cmd.CommandTimeout = 0;
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p = new SqlParameter("@stuff",
SqlDbType.VarBinary, -1);
p.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();

工作只是桃色。 p.Value 以大小合适的 byte [] 结尾,其中填充了正确的数据。

所以...除了一个调用 CLR 存储过程而另一个调用 T-SQL 存储过程外,我看不出有什么区别,即使它们都使用 varbinary(max) 输出 返回值。我在寻找:

  • 合理的解释、指向文档的指针等...告诉我为什么会这样工作。

  • 某种解决方法,这样我就不必拥有包装器存储过程,并且也许可以完成我需要直接从 C# 调用 CLR SP 的任务。

最佳答案

奇怪。尝试更改 C# 代码:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void BackupStuff(string dataID, out byte [] backup)
{
[..body omitted..]
}

收件人:

using System.Data.SqlTypes;
...

[Microsoft.SqlServer.Server.SqlProcedure]
public static void BackupStuff(string dataID, out SqlBinary backup)
{
[..body omitted..]
byte[] result = ... // get byte array to return
backup = new SqlBinary(result);
}

使用 SqlBinary 作为 C# 例程的返回类型适合我。

编辑:好吧,使用 SqlBinary 或 byte[] 都对我有用。您的 varbinary(max) 参数是“@backup”还是“@backupdata”?看起来您显示的示例代码同时使用了两者。即尝试改变:

  SqlParameter p = new SqlParameter("@backupdata", 
SqlDbType.VarBinary, -1);

到:

  SqlParameter p = new SqlParameter("@backup", 
SqlDbType.VarBinary, -1);

关于c# - 具有 varbinary(max) OUTPUT 的 CLR 存储过程失败,但与 T-SQL 相同的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com