成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Access數據庫Insert多條數據的嘗試

數據庫 其他數據庫
當下Access數據庫可能要被遺忘了!比較這個輕量級數據庫被精簡了許多功能,個人感覺用起來還是挺麻煩的!當前Access在企業項目中就是一塊雞肋。數據量小使用SQL Server是浪費,既然選擇了Access就別抱怨了!如果用好了還是一塊寶!廢話不多說了,今天就來探討下如何向Access中插入多條數據把!

由于在此之前我沒有用過Access數據庫的,當需要想數據庫中插入多條數據時,我們不妨先按照sql server的做法:“insert into tablename(column1,column2) values (a,b),(c,d),(e,f)”。于是按照這個思路,我的第一個方案出來了。

嘗試一

The Demo:

  1. StringBuilder BuiList = new StringBuilder(string.Format("({0},0)", UserID));  
  2.             foreach (RepeaterItem item in Rpt_AdminRole.Items)  
  3.             {  
  4.                 if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)  
  5.                 {  
  6.                     HtmlInputCheckBox cbRole = item.FindControl("cb_Role"as HtmlInputCheckBox;  
  7.                     if (cbRole.Checked)  
  8.                     {  
  9.                         BuiList.Append(",(");  
  10.                         BuiList.Append(UserID);  
  11.                         BuiList.Append(",");  
  12.                         BuiList.Append(cbRole.Value);  
  13.                         BuiList.Append(")");  
  14.                     }  
  15.                 }  
  16.             } 

The Dal:

  1. /// <summary>  
  2. /// 添加Role關系  
  3. /// </summary>  
  4. /// <param name="roleContact">角色關系 eg: "(1,1),(1,2)"</param>  
  5. /// <returns></returns>  
  6. public static int InsertRoleContact(string roleContact)  
  7. {  
  8.     string sql = "insert into Sky_Admin_Role(AdminID,RoleID) values "+roleContact;  
  9.     return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, sql, null);  

exec下就會出現這樣的錯誤:SQL 語句的結束位置缺少分號 (;)。

Access對sql的支持果然是大大精簡,到此嘗試一失敗!, 很快在我有另外idea。sql server 多表查詢對select table 的支持!我可以直接傳一個DataTable到sql語句中,說干就干!

嘗試二

The Demo : 獲取DataTable

  1. public DataTable GetInsertSQL(Repeater rep,string controlID)  
  2. {  
  3.     DataTable data = new DataTable();  
  4.     data.Columns.Add("AdminID");  
  5.     data.Columns.Add("RoleID");  
  6.     foreach (RepeaterItem item in rep.Items)  
  7.     {  
  8.         if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)  
  9.         {  
  10.             HtmlInputCheckBox cb = item.FindControl(controlID) as HtmlInputCheckBox;  
  11.             if (cb.Checked)  
  12.             {  
  13.                 DataRow row = data.NewRow();  
  14.                 row.ItemArray = new object[] { UserID, cb.Value};  
  15.                 data.Rows.Add(row);  
  16.             }  
  17.         }  
  18.     }  
  19.     return data;  

The Dal:

  1. public static int InsertRoleContact(DataTable dt)  
  2.         {  
  3.             string sql = "insert into Sky_Admin_Role(AdminID,RoleID) select * from @Data";  
  4.             OleDbParameter[] param = new OleDbParameter[] {   
  5.             new OleDbParameter("@Data",?){Value =dt}  
  6.             };  
  7.             return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, sql, param);  
  8.         } 

當代碼到這里我就知道此方法行不通,因為OledbType中沒有對應的table類型,如果是SQL server由于支持xml可以設置為 SqlDbType.Xml類型來傳遞DataTable數據,由于sql本事對xml的支持 ,可以用sql基于xml的查詢,本文主要討論Access,此處暫不討論了!嘗試二宣布失敗!。接下來我又想到了零時表,Access是不是也支持零時表的查詢呢?

嘗試三

The Demo: 取出我想要的數據格式 (1,2,3)

  1. public string GetInserCollection(Repeater rep, string controlID)  
  2. {  
  3.     StringBuilder buiCollecton = new StringBuilder("");  
  4.     buiCollecton.Append("(0");  
  5.     foreach (RepeaterItem item in rep.Items)  
  6.     {  
  7.         if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)  
  8.         {  
  9.             HtmlInputCheckBox cb = item.FindControl(controlID) as HtmlInputCheckBox;  
  10.             if (cb.Checked)  
  11.             {  
  12.                 buiCollecton.Append(string.Format(",{0}", cb.Value));  
  13.             }  
  14.         }  
  15.     }  
  16.     buiCollecton.Append(")");  
  17.     return buiCollecton.ToString();  

The Dal

  1. public static int InsertRoleContact(int UserID,string RoleCollection)  
  2.         {  
  3.             StringBuilder BuiSQL = new StringBuilder("");  
  4.             BuiSQL.Append("declare @SkyContact table(userID int,roleID int);");  
  5.             BuiSQL.Append("insert into @SkyContact values select " + UserID + ",R_ID from Sky_Role;");  
  6.             BuiSQL.Append(string.Format("insert into Sky_Admin_Role values (select * from @SkyContact where roleID in {0})",RoleCollection));  
  7.             return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, BuiSQL.ToString(), null);  
  8.         } 

這里模仿SQL Server中定義一個零時表,然后向其中插入盡可能全的數據,然后在基于零時表查詢出想要的數據放入到我想要的數據中執行!exec下結果又出問錯了!此處拋出這樣的錯誤:無效的 SQL語句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'。其實會出錯完全可以想想的到,畢竟Access中連insert into table values (1,2),(1,3) 這樣的語句都不支持。此時嘗試三也不得不宣告失敗!嘗試了這么多,我不得不使用早就準備用的方法 多條insert一起執行。

嘗試四

The Demo: 先獲取我想要的數據形式 :1,2,3 此處略。看sql:

  1. public static int InsertRoleContact2(int UserID, string RoleCollection)  
  2.         {  
  3.             string[] arr = RoleCollection.Split(',');  
  4.             StringBuilder BuilSQL = new StringBuilder("");  
  5.             foreach (string item in arr)  
  6.             {  
  7.                 BuilSQL.Append(string.Format("insert into Sky_Admin_Role(AdminID,RoleID) values ({0},{1});",UserID,Convert.ToInt32(item)));  
  8.             }  
  9.             return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, BuilSQL.ToString(), null);  
  10.         } 

執行下結果打出我的意外:在 SQL 語句結尾之后找到字符。 竟然連這種語句都不支持,沒相當Access會對數據支持的這么少。既然這樣也不行,難道只有循環執行每一天SQL語句嗎?我看可行!循環是必要的,只要不多次連接數據庫,也不會占用太多資源的,此時引出了我的本文的重點,如何向Access中插入多條記錄。

嘗試五

The Demo:

  1. public static void InsertMultipleSQL(int UserID,string RoleCollection)  
  2.        {  
  3.            string[] arr = RoleCollection.Split(',');  
  4.            using (OleDbConnection conn = new OleDbConnection(Common.config.AccessConnStr))  
  5.            {  
  6.                OleDbCommand cmd = conn.CreateCommand();  
  7.                OleDbTransaction trans = null;  
  8.                try 
  9.                {  
  10.                    conn.Open();  
  11.                    trans = conn.BeginTransaction();  
  12.                    cmd.Transaction = trans;  
  13.                    foreach (string item in arr)  
  14.                    {  
  15.                        cmd.CommandText = string.Format(string.Format("insert into Sky_Admin_Role(AdminID,RoleID) values ({0},{1});", UserID, Convert.ToInt32(item)));  
  16.                        cmd.ExecuteNonQuery();  
  17.                    }  
  18.                    trans.Commit();  
  19.  
  20.                }  
  21.                catch (Exception ex)  
  22.                {  
  23.                    trans.Rollback();  
  24.                    throw ex;  
  25.                }  
  26.            }  
  27.        } 

注意當插入多條語句時我們不要忘了一旦發生異常,我們需要撤銷操作,就必須要用到事務。執行Aceess的insert時,我們需要在connection關閉前循環插入,這樣才能減少資源暫用,提升性能。這里宣告嘗試五成功!

原文鏈接http://www.cnblogs.com/aces/archive/2012/06/07/Ace_AccessMultipleInsert.html

 

責任編輯:彭凡 來源: 博客園
相關推薦

2010-09-30 08:27:48

2011-08-24 13:49:45

Access數據庫轉化

2011-03-22 16:31:35

Access數據庫

2011-04-08 10:43:08

mysql數據access數據庫

2011-03-07 17:35:09

JavaACCESS數據庫

2011-04-01 12:58:46

ASPACCESS數據庫

2024-04-18 09:56:16

2011-08-25 17:15:04

2010-05-17 10:11:11

導入Mysql

2021-07-28 14:40:57

鴻蒙HarmonyOS應用

2011-08-01 22:41:49

SQL Server數Insert

2010-06-09 14:19:35

導入MySQL數據庫

2009-06-10 22:11:28

javascript連

2011-04-08 09:07:25

Access數據庫Oracle庫

2010-05-19 15:01:14

MySQL數據導入

2010-10-22 11:22:33

SQL Server數

2011-03-29 16:11:43

2011-04-08 09:24:20

access數據庫數據轉換

2010-07-21 14:11:36

SQL Server

2009-12-21 15:07:41

ADO Access數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色一级免费看 | 精品网站999www | 一区二区日韩 | 国产99精品 | 欧美日在线| 国产精品日韩欧美一区二区三区 | 国产中文视频 | 欧美爱爱视频网站 | 亚洲一区二区精品视频在线观看 | 日韩一二区在线 | 午夜精品在线观看 | 日本精品视频 | 中文字幕高清视频 | 日韩欧美一区二区三区免费观看 | 亚洲成人毛片 | 国产精品久久久久久久久久三级 | av天空 | 99国内精品| www国产成人免费观看视频,深夜成人网 | 久久久久国产精品 | 国产羞羞视频在线观看 | 久久亚洲美女 | 久久999 | 一区二区三区视频 | 久久精品视频免费看 | 超碰成人av | 成人福利网 | 日韩三区在线观看 | 欧美中文字幕一区二区三区亚洲 | 国产精品一区二区三区在线 | 国产一区视频在线 | 91xx在线观看 | 中文字幕第十五页 | 久久夜夜 | 91免费观看视频 | 伊人伊成久久人综合网站 | 一区二区精品 | 一级爱爱片| 999视频在线播放 | 国产欧美日韩精品在线观看 | 国产精品18久久久久久白浆动漫 |