C#循环和大量插入
本文关键字:插入 循环 | 更新日期: 2023-09-27 18:20:32
下面的代码将在我的数据库中插入一些值。它获得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#录制100000条记录?我希望能够通过我的方法生成随机数,并利用我的插入。。
对于真正的大规模插入,SqlBulkCopy
是您的朋友。要做到这一点,简单但效率低下的方法就是用数据填充DataTable
,并将其扔到SqlBulkCopy
,但通过欺骗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);
}
您需要Sql大容量插入。有一个很好的msdn教程http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx
基本上,您可以用要放入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