我正在使用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阵列?
任何例子都会很棒!
答案 0 :(得分:2)
通过在每个点执行单独的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特定的解决方案,例如:
答案 1 :(得分:0)
您可以将数组作为字符串存储在db中。可以是一行一行,也可以是整个数组,具体取决于您可以在一个字段中存储的最大文本大小。使用您自己的格式,如逗号分隔或XML。如果数组大小不同,请将其大小存储在单独的字段中或第一个文本行中。
答案 2 :(得分:0)
使用JSON.NET等序列化它并将其存储为字符串。如果这就是您要存储的全部内容,那么您甚至不需要数据库。