91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SqlCommandBuilder類如何批量更新excel或者CSV數據

發布時間:2021-09-09 17:02:06 來源:億速云 閱讀:96 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關SqlCommandBuilder類如何批量更新excel或者CSV數據的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

當你批量操作數據的時候,常常會使用到update table1 from table2的這種方式,這種方式是最簡潔的。
但當你從excel或者CSV文件更新海量數據時,再使用這種方法,那性能是不是好?字符串拼接又何其之多,大數據是不是需要分組更新?
我不想去檢測各種方法的速度,因為我個人比較認可以下方式,歡迎大家批評與指正。
我需要使用到的類主要是SqlCommandBuilder

/// <param name="table">準備更新的DataTable新數據</param>
  /// <param name="TableName">對應要更新的數據庫表名</param>
  /// <param name="primaryKeyName">對應要更新的數據庫表的主鍵名</param>
  /// <param name="columnsName">對應要更新的列的列名集合</param>
  /// <param name="limitColumns">需要在SQL的WHERE條件中限定的條件字符串,可為空。</param>
  /// <param name="onceUpdateNumber">每次往返處理的行數</param>
  /// <returns>返回更新的行數</returns>
  public static int Update(DataTable table, string TableName, string primaryKeyName, string[] columnsName, string limitWhere,int onceUpdateNumber)
  {
    if (string.IsNullOrEmpty(TableName)) return 0;
    if (string.IsNullOrEmpty(primaryKeyName)) return 0;
    if (columnsName == null || columnsName.Length <= 0) return 0;
    DataSet ds = new DataSet();
    ds.Tables.Add(table);
    int result = 0;
    using (SqlConnection sqlconn = new SqlConnection(SqlHelper.ConnString))
    {
      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}", TableName,limitWhere), sqlconn, tran);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
        da.AcceptChangesDuringUpdate = false;
        string columnsUpdateSql = "";
        SqlParameter[] paras = new SqlParameter[columnsName.Length];
        //需要更新的列設置參數是,參數名為"@+列名"
        for (int i = 0; i < columnsName.Length; i++)
        {
          //此處拼接要更新的列名及其參數值
          columnsUpdateSql += ("[" + columnsName[i] + "]" + "=@" + columnsName[i] + ",");
          paras[i] = new SqlParameter("@" + columnsName[i], columnsName[i]);
        }
        if (!string.IsNullOrEmpty(columnsUpdateSql))
        {
          //此處去掉拼接處最后一個","
          columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1);
        }
        //此處生成where條件語句
        string limitSql = ("[" + primaryKeyName + "]" + "=@" + primaryKeyName);
        SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", TableName, columnsUpdateSql, limitSql));
        //不修改源DataTable  
        updateCmd.UpdatedRowSource = UpdateRowSource.None;
        da.UpdateCommand = updateCmd;
        da.UpdateCommand.Parameters.AddRange(paras);
        da.UpdateCommand.Parameters.Add("@" + primaryKeyName, primaryKeyName);
        //每次往返處理的行數
        da.UpdateBatchSize = onceUpdateNumber;
        result = da.Update(ds,TableName);
        ds.AcceptChanges();
        tran.Commit();

      }
      catch
      {
        tran.Rollback();
      }
      finally
      {
        sqlconn.Dispose();
        sqlconn.Close();
      }


    }
    return result;
  }

注: 此方法調用時要傳入的參數,包括主鍵名和列名都應與數據庫實際的名稱相對應。
你可以不傳入限定的where條件,如果傳入,只需傳入:Name="chamy" or Name="jundy",不需加入“where”等字符,不可以在此處傳入主鍵的限定,你只需要在主鍵名這個參數上傳入名稱即可。

感謝各位的閱讀!關于“SqlCommandBuilder類如何批量更新excel或者CSV數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东丽区| 东港市| 新巴尔虎右旗| 莱芜市| 西乡县| 平江县| 留坝县| 涟水县| 和林格尔县| 泾阳县| 安达市| 彭山县| 湟中县| 朝阳县| 增城市| 彩票| 临沂市| 阿勒泰市| 海口市| 岚皋县| 三都| 阳曲县| 宜宾县| 庆阳市| 阳泉市| 瓦房店市| 临汾市| 衡水市| 木里| 百色市| 长沙市| 夏津县| 固阳县| 崇文区| 白玉县| 苍山县| 尚义县| 叙永县| 惠安县| 芒康县| 嘉定区|