需要在查询时将存储在SQL服务器中的(x,y)点作为二进制图像转换为浮点数组
Need to convert (x,y) points stored in SQL Server as binary image to float array at query time
(position, load)
点作为 image
存储在 SQL 服务器中。每次机器冲程时,都会创建一个记录来存储此 position/load 图以及其他数据。
我需要将'image'转换成数字进行分析。我计划在 Spotfire 中进行分析,因此任何 Spotfire 功能都可以在解决方案中使用。
我有一个 C# 程序,它从 SQL 查询数据并将其转换为 CSV;但是,我想要一种跳过此步骤的方法,直接在 Spotfire 中查询 viewing/analysis 的点。
这个 C# 可以工作并且可以做我想做的事。我如何使用这个(或某些变体)来处理来自 SQL 的查询数据,以便用户在打开他们的 Spotfire 文件之前不会 运行 一个单独的 "converter" 控制台应用程序?
// 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 result;
}
您可以使用 CLR Table-Valued Function 到 运行 C# 代码并将二进制数据转换为结果集。
一个 CLR TVF 有一个 "init" 方法,returns 一个集合,然后 SQL 将 运行 你的 "FillRow" 方法用于集合的每个成员返回集合。 FillRow 方法将对象转换为 "row" 输出参数。例如:
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;
}
}
(position, load)
点作为 image
存储在 SQL 服务器中。每次机器冲程时,都会创建一个记录来存储此 position/load 图以及其他数据。
我需要将'image'转换成数字进行分析。我计划在 Spotfire 中进行分析,因此任何 Spotfire 功能都可以在解决方案中使用。
我有一个 C# 程序,它从 SQL 查询数据并将其转换为 CSV;但是,我想要一种跳过此步骤的方法,直接在 Spotfire 中查询 viewing/analysis 的点。
这个 C# 可以工作并且可以做我想做的事。我如何使用这个(或某些变体)来处理来自 SQL 的查询数据,以便用户在打开他们的 Spotfire 文件之前不会 运行 一个单独的 "converter" 控制台应用程序?
// 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 result;
}
您可以使用 CLR Table-Valued Function 到 运行 C# 代码并将二进制数据转换为结果集。
一个 CLR TVF 有一个 "init" 方法,returns 一个集合,然后 SQL 将 运行 你的 "FillRow" 方法用于集合的每个成员返回集合。 FillRow 方法将对象转换为 "row" 输出参数。例如:
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;
}
}