Можно ли сделать Select () над Datatable с помощью поля массива byte []? - PullRequest
0 голосов
/ 12 октября 2019

Я запускаю запрос к SQL Server для получения таблицы, содержащей varbinary столбцов;столбцы преобразуются в байтовый массив, когда возвращаются в виде данных.

Мне интересно, есть ли способ сделать Select() более System.Byte[]?

Это то, что я пытался:

byte[] b = (byte[])sessions.table.Rows[72]["security_id"];
string hexString = ByteArrayToHexString(b);
DataRow[] rows = users.table.Select("sid = " + hexString);
// throw exception...
// System.Data.SyntaxErrorException: 'Cannot interpret token '0' at position 7.'

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Согласно источнику , благодаря Дэвиду Брауну, datatable не может обрабатывать двоичные данные с помощью функции выбора, он не реализован:

internal enum ValueType {
        Unknown = -1,
        Null = 0,
        Bool = 1,
        Numeric = 2,
        Str = 3,
        Float = 4,
        Decimal = 5,
        Object = 6,
        Date = 7,
}

Единственные решения - преобразовать varbinay вvarchar в запросе к серверу, если вы знаете, что это за столбцы, или конвертируете датируемые столбцы byte [] в строковые столбцы в дублирующейся таблице и, чем сделать select (), конечно, другие компоненты, такие как linq, делают это намного проще ...

Обновление:

пример кода, как добавить новые строковые столбцы в таблицу и преобразовать byte[] в string:

private DataTable fixDatatableType(DataTable input) {

 List<DataColumn> overwriteColumnIndex = new List<DataColumn>();
 List<string> addedColumns = new List<string>();

 for (int i = 0; i < input.Columns.Count; i++)
 {
  if (input.Columns[i].DataType == typeof(byte[])) {
      overwriteColumnIndex.Add(input.Columns[i]);
      string newColumnName = input.Columns[i].ColumnName + "_str";
      addedColumns.Add(newColumnName);
      DataColumn dataColumn = new DataColumn(newColumnName, typeof(string));
      input.Columns.Add(dataColumn);
  }
 }

 if (overwriteColumnIndex.Count != 0) {
  for (int z = 0; z < input.Rows.Count; z++)
  {
   DataRow row = input.Rows[z];
   for (int m = 0; m < overwriteColumnIndex.Count; m++)
   {
    if (row[overwriteColumnIndex[m]] != DBNull.Value) {
     row[addedColumns[m]] = 
     ByteArrayToHexString((byte[])row[overwriteColumnIndex[m]]);
    }
   }
  }
 }
 return input;
}
0 голосов
/ 12 октября 2019

Не знаю, но синтаксис фильтра DataView очень неясен и используется редко. Вместо этого просто выполните итерацию DataTable.Rows и выполните сравнение или используйте расширения LINQ и выполните что-то вроде:

var rows = users.table.AsEnumerble().Where(r => r["sid"].SequenceEqual(b)).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...