Интерпретация байта [] в хранимой процедуре - PullRequest
0 голосов
/ 06 мая 2011

Процедура поиска в зашифрованном поле путем шифрования поля поиска и сравнения этих зашифрованных значений.Однако мне нужно иметь возможность передать в proc (через Entity Framework 4) зашифрованное значение (так как код его шифрует), но также разрешить null, если значение не указано.

ИтакМне нужно передать в байте [], но он также должен принимать нули ... это вообще возможно, или что такое обходной путь, если нет?Я снова вызываю хранимую процедуру через Entity Framework.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

В итоге мы заставили его работать, выдвинув его как строку, а затем проанализировав его в процедуре.Это сработало.Но я считаю, что я прочитал, что есть двоичный объект, который представляет массив byte [], и это тоже сработало бы.

0 голосов
/ 07 мая 2011

С учетом этой хранимой процедуры:

create procedure dbo.pConvertBytesToInt

  @bytes varbinary(4)

as

  select convert(int,@bytes)

go

Следующий код выполнит его, передав 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
...