使用C#将2D数组输入/输出到数据库中

本文关键字:输出 数据库 输入 2D 数组 使用 | 更新日期: 2023-09-27 18:28:07

我使用C#将多个2d数组输入和输出到SQL数据库中。2D阵列类似于:

Pt[100,50]={0.3,0.2,0.1,...,0.8;
            0.2,0.5,0.5,...,0.1;
            .    .
            .    .
            .    .
            0.1,0.6,0.5,...,0.2}

我知道在SQL中设计一个(index_x,index_y)表,并在C#上使用两个循环来完成它。

有没有更好的方法可以更有效地输入和输出2D阵列?

任何例子都很棒!

使用C#将2D数组输入/输出到数据库中

通过在每个点执行一个单独的SQL语句,您可以执行与要插入的点一样多的数据库往返。每次往返都会导致通信延迟(尤其是在数据库不是本地的情况下),以及DBMS级别的一些记账成本。

在一个数据库往返行程中执行多个插入的粗略且不太可扩展但与数据库无关的方法是简单地将多个INSERT语句打包到单个DbCommand对象中。

假设您的表与此类似(根据需要使用特定于DBMS的类型)。。。

CREATE TABLE YOUR_TABLE(
    INDEX_X int NOT NULL,
    INDEX_Y int NOT NULL,
    VALUE numeric(18, 4) NOT NULL,
    PRIMARY KEY ( INDEX_X, INDEX_Y )
)

这里有一种方法:

class Program {
    static void Main(string[] args) {
        double[,] pt = {
            { 0.3, 0.2, 0.1, 0.8 },
            { 0.2, 0.5, 0.5, 0.1 },
            { 0.1, 0.6, 0.5, 0.2 }
        };
        // Replace SqlConnection with what is specific to your ADO.NET provider / DBMS.
        using (var conn = new SqlConnection("your connection string")) {
            conn.Open();
            using (var cmd = conn.CreateCommand()) {
                // Construct SQL text (use parameter prefix specific to your DBMS instead of @ as appropriate).
                var sb = new StringBuilder();
                for (int y = 0; y < pt.GetLength(0); ++y)
                    for (int x = 0; x < pt.GetLength(1); ++x)
                        sb.Append(
                            string.Format(
                                "INSERT INTO YOUR_TABLE (INDEX_X, INDEX_Y, VALUE) VALUES (@index_x_{0}_{1}, @index_y_{1}_{1}, @value_{0}_{1});",
                                x,
                                y
                            )
                        );

                cmd.CommandText = sb.ToString();
                // Bind parameters.
                for (int y = 0; y < pt.GetLength(0); ++y)
                    for (int x = 0; x < pt.GetLength(1); ++x) {
                        cmd.Parameters.AddWithValue(string.Format("@index_x_{0}_{1}", x, y), x);
                        cmd.Parameters.AddWithValue(string.Format("@index_y_{0}_{1}", x, y), y);
                        cmd.Parameters.AddWithValue(string.Format("@value_{0}_{1}", x, y), pt[y, x]);
                    }
                // Perform the actual insert.
                cmd.ExecuteNonQuery();
            }
        }
    }
}

有更高效但特定于DBMS的解决方案,例如:

  • Oracle:
    • 数组绑定参数
    • OracleBulkCopy
    • 接收数组作为输入的存储过程
  • MS SQL Server:
    • SqlBulkCopy
    • 接收XML或表值参数作为输入的存储过程
  • 等等

您可以将数组作为字符串存储在数据库中。根据一个字段中可以存储的最大文本大小,可以一行一行,也可以一次存储整个数组。可以使用您自己的格式,如逗号分隔或XML。如果数组大小不同,请将其大小存储在单独的字段或第一行文本中。

使用类似JSON.NET的东西对其进行序列化,并将其存储为字符串。如果这就是您存储的全部内容,那么您甚至不需要数据库。