用c# 將Access表修改複製到Sql server表

開始想直接在sql server 2008用存儲過程寫。用到了OpenRowSetopendatasource兩個函數,然而啓用Ad Hoc DistributedQueries的方法後還是一直報錯,查了資料可能是因爲使用的是64位系統,最終也沒改好,以後再來研究,可以參考http://www.cnblogs.com/OpenCoder/archive/2010/03/18/1689321.html

由於時間緊迫,就換了個方法在vs2014上用c#做:

A 打開Access數據庫

private bool OpenDbAccess()
        {
            try
            {
                //捕獲數據庫打開異常
             OleDbConnection _oleDbConn = new OleDbConnection(@"provider=microsoft.jet.oledb.4.0; Data Source=C:\Data.mdb");
                _oleDbConn.Open();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

B 打開sql  server數據庫

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=服務器地址;uid=sa;pwd=xxx;database=數據庫名";
conn.Open();

C 用SQL語句查詢Access表內容

OleDbDataAdapter _oleDbAda = new OleDbDataAdapter(SQL語句, Access表連接);

                if (!string.IsNullOrEmpty(SQL語句) && !string.IsNullOrEmpty(Access表名))//要求表和sql語句不爲空
                {
                    var dt = new DataSet();//聲明結果集對象
                    _oleDbAda.Fill(dt, tableName);
                    
                    if (dt != null)
                    {
                        SqlBulkCopyData(dt);
                    }

                    _oleDbAda.Dispose();
                    _oleDbConn.Close();
                    return dt;
                }
                else
                {
                    return null;
                }

DataSet的Fill方法形象的解說 http://blog.sina.com.cn/s/blog_67737c1d01017ike.html

D 對Access表中數據進行修改

方法:克隆Access表結構,修改後存入新表中

if (dt != null)	
            {
                //將DataSet轉成DataTable
                DataTable data = dt.Tables[0];
                
                //克隆data表用於修改Access內容
                DataTable dtResult = new DataTable();
                dtResult = data.Clone();//克隆表結構
                foreach (DataRow row in data.Rows) 
                {
                    DataRow rowNew = dtResult.NewRow();
                    rowNew["ID"] = row["ID"];
                    //修改Area記錄值,保留到省
                    if (rowNew["Area "] != null)
                    {
                        var areaInt = row["Area"].ToString().IndexOf(" ");
                        rowNew["Area "] = row["Area "].ToString().Substring(0, areaInt); //截取字符串空格前面的內容
                    }
                    else 
                    {
                        rowNew["Area "] = row["Area "];
                    }

                    //修改Type記錄值,去掉“中國”
                    if (rowNew["Type"] != null)
                    {
                        rowNew["Type "] = row["Type "].ToString().Replace("中國", " ");
                    }
                    else 
                    {
                        rowNew["Type "] = row["Type "];
                    }
                    dtResult.Rows.Add(rowNew);

Access轉SQL server 注意事項  http://www.jb51.net/article/6869.htm

E Access表中內容批量複製到Sqlserver 中

SqlTransaction sqlbulkTransaction = conn.BeginTransaction();
            //插入數據的同時檢查約束,如果發生錯誤調用sqlbulkTransaction事務
            SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.CheckConstraints, sqlbulkTransaction);
//直接導入大數據
                for (var i = 0; i < 6; i++)//i爲Access中列的數量 
                {
                    copy.ColumnMappings.Add(dtResult.Columns[i].ColumnName, data.Columns[i].ColumnName);
                }  
                try
                {
                    copy.WriteToServer(dtResult);
                    
                    //提交事務
                    sqlbulkTransaction.Commit();
                }
                catch (Exception e)
                {
                    //回滾事務
                    sqlbulkTransaction.Rollback();
                    Console.WriteLine(e.ToString());
                }
                finally 
                {
                    copy.Close();
                    conn.Close();
                }


第一次做,查了很多資料,

參考:

C#操作連接Access數據庫

http://jingyan.baidu.com/article/ab0b563094fab9c15afa7d8c.html

關於批量導入數據類SqlBulkCopy 導入數據時增加額外的列

http://q.cnblogs.com/q/37192/

修改數據表DataTable某一列的類型和記錄值http://www.cnblogs.com/starxp/articles/1789607.html

C# 如何批量插入、修改http://wenku.baidu.com/link?url=eyByxtRv9iOU9ayAEAVEjIR1gjbMn1oxShWZ-wHYznKecTGUxF4enrxbni4gfNFxXduRwcB7v7GoKDPI7c0i6V7E2bqS1gVT5ETOTYdTaV_

批量複製操作(SqlBulkCopy)的出錯處理:事務提交、回滾

http://blog.csdn.net/westsource/article/details/6658109

C# 使用SqlBulkCopy類批量複製大數據

http://www.cnblogs.com/zfanlong1314/archive/2013/02/05/2892998.html

SqlBulkCopy(批量複製)使用方法

http://www.cnblogs.com/scottckt/archive/2011/02/16/1955862.html

使用事務和SqlBulkCopy導入大批量數據

http://blog.csdn.net/okman1214/article/details/6938037

 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章