将字符串转换为缓冲区然后再返回

时间:2013-11-18 11:52:26

标签: c# .net sql-server clr

我有一个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。

1 个答案:

答案 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[]