#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; спасибо за ваше время и спасибо сообществу. Я многому здесь научился.