0

次のコードは、データベースにいくつかの値を挿入します。6 つのランダムな値を取得し、それらを配列に入れ、データベースに挿入します。

    public void LottoTest(object sender, EventArgs e)
    {
        Dictionary<int, int> numbers = new Dictionary<int, int>();
        Random generator = new Random();
        while (numbers.Count < 6)
        {
            numbers[generator.Next(1, 49)] = 1;
        }

        string[] lotto = numbers.Keys.OrderBy(n => n).Select(s => s.ToString()).ToArray();

        foreach (String _str in lotto)
        {
            Response.Write(_str);
            Response.Write(",");
        }


        var connectionstring = "Server=C;Database=lotto;User Id=lottoadmin;Password=password;";

        using (var con = new SqlConnection(connectionstring))  // Create connection with automatic disposal
        {
            con.Open();
            using (var tran = con.BeginTransaction())  // Open a transaction
            {
                // Create command with parameters  (DO NOT PUT VALUES IN LINE!!!!!)
                string sql =
                    "insert into CustomerSelections(val1,val2,val3,val4,val5,val6) values (@val1,@val2,@val3,@val4,@val5,@val6)";
                var cmd = new SqlCommand(sql, con);
                cmd.Parameters.AddWithValue("val1", lotto[0]);
                cmd.Parameters.AddWithValue("val2", lotto[1]);
                cmd.Parameters.AddWithValue("val3", lotto[2]);
                cmd.Parameters.AddWithValue("val4", lotto[3]);
                cmd.Parameters.AddWithValue("val5", lotto[4]);
                cmd.Parameters.AddWithValue("val6", lotto[5]);


                cmd.Transaction = tran;
                cmd.ExecuteNonQuery(); // Insert Record

                tran.Commit();  // commit transaction
                Response.Write("<br />");
                Response.Write("<br />");
                Response.Write("Ticket has been registered!");
            }
        }


    }

MASS エントリをループしてデータベースに挿入する最良の方法は何ですか。たとえば、C# 経由で 100,000 レコードですか? 私は自分の方法で乱数を生成し、私も持っている挿入を利用できるようにしたい..

4

3 に答える 3

8

真の大規模なインサートについてSqlBulkCopyは、あなたの友人です. これを行う簡単だが効率の悪い方法は、 aDataTableにデータを入力し、それを にスローするSqlBulkCopyことですが、 an をスプーフィングすることで 2 倍の速さで実行できます (信頼してください。時間を計りました) IDataReader。最近、便宜上このコードをFastMemberに移動したので、次のようなことができます。

class YourDataType {
    public int val1 {get;set;}
    public string val2 {get;set;}
    ... etc
    public DateTime val6 {get;set;}
}

次に、反復子ブロックを作成します(つまり、バッファリングされていない転送のみのリーダー)。

public IEnumerable<YourDataType> InventSomeData(int count) {
    for(int i = 0 ; i < count ; i++) {
        var obj = new YourDataType {
           ... initialize your random per row values here...
        }
        yield return obj;
    }
}

それから:

var data = InventSomeData(1000000);
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data))
{ // note that you can be more selective with the column map
    bcp.DestinationTableName = "CustomerSelections";
    bcp.WriteToServer(reader);
}
于 2013-07-01T18:47:47.290 に答える
1

Sql一括挿入が必要です。msdn http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspxにすばらしいチュートリアルがあります。

于 2013-07-01T18:40:17.563 に答える
1

MSDN テーブル値パラメーター

基本的に、SqlServer に入れたいデータをデータテーブルに入力します。

DataTable tvp = new DataTable("LottoNumbers");
forach(var numberSet in numbers)
    // add the data to the dataset

次に、次のようなコードを使用して ADO 経由でデータを渡します...

command.Parameters.Add("@CustomerLottoNumbers", SqlDbType.Structured);
command.Parameters["CustomerLottoNumbers"].Value = tvp;

次に、これに似たSQLを使用できます...

INSERT CustomerSelections
SELECT * from @CustomerLottoNumbers
于 2013-07-01T18:40:48.407 に答える