6

我想将多维字节数组保存到 SQL Server 数据库。

我知道如何保存将图像转换为数据库的字节数组。为此,我使用的数据类型是image. 但是现在我想存储另一个字节数组,它是多维字节数组byte [,] temp,它有两个具有 x,y 值的维度。

我在互联网上搜索,在这里,据说使用VARBINARY格式。我只想知道如果我将多维数组保存在VARBINARY数据类型数据列中,这些值会被改变吗?是否可以再次以多维数组的形式接收数据?

4

2 回答 2

7

是的,您将能够恢复原样的多维数组。

你怎么能这样做?在 Sql Server 中使用 Varbinary(max) 字段并将序列化的多维字节数组保存到其中。为了取回您的数组,显然,您需要反序列化您存储在数据库中的内容。

以下是如何执行此操作的示例:

public void TestSO()
{
    using (SqlConnection conexion = new SqlConnection())
    {
        using (SqlCommand command = new SqlCommand())
        {
            //This is the original multidimensional byte array
            byte[,] byteArray = new byte[2, 2] {{1, 0}, {0,1}};
            ConnectionStringSettings conString = ConfigurationManager.ConnectionStrings["ConnectionString"];
            conexion.ConnectionString = conString.ConnectionString;
            conexion.Open();
            command.Connection = conexion;
            command.CommandType = CommandType.Text;
            command.CommandText = "UPDATE Table SET VarBinaryField = @Content WHERE Id = 73 ";
            command.Parameters.Add(new SqlParameter("@Content", SqlDbType.VarBinary, -1));
            //Serialize the multidimensional byte array to a byte[]
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, byteArray);
            //Set the serialized original array as the parameter value for the query
            command.Parameters["@Content"].Value = ms.ToArray();
            if (command.ExecuteNonQuery() > 0)
            {
                //This method returns the VarBinaryField from the database (what we just saved)
                byte[] content = GetAttachmentContentsById(73);
                //Deserialize Content to a multidimensional array
                MemoryStream ms2 = new MemoryStream(content);
                byte[,] fetchedByteArray = (byte[,])bf.Deserialize(ms2);
                //At this point, fetchedByteArray is exactly the same as the original byte array
            }
        }
    }
}
于 2012-07-04T18:59:28.577 回答
2

据我所知,Microsoft SQL Server 中没有合适的数据类型来存储多维数组。但是,有很多方法可以保存有关数组结构的信息。他们中有一些:

  1. 创建几列 BINARY(固定长度)数据类型,并将多维数组的每一行创建到适当的列;在这种情况下,预计数组中的行数是恒定的;

  2. 将整个数组作为一维数组存储到 VARBINARY(可变长度)数据类型的单列中,并将多维数组每行中元素的计数存储在 INT 数据类型的单独列中;在这种情况下,预计每行中的元素数是相同的(不是锯齿状的 C# 数组);读取数组时,您将能够按此长度将元素拆分为单独的多维数组行。

于 2012-07-04T19:17:08.937 回答