从Dictionary到DB上的单个表的所有行

时间:2017-08-03 13:47:15

标签: c# sql-server dictionary

此问题已多次发布(1234),但我找不到适合我案例的问题。< / p>

我有一个结构字典:

public Dictionary<Int32, PhaseMag> Data;

PhaseMag:

public struct PhaseMag
{
    public Single Magnitude;
    public Single Phase;
}

每个Key值将包含两个2值(Mag。和Phase)。如果您希望看到an image

  • 我需要将此Dictionary的所有内容存储在DB(Microsoft SQL)中的唯一表中。字典的每一行应该成为我的数据库表的一行。我的决赛桌将包含3个领域,1)Key 2)Mag和3)Phase。例如,如果我有30个键,我的表将包含30行,每个键一个。

我的想法:

  • 根据每个Key创建一个foreach循环,并创建一个插入到DB(一个用于Key-&gt; Mag,另一个用于Key-&gt; Phase)。但我不认为这将是最好的方法,尤其是因为我的词典包含数千行。

那么,我应该采取什么方法呢?我只需要将我的词典保存到DB中,这就是Dic的每一行。将是DB的一行。

1 个答案:

答案 0 :(得分:1)

假设您正在使用SQL Server,这是您拥有的众多选项中的两个:

  1. 批量插入,建议使用。

    public void BulkWrite(Dictionary<Int32, PhaseMag> data)
    {
        var dataTable = new DataTable();
        dataTable.Columns.Add(new DataColumn { DataType = typeof(int), ColumnName = "Key" });
        dataTable.Columns.Add(new DataColumn { DataType = typeof(Single), ColumnName = "Magnitude" });
        dataTable.Columns.Add(new DataColumn { DataType = typeof(Single), ColumnName = "Phase" });
    
        foreach (var x in data)
        {
            var r = dataTable.NewRow();
            dataTable.Rows.Add(r);
            r[0] = x.Key;
            r[1] = x.Value.Magnitude;
            r[2] = x.Value.Phase;
        }
    
    
        using (var conn = new SqlConnection("conneciton string"))
        {
            conn.Open();
            using (var bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.BatchSize = 4000;
                bulkCopy.DestinationTableName = "YorTableName";
                bulkCopy.WriteToServer(dataTable);
            }
        }
    }
    
  2. 多个内联查询,以批处理方式执行。由于您的所有数据都是数字,因此即使使用内联查询,SQL注入的风险也很低。

    public void InlineQueryWrite(Dictionary<Int32, PhaseMag> data)
    {
        using (var conn = new SqlConnection("conneciton string"))
        {
            conn.Open();
    
            foreach (var bulk in data.Select((d, i) => new {d, i}).GroupBy(x => x.i % 10))
            {
                var sb = new StringBuilder();
                foreach (var x in bulk)
                {
                    sb.AppendFormat("Insert Into Your_Table (Key, Magnitude, Phase) Values ({0},{1},{2});", x.d.Key, x.d.Value.Magnitude, x.d.Value.Phase);
                }
    
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = sb.ToString();
                    command.ExecuteNonQuery();
                }
            }
    
        }
    }
    
  3. 我没有通过代码运行/测试,但它们应该可以工作。