0

在将数据从变量、数组、列表传输到我的 SQL Server 时,我几乎不需要任何帮助。

我的 SQL 还不错,但我不熟悉 DataSet、DataTable 对象。

我的数据现在存储在字符串列表(列表)中。该列表中的每个字符串都与此类似:

QWERTY,19920604,0.91,0.35,0.34,0.35,343840

这样的行大约有 900000 行,但大导入只会发生一次。

SQL Server 中的目标数据类型:

BIGINT (primary key, im not inserting it, its identity(1,1))
VARCHAR(10), 
DATE, 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
INT
  1. 如何将该数据转换为 SQL Server 数据类型?

  2. 如何将该数据插入 SQL Server?我还需要插入之间的一些进度条更新。

我可以使用老式 SQL 命令来做到这一点,但我终于学会了更现代的方式,通过使用 DataTable对象。

4

4 回答 4

2

你可以使用 sqlbulkcopy,这里有一些例子:http: //msdn.microsoft.com/en-us/library/7ek5da1a.aspx

于 2012-10-04T15:36:32.333 回答
1

我刚开始转向实体框架,它大大降低了我的代码复杂性。为此,我通过以下步骤使用实体框架添加了一个新数据源:

  1. 添加新数据源
  2. 在数据源配置向导中,选择数据库
  3. 选择实体数据模型
  4. 选择从数据库生成
  5. 创建新连接
  6. 选择您的表格并单击完成

编译您的项目,以便您可以使用您的对象,然后在您的代码中,您可以通过以下方式创建您的访问权限:

var entity = new DatabaseEntity();

在实体中,您现在将看到一系列表格和各种使用方法。要执行,您可以使用 linq,例如:

var order = new entity.fulfilled_shipments_data
                    {
                         addedCustomer = 0,
                         addedFulfillment = 0,
                         addedInvoice = 0,
                          ...
                     }
entity.fulfilled_shipments_data.AddObject(order);
entity.SaveChanges();

请记住,您的分配现在可以是您拥有的任何对象,并且还可能包括对其他方法的调用(例如,price = Convert.ToDecimal(price),

于 2012-10-04T16:08:53.420 回答
0

使用 ADO.NET,可能最简单和最安全的方法是使用循环:

private void InsertList(IEnumerable<String> list)
{
    String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);";
    using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
    {
        con.Open();
        foreach (String str in list)
        {
            String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            if (fields.Length == 7)
            { 
                DateTime dateCol;
                if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol))
                {
                    decimal d1, d2, d3, d4;
                    int i1;
                    if(decimal.TryParse(fields[2], out d1)
                        && decimal.TryParse(fields[3], out d2)
                        && decimal.TryParse(fields[4], out d3)
                        && decimal.TryParse(fields[5], out d4)
                        && int.TryParse(fields[6], out i1))
                    {
                        using(var cmd = new SqlCommand(sql, con))
                        {
                            cmd.Parameters.AddWithValue("@varcharCol", fields[0]);
                            cmd.Parameters.AddWithValue("@dateCol", dateCol);
                            cmd.Parameters.AddWithValue("@decCol1", d1);
                            cmd.Parameters.AddWithValue("@decCol2", d2);
                            cmd.Parameters.AddWithValue("@decCol3", d3);
                            cmd.Parameters.AddWithValue("@decCol4", d4);
                            cmd.Parameters.AddWithValue("@intCol", i1);
                            int inserted = cmd.ExecuteNonQuery(); // should be 1
                        }
                    }
                }
            }
        }
    }
}

您应该添加日志记录(解析问题)和异常处理(连接问题)。

这种方法还可以轻松添加进度条。因此,您可以使用 a BackgroundWorkerwhich update a Progressbarvia ReportProgress

这是一个教程: http: //www.dotnetperls.com/progressbar

于 2012-10-04T15:53:24.127 回答
0

我做了这样的事情:

foreach (string currentrow in buffer) // List<string> buffer - contains csv data
{
                // table name is Import
                dataset.ImportRow row = dataset.Import.NewImportRow();
                string[] fields = new string[7];

                // Field names
                // <Nm>,<Date>,<Open>,<High>,<Low>,<Close>,<Vol>
                fields = currentrow.Split(',');

                // ticker
                row.Nm = fields[0];

                DateTime data;
                DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out data);
                row.Date = data;

                decimal open;
                Decimal.TryParse(fields[2], out open);
                row.Open = open;

                decimal high;
                Decimal.TryParse(fields[3], out high);
                row.High = high;

                decimal low;
                Decimal.TryParse(fields[4], out low);
                row.Low = low;

                decimal close;
                Decimal.TryParse(fields[5], out close);
                row.Close = close;

                int vol;
                Int32.TryParse(fields[6], out vol);
                row.Vol = vol;

                dataset.Import.AddImportRow(row);

            }

        importTableAdapter.Update(dataset);
        MessageBox.Show("Done");

它可以工作并且看起来很优雅。我必须处理异常。

于 2012-10-04T17:35:45.057 回答