插入SQL数据库时大量的数据处理 [英] Dealing with huge amount of data when inserting into sql database
问题描述
在我的代码,用户可以上传Excel文档的心愿包含它的电话联系list.Me作为开发者应当阅读Excel文件把它变成一个DataTable并将其插入到数据库中。
的问题是,一些客户有一个庞大的接触量好像是说5000和更多的接触,当我尝试这个数据量插入它的崩溃数据库,并给了我一个超时异常。
什么是避免这种例外,是他们的,可以降低INSERT语句的时间,使用户不用等待太久的任何代码的最好方法?
中的代码
公共SqlConnection的连接=新的SqlConnection(系统。 Configuration.ConfigurationManager.ConnectionStrings [的ConnectionString]的ConnectionString)。
公共无效插入(字符串InsertQuery)
{
SqlDataAdapter的ADP =新的SqlDataAdapter();
adp.InsertCommand =新的SqlCommand(InsertQuery,连接);如果
(connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
adp.InsertCommand.ExecuteNonQuery();
的Connection.close();
}
保护无效submit_Click(对象发件人,EventArgs五)
{
串UploadFolder =Savedfiles /;
如果(Upload.HasFile){
字符串文件名= Upload.PostedFile.FileName;
路径字符串=使用Server.Mappath(UploadFolder +文件名);
Upload.SaveAs(路径);
Msg.Text =上传成功;
的DataTable ValuesDt =新的DataTable();
ValuesDt = ConvertExcelFileToDataTable(路径);
会话[valuesdt] = ValuesDt;
Excel_grd.DataSource = ValuesDt;
Excel_grd.DataBind();
}
}
保护无效SendToServer_Click(对象发件人,EventArgs五)
{
DataTable中值=会话[ valuesdt]作为数据表;
如果(Values.Rows.Count大于0)
{
DataTable的DV = Values.DefaultView.ToTable(真的,Mobile1,移动电话2,电话,类别) ;
双Mobile1,移动电话2,联系电话;串类=;
的for(int i = 0; I< Values.Rows.Count;我++)
{
Mobile1 = Values.Rows [I] [Mobile1]的ToString()== ?0:double.Parse(Values.Rows [1]。[Mobile1]的ToString());
移动电话2 = Values.Rows [I] [移动电话2]。的ToString()==? (Values.Rows [I] [移动电话2]的ToString()):0 double.Parse;
TEL = Values.Rows [I] [电话]。的ToString()==? 0:double.Parse(Values.Rows [I] [电话]的ToString());
类别= Values.Rows [I] [类别]的ToString()。
插入(INSERT INTO客户端(Mobile1,移动电话2,电话,类别)VALUES(+ Mobile1 +,+移动电话2 +,+电话+,'+分类+'));
Msg.Text =Submitied成功到服务器;
}
}
}
您可以尝试 SqlBulkCopy的
插入DataTable添加到数据库表
这样的事情,
使用(SqlBulkCopy的bulkCopy =新SqlBulkCopy的(的SqlConnection,SqlBulkCopyOptions.KeepIdentity) )
{
bulkCopy.DestinationTableName = DestTableName;
的String [] = DtColumnName YourDataTableColumns;
的foreach(在DbColumnName串dbcol)//要映射的数据表列到该数据库tabele
{
的foreach(在DtColumnName串dtcol)
{
如果( dbcol.ToLower()== dtcol.ToLower())
{
SqlBulkCopyColumnMapping的azazaz =新SqlBulkCopyColumnMapping(dtcol,dbcol);
bulkCopy.ColumnMappings.Add(的azazaz);
中断;
}
}
}
bulkCopy.WriteToServer(YourDataTableName.CreateDataReader());
bulkCopy.Close();
}
有关更多阅读的 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
in my code the user can upload an excel document wish contains it's phone contact list.Me as a developer should read that excel file turn it into a dataTable and insert it into the database . The Problem is that some clients have a huge amount of contacts like saying 5000 and more contacts and when i am trying to insert this amount of data into the database it's crashing and giving me a timeout exception. What would be the best way to avoid this kind of exception and is their any code that can reduce the time of the insert statement so the user don't wait too long ?
the code
public SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
public void Insert(string InsertQuery)
{
SqlDataAdapter adp = new SqlDataAdapter();
adp.InsertCommand = new SqlCommand(InsertQuery, connection);
if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
adp.InsertCommand.ExecuteNonQuery();
connection.Close();
}
protected void submit_Click(object sender, EventArgs e)
{
string UploadFolder = "Savedfiles/";
if (Upload.HasFile) {
string fileName = Upload.PostedFile.FileName;
string path=Server.MapPath(UploadFolder+fileName);
Upload.SaveAs(path);
Msg.Text = "successfully uploaded";
DataTable ValuesDt = new DataTable();
ValuesDt = ConvertExcelFileToDataTable(path);
Session["valuesdt"] = ValuesDt;
Excel_grd.DataSource = ValuesDt;
Excel_grd.DataBind();
}
}
protected void SendToServer_Click(object sender, EventArgs e)
{
DataTable Values = Session["valuesdt"] as DataTable ;
if(Values.Rows.Count>0)
{
DataTable dv = Values.DefaultView.ToTable(true, "Mobile1", "Mobile2", "Tel", "Category");
double Mobile1,Mobile2,Tel;string Category="";
for (int i = 0; i < Values.Rows.Count; i++)
{
Mobile1 =Values.Rows[i]["Mobile1"].ToString()==""?0: double.Parse(Values.Rows[i]["Mobile1"].ToString());
Mobile2 = Values.Rows[i]["Mobile2"].ToString() == "" ? 0 : double.Parse(Values.Rows[i]["Mobile2"].ToString());
Tel = Values.Rows[i]["Tel"].ToString() == "" ? 0 : double.Parse(Values.Rows[i]["Tel"].ToString());
Category = Values.Rows[i]["Category"].ToString();
Insert("INSERT INTO client(Mobile1,Mobile2,Tel,Category) VALUES(" + Mobile1 + "," + Mobile2 + "," + Tel + ",'" + Category + "')");
Msg.Text = "Submitied successfully to the server ";
}
}
}
You can try SqlBulkCopy
to insert Datatable to Database Table
Something like this,
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnection, SqlBulkCopyOptions.KeepIdentity))
{
bulkCopy.DestinationTableName = DestTableName;
string[] DtColumnName = YourDataTableColumns;
foreach (string dbcol in DbColumnName)//To map Column of Datatable to that of DataBase tabele
{
foreach (string dtcol in DtColumnName)
{
if (dbcol.ToLower() == dtcol.ToLower())
{
SqlBulkCopyColumnMapping mapID = new SqlBulkCopyColumnMapping(dtcol, dbcol);
bulkCopy.ColumnMappings.Add(mapID);
break;
}
}
}
bulkCopy.WriteToServer(YourDataTableName.CreateDataReader());
bulkCopy.Close();
}
For more Read http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
这篇关于插入SQL数据库时大量的数据处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!