我有一个SQL Server UDF调用CLR DLL(C#.Net)调用非托管C / C ++ DLL。作为测试,我只是尝试对SQL VARCHAR或NVARCHAR进行异或,然后再将其传回。我试图在调用UDF的SQL代码中没有任何CAST或CONVERTS的情况下执行此操作。不幸的是,调用UDF(底部)会产生文字字符串"System.Byte[]"
而不是XOR字符串。
我试图尽可能地删除/简化这个。我已经包含了测试项目的C / C ++,C#和TSQL部分。
如何实现这一目标的任何提示将不胜感激。
感谢。
/* _MY_XOR.C */
__declspec(dllexport)
void _my_xor(UCHAR *dataIn, int dataLength)
{
while (dataLength-- > 0)
*dataIn++ ^= 0xFF;
}
/* MY_XOR.CS */
[DllImport("mydll.dll")]
static extern void _my_xor(byte[] dataIn, int dataLength);
[Microsoft.SqlServer.Server.SqlFunction]
[return: SqlFacet(MaxSize = -1)]
public static SqlString MY_XOR([SqlFacet(MaxSize = -1)]SqlString dataIn)
{
if (dataIn.IsNull)
return null;
byte[] bytesIn = dataIn.GetNonUnicodeBytes();
_my_xor(bytesIn, bytesIn.Length);
SqlString dataOut = new SqlString(bytesIn.ToString());
return dataOut;
}
/* MY_XOR.SQL */
CREATE FUNCTION MY_XOR(@data nvarchar(MAX)) RETURNS nvarchar(MAX)
WITH EXECUTE AS CALLER AS EXTERNAL NAME MYPCLR.UserDefinedFunctions.MY_XOR;
/* Sample usage */
DECLARE @hello nvarchar(32), @result nvarchar(32);
set @hello = N'Hello World';
set @result = dbo.MY_XOR(@hello);
select @hello 'hello', @result 'result';
结果:@result包含文字字符串“System.Byte []”而不是XOR'd“Hello World”。
PS - 我知道我可以在C#中进行XOR,但这是为了解决问题,而不是专门用于XORing。
答案 0 :(得分:0)
使用直接接受SqlString
的{{1}}构造函数,例如this one:
byte[]
而不是在这里接受字符串的那个:
public SqlString(
int lcid,
SqlCompareOptions compareOptions,
byte[] data
)
这是SqlString dataOut = new SqlString(bytesIn.ToString());
上ToString()
的{{1}}来电,导致byte[]
的输出。
所以,我觉得这样的事情会奏效:
System.Byte[]