插入SQL数据库时大量的数据处理 [英] Dealing with huge amount of data when inserting into sql database

查看:117
本文介绍了插入SQL数据库时大量的数据处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码,用户可以上传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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆