1

有谁知道如何将一维 Matlab 数组存储在 Microsoft SQL Server 表的单个字段中(以及如何检索它)?我希望能够存储不一定是固定大小的 Matlab 数据数组,并且我考虑将其存储为逗号分隔的字符串,但我希望有一个更优雅的解决方案。我的想法是它应该与存储和读取一个字节[]相同。但是,我已经尝试了几个小时,但无法在互联网上找到任何真正有用的东西。这是我用于存储数组的 Matlab 代码(使用 ADO):

buf = [1,2,3,4,5]; 
buf = int8(buf);
cmd = actxserver('ADODB.Command');
cmd.ActiveConnection = db.connection; % db.connection stores my connection
% Note that Matlab throws an error when setting the ActiveConnection. This
% command is still valid though and works, so the error should be ignored

cmd.CommandText = 'INSERT INTO dbo.TESTTABLE VALUES(?)'; % According to the MSDN
% website, this should be @val instead of ?, but for some reason that doesn't 
% work and the ? does.

param = cmd.CreateParameter(@val',205,1,8000,buf);
cmd.Parameters.Append(param);
cmd.Execute();

可能这段代码是正确的,我只是不知道如何再读一遍。另外,我举了一个大小为 5 的数组作为示例,但我希望能够存储更大的数组。谢谢你的帮助,

麦迪

4

3 回答 3

1

您可以使用 TYPECAST 将矩阵序列化为字节向量 ( uint8),并将结果与​​原始矩阵大小和类型一起存储在数据库中。

考虑以下示例。我使用的是文件而不是数据库,但这个想法仍然适用。

%# some matrix, and record its size and type
x = rand(4,3);
sz = size(x);
cls = class(x);

%# serialize and write to file
b = typecast(x(:),'uint8');          %# byte array
fid = fopen('file.dat','wb');
fwrite(fid, b, 'uint8')
fclose(fid);

%# read file and deserialize
fid = fopen('file.dat','rb');
b = fread(fid, '*uint8');
fclose(fid);
xx = reshape(typecast(b,cls), sz);

%# compare against original matrix
isequal(x,xx)

在上面我只存储序列化的数据,但你也应该存储大小和类型。在您的情况下,只需在表中创建两个附加字段,例如,一个用于大小,另一个用于类型..


如此处所述,如果您不想手动对矩阵及其大小/类型进行序列化,则有未记录的函数mxSerialize/ mxDeserializein libmx评论中甚至还有一个简单的 MEX 包装器的链接。

它们的优点是它们适用于任何 MATLAB 数据类型(包括结构、元胞数组等)。

于 2012-06-13T18:47:39.833 回答
1

SQL 表中列的类型应该是二进制的。然后只需使用常规的 mat lab 一维数组并尝试将它们导出到数据库。

你不需要任何逗号或任何额外的东西。它们由 Matlab 库手持。

例如你可以这样做:

colnames = {'ContentBinary' }; %this is the name of the column with the binary %content
data =   {[1:100000]}; % a one-d array in matlab
tablename = 'myData';
whereclause = 'where Id = 4028'; %this shows which row you are trying to write to
update(conn,tablename,colnames,data,whereclause)
close(conn); %conn is the connection to SQL DB
于 2016-07-15T19:22:16.260 回答
0

对于那些正在尝试类似问题的人,我找到了一种有效的方法。我在问题中发布的代码对于将字节数组从 Matlab 存储到 MS SQL Server 数据库中是正确的。不过,您应该知道,我将它存储到 VARBINARY(MAX) 的字段中,并且它会自动存储为无符号。此外,它只会存储类似于 buf = [1,2,3,4,5] 的数组,并且只会存储类似于 buf = [1;2;3;4;5] 的数组的第一个值

当您检索它时,例如在 ADO 记录集中,您必须将其转换回 int8 ,这可以像 Amro 的回答中那样完成。

至于序列化,我编写了一个简单的 Java 类,它实现了 Serializable 以将对象转换为字节数组,反之亦然。因为可以从 Matlab 调用 Java,所以这个方法效果很好,现在我可以在 varbinary 列中存储和检索任何 Matlab 向量、数组或字符串。

于 2012-06-14T16:39:07.333 回答