mysql批量加逗号_批量插入数据到数据库的方式
出于性能的考慮。用Insert語句一條一條的插入大量數據到數據庫肯定不是最好的選擇。指不定還會把數據庫搞死了。
前幾天,用戶提了需求,要求寫Job實現,每天清空一個Table,然后將新發過來的數據Insert到數據庫中。想著一條條Insert有點遜。于是就去查了批量插入數據的方法。看到可以用OracleBuckCopy進行批量操作(一臉驚喜), 但是我想要清空表成功之后,就執行批量插入數據,如果都成功就commit,否則就rollback. 然后我就死在了這,因為OracleBuckCopy中的writeToServer不能和清空數據庫共享一個Transaction. 必須是單獨的Transaction.?那要是我清空了數據庫,然后還插入失敗了,空空如也的數據庫豈不是會讓我死的很難看。。
So,我就想,反正數據量不是那么大。那我就Low一點算了,一條一條Insert得了,反正沒人看得見(手上的系統不止一個,事情還一起來,在忙忙人海中迷茫)。噠噠噠,屁顛顛的去改了代碼,三下五除二,搞定(簡直不要太高興),帥不過三秒。發現當數據超過296條,就會死翹翹啦,一直說達到了游標最大數(ORA-01000?什么鬼?游標?)。我沒用游標啊,就一個Delete和N個Insert語句啊?(一臉狗帶像)。。網上一搜,說什么數據庫默認游標300,可能系統占幾個,所以就只能插入296條數據。不知是個啥么子原理。要去改游標數,改成多少呢?數據量不定啊,萬一以后外部系統的數據過大,我設置的游標豈不是不夠用?
What?
who am I?
where am I?
what is the purpose?
發現自己越走越遠,于是準備洗心革面,從頭來過。
OK,在一個事務中,實現清空表,然后批量插入數據。
鑒于自己不能徒手寫1000行代碼(活該單身),于是在網上搜搜搜,終于,讓我看到了一個讓我心動的代碼。借鑒部分代碼,測試后,性能幫幫噠。自己的功能也實現了。
So, 小小記錄一下,萬一以后就又有用了呢。
一,使用參數數組的方式,批量Insert數據 ,速度快,但是代碼中定義參數稍顯麻煩。同時,要么全部成功Insert數據庫,如果失敗全部都Insert失敗。
我在代碼中使用這種方法,是因為要做到,清空表和Insert成功都成功,則Commit,否則,回滾所有的操作。
A part of my code, just as a conference.
//設置一個連接字符串,最好放到Config文件中,以便在不懂環境中測試的時候好修改;//
OracleConnection conn= newOraceConnection(connectStr);
OracleCommand commad= newOracleCommand();//這個參數需要指定每次批量Insert的記錄數
command.ArraryBindCount =recordsCount;//在這個SQL語句中,用到了參數,參數我們很熟悉,但是這個參數在傳值的時候,用到的是數組,而不是單個的值。
command.CommandText = "insert into student values(:stuId,:stuName,:sex)";
conn.Open();//下面定義幾個數組,分別是三個字段,數組的長度由參數決定
int[] sutId = new int[recordsCount];string[] stuName = new string[recordsCount];string[] sex = new string[recordsCount];//為了傳遞參數,不可避免的要使用參數,下面會連續定義三個參數
OracleParameter stuIdParam = new OracleParameter("stuId",OracleType.Int32);
stuIdParam.Direction=ParameterDirection.Input;
stuIdParam.Value=stuId;
command.Parameters.Add(stuIdParam);
OracleParameter stuNameParam= new OracleParameter("stuName",OracleType.VarChar2);
stuNameParam.Direction=ParameterDirection.Input;
stuNameParam.Value=stuName;
command.Parameters.Add(stuNameParam);
OracleParameter sexParam= new OracleParameter("sex",OracleType.VarChar2);
sexParam.Direction=ParameterDirection.Input;
sexParam.Value=sex;
command.Parameters.Add(sexParam);//在下面的循環中,先把數組定義好,而不是如往常那樣直接生成SQL
for(int i = 0; int
{
stuId[i]= if;
stuName[i]=i.ToString();
sex[i]=i.ToString();
}//這個調用將把參數數組傳入SQL,同時寫入數據庫
command.ExecuteNonQuery();
View Code
二, 用OracleBuckCopy,批量插入數據到數據庫。但是要注意,只能在版本為11及以上數據庫才可以用。如果代碼中和服務器中的Oracle.DataAccess.dll版本不同,可以在配置文件中設置即可。
publicKeyToken= "89B483F429C47342"
culture= "neutral" />
oldVersion= "2.112.1.0"
newVersion= "2.112.1.2"/>
public voidBulkToDB(DataTable dt)
{using (OracleBulkCopy bcp = newOracleBulkCopy(con,OracleBulkCopyOptions.UseInternalTransaction))
{
bcp.BatchSize= 400;
bcp.BulkCopyTimeout= 1000;
bcp.DestinationTableName= "";try{
bcp.WriteToServer(dt);
}catch(Exception ex)
{throw newException(ex.ToString());
}finally{
bcp.Close();
con.Close();
}
}
}
View Code
三。用SQL Loder批量插入數據,感興趣的自己去研究,看到很多人寫過這個,自己動手用用就OK了,可以點擊這里看別人總結的。
小小總結一下,備查。
總結
以上是生活随笔為你收集整理的mysql批量加逗号_批量插入数据到数据库的方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全连接where 取最新日期_SQL学习
- 下一篇: excel了解mysql_对比Excel