我有一个数据集ds,怎么样将数据集一次性传入sql数据表:
以前使用遍历方法,现在由于数据量越来越大,如果再这样下去可能系统将会死掉.

解决方案 »

  1.   

    参考自动批量更新DataSet中的数据到数据库
            [WebMethod(Description = "Update服务提供的方法,将包含修改后数据的DateSet与本地数据库同步更新,成功返回更新的行数,失败返回-1。"), SoapHeader("currentUser")]
            public int Update(DataSet ds)
            {
                if (!ValidateUser(currentUser.UserName, currentUser.UserPass))
                {
                    return -1;
                }
                else
                {
                    int res = 0;
                    using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=xxxx;User ID=sa;Password=sa"))
                    {
                        sqlconn.Open();
                        / / //使用加强读写锁事务
                        SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
                        try
                        {
                            foreach (DataRow dr in ds.Tables[0].Rows)
                            {
                                //所有行设为修改状态
                                dr.SetModified();
                            }
                            //为Adapter定位目标表
                            SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where 1=0 ", ds.Tables[0].TableName), sqlconn, tran);
                            SqlDataAdapter da = new SqlDataAdapter(cmd);
                            SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
                            da.AcceptChangesDuringUpdate = false;
                            SqlCommand updatecmd = new SqlCommand(string.Format(" UPDATE [{0}] SET  [Name] = @Name WHERE ([ID] = @ID) ", ds.Tables[0].TableName));
                            //不修改源DataTable
                            updatecmd.UpdatedRowSource = UpdateRowSource.None;
                            da.UpdateCommand = updatecmd;
                            da.UpdateCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 50, "Name");
                            da.UpdateCommand.Parameters.Add("@ID", SqlDbType.Int, 4, ds.Tables[0].Columns[0].ColumnName);
                            da.UpdateBatchSize = 10000;
                            res = da.Update(ds.Tables[0]);
                            ds.AcceptChanges();
                            tran.Commit();
                            sqlconn.Close();
                        }
                        catch 
                        {
                      
                            tran.Rollback();
                            return -1;
                        }
                    }
                    return res;
                }
            }
      

  2.   

    ds 数据集其实也就相当于表了
    遍历效率太低,最简单的方式就是按格式存储在文件中。。
    用SQLServer的导入导出文本文件即可。。效率高,速度快。参考:
    http://www.360doc.com/content/10/0427/12/114824_25102588.shtml
      

  3.   


     #region 批量插入
            /// <summary>
            /// 将DataTable中数据批量插入远程服务器的数据表中
            /// </summary>
            /// <param name="dt">源数据集</param>
            /// <param name="Conn">目标服务器的数据连接字符串</param>
            /// <param name="FieldStr">要插入的字段</param>
            /// <param name="TableName">目标服务器的表名</param>
            //protected void SqlBulkCopyData(DataTable dt, string Conn, string[] FieldStr, String TableName)
            //{
            //    //使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表
            //    SqlBulkCopy bcp = new SqlBulkCopy(Conn);        //    //指定目标数据库的表名
            //    bcp.DestinationTableName = TableName;        //    //指定源列和目标列
            //    foreach (string field in FieldStr)
            //    {
            //        bcp.ColumnMappings.Add(field, field);
            //    }
            //    //写入数据库表
            //    bcp.WriteToServer(dt);        //    bcp.Close();        //}        #endregion
      

  4.   

    如果你的Dataset的数据很多,那不肯能每条数据都需要更新吧,你应该只更新那些修改的数据