Необходимо преобразовать точки (x, y), хранящиеся на SQL Server в виде двоичного изображения, в плавающий массив во время запроса

#c# #sql-server #tsql #spotfire

#c# #sql-сервер #tsql #spotfire

Вопрос:

(position, load) точки хранятся на SQL Server как image . Каждый раз, когда машина выполняет штрихи, создается одна запись для сохранения этой позиции / графика загрузки вместе с другими данными.

Мне нужно преобразовать «изображение» в числа для анализа. Я планирую выполнить анализ в Spotfire, поэтому в решении можно использовать любые функции Spotfire.

У меня есть программа на C #, которая запрашивает данные из SQL и преобразует их в CSV; однако я хочу, чтобы способ пропустить этот шаг напрямую запрашивать точки для просмотра / анализа в Spotfire.

Этот C # работает и делает то, что я хочу. Как я могу использовать это (или какой-либо вариант) для обработки данных по запросу из SQL, чтобы пользователи не запускали отдельное консольное приложение «конвертер» перед открытием своего файла Spotfire?

 // Return a list of points from an array of bytes:
public static IList<PositionLoadPoint> GetPositionLoadPoints(byte[] bytes)
{
     IList<PositionLoadPoint> result = new List<PositionLoadPoint>();
     int midIndex = bytes.Length / 2;

     for (int i = 0; i < midIndex; i  = 4)
     {
         byte[] load = new byte[4];
         byte[] position = new byte[4];

         Array.Copy(bytes, i, load, 0, 4);
         Array.Copy(bytes, midIndex   i, position, 0, 4);

         var point = new PositionLoadPoint(BitConverter.ToSingle(load, 0),
                                           BitConverter.ToSingle(position, 0));

        result.Add(point);
    }

    return resu<
}
  

Комментарии:

1. ntext , text и image типы данных будут удалены в будущей версии SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте модифицировать приложения, которые в настоящее время их используют. Вместо этого используйте nvarchar(max) , varchar(max) и varbinary(max) . Смотрите подробности здесь

2. Почему вы храните эти данные как image в первую очередь? Почему бы не использовать 2 отдельных столбца и не вырезать весь этот код преобразования.

3. Базой данных управляет старое стороннее программное обеспечение. Я просто инженер, пытающийся извлечь из него данные. Но я ценю предупреждение.

Ответ №1:

Вы могли бы использовать функцию с табличным значением CLR для запуска этого кода C # и преобразования двоичных данных в результирующий набор.

CLR TVF имеет метод «init», который возвращает коллекцию, а затем SQL запустит ваш метод «FillRow» для каждого члена возвращаемой коллекции. Метод FillRow преобразует объект в «строку» выходных параметров. НАПРИМЕР:

 using System;  
using System.Data.Sql;  
using Microsoft.SqlServer.Server;  
using System.Collections;  
using System.Data.SqlTypes;  
using System.Diagnostics;  

public class TabularEventLog  
{  
    [SqlFunction(FillRowMethodName = "FillRow")]  
    public static IEnumerable InitMethod(String logname)  
    {  
        return new EventLog(logname).Entries;    
    }  

    public static void FillRow(Object obj, out SqlDateTime timeWritten, out SqlChars message, out SqlChars category, out long instanceId)  
    {  
        EventLogEntry eventLogEntry = (EventLogEntry)obj;  
        timeWritten = new SqlDateTime(eventLogEntry.TimeWritten);  
        message = new SqlChars(eventLogEntry.Message);  
        category = new SqlChars(eventLogEntry.Category);  
        instanceId = eventLogEntry.InstanceId;  
    }  
}
  

Комментарии:

1. Я проконсультировался со своим ИТ-специалистом, и мы думаем, что это сработает. Он собирается выполнить реализацию на следующей неделе. Я собираюсь отметить как правильные прямо сейчас. Я в основном сторонник SO; спасибо за ваше время и спасибо сообществу. Я многому здесь научился.