0

変数、配列、リストから SQL Server にデータを転送するのに少し助けが必要です。

SQL は悪くありませんが、DataSet や DataTable オブジェクトには詳しくありません。

私のデータは文字列のリスト(リスト)に保存されるようになりました。そのリストのすべての文字列は次のようになります。

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

このように約 900000 行ありますが、大きなインポートは 1 回だけ発生します。

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
                        }
                    }
                }
            }
        }
    }
}

ロギング(解析の問題)と例外処理(接続の問題)を追加する必要があります。

このアプローチにより、プログレスバーを簡単に追加することもできます。したがって、 viaBackgroundWorkerを更新するを使用できます。ProgressbarReportProgress

チュートリアルは次のとおりです: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 に答える