我们通过加密搜索字段并比较这些加密值来搜索加密字段。我需要做的是将proc(通过实体框架4)传递给加密值(当代码加密它时),但如果没有提供值,则允许为null。
所以我需要传入一个byte []但是它还需要接受空值...这是否可能,或者如果不是,那么解决方法是什么?我再次通过实体框架调用存储过程。
感谢。
答案 0 :(得分:0)
鉴于此存储过程:
create procedure dbo.pConvertBytesToInt
@bytes varbinary(4)
as
select convert(int,@bytes)
go
以下代码将执行它,如果传递的参数为null,则传递NULL:
static int? Bytes2IntViaSQL( byte[] @bytes )
{
int? value ;
const string connectionString = "Data Source=localhost;Initial Catalog=sandbox;Integrated Security=SSPI;" ;
using ( SqlConnection connection = new SqlConnection( connectionString ) )
using ( SqlCommand sql = connection.CreateCommand() )
{
sql.CommandType = CommandType.StoredProcedure ;
sql.CommandText = "dbo.pConvertBytesToInt" ;
SqlParameter p1 = new SqlParameter( "@bytes" , SqlDbType.VarBinary ) ;
if ( @bytes == null ) { p1.Value = System.DBNull.Value ; }
else { p1.Value = @bytes ; }
sql.Parameters.Add( p1 ) ;
connection.Open() ;
object result = sql.ExecuteScalar() ;
value = result is DBNull ? (int?)null : (int?)result ;
connection.Close() ;
}
return value ;
}
此测试工具
static void Main( string[] args )
{
byte[][] testcases = { new byte[]{0x00,0x00,0x00,0x01,} ,
null ,
new byte[]{0x7F,0xFF,0xFF,0xFF,} ,
} ;
foreach ( byte[] bytes in testcases )
{
int? x = Bytes2IntViaSQL( bytes ) ;
if ( x.HasValue ) Console.WriteLine( "X is {0}" , x ) ;
else Console.WriteLine( "X is NULL" ) ;
}
return ;
}
产生预期结果:
X is 1
X is NULL
X is 2147483647
答案 1 :(得分:0)
我们最终通过将其作为字符串推送,然后在proc中解析它来使其工作。那很有效。但我相信我读到有一个二进制对象代表byte []数组,这也会有效。