【发布时间】:2020-10-28 23:36:55
【问题描述】:
我确实检查了this,但问题似乎不是类型不匹配。
我正在尝试使用 CLR 从 blob 数据转换回文件。下面是转换成dll并使用汇编存储的c#代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
namespace CLRProcedures
{
public class WriteFile
{
[SqlFunction]
public static SqlInt32 WriteToFile(SqlBytes binary, SqlString path, SqlBoolean append)
{
try
{
if (!binary.IsNull && !path.IsNull && !append.IsNull)
{
var dir = Path.GetDirectoryName(path.Value);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (var fs = new FileStream(path.Value, append ? FileMode.Append : FileMode.OpenOrCreate))
{
byte[] byteArr = binary.Value;
for (int i = 0; i < byteArr.Length; i++)
{
fs.WriteByte(byteArr[i]);
};
}
return 1;
}
else
return 0;
}
catch (Exception ex)
{
return -2;
}
}
}
}
SQL查询如下:
CREATE ASSEMBLY FileOutput from 'c:\dlls\CLRProcedures.dll' WITH PERMISSION_SET = SAFE
CREATE PROCEDURE FileOutput
@file varbinary(max),
@filepath nvarchar(4000),
@append bit,
@message int OUTPUT
AS
EXTERNAL NAME FileOutput.[CLRProcedures.WriteFile].WriteToFile
这会引发错误:'CREATE PROCEDURE 失败,因为参数计数不匹配。'
我已经从here 重新验证是否存在类型不匹配但没有。我哪里出错了?我试图更改 c# 代码的返回类型,但同样的问题。
谢谢
【问题讨论】:
-
去掉
@message int OUTPUT参数还能用吗? -
output与返回值不一样;output有点像 .NET 中的ref -
docs.microsoft.com/en-us/sql/database-engine/dev-guide/… 展示了如果您真的想这样做,如何使用 OUTPUT 参数。
-
名为“message”的参数应该是什么数据类型?对我来说听起来不像数字。
标签: c# sql-server file tsql sqlclr