日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Access數(shù)據(jù)庫(kù)Insert多條數(shù)據(jù)的嘗試

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

海曙網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),海曙網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為海曙上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的海曙做網(wǎng)站的公司定做!

嘗試一

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. /// 
  2. /// 添加Role關(guān)系
  3. /// 
  4. /// 角色關(guān)系 eg: "(1,1),(1,2)"
  5. /// 
  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);
  10. }

exec下就會(huì)出現(xiàn)這樣的錯(cuò)誤:SQL 語句的結(jié)束位置缺少分號(hào) (;)。

Access對(duì)sql的支持果然是大大精簡(jiǎn),到此嘗試一失敗!, 很快在我有另外idea。sql server 多表查詢對(duì)select table 的支持!我可以直接傳一個(gè)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;
  20. }

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.         }

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

嘗試三

The Demo: 取出我想要的數(shù)據(jù)格式 (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();
  18. }

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中定義一個(gè)零時(shí)表,然后向其中插入盡可能全的數(shù)據(jù),然后在基于零時(shí)表查詢出想要的數(shù)據(jù)放入到我想要的數(shù)據(jù)中執(zhí)行!exec下結(jié)果又出問錯(cuò)了!此處拋出這樣的錯(cuò)誤:無效的 SQL語句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'。其實(shí)會(huì)出錯(cuò)完全可以想想的到,畢竟Access中連insert into table values (1,2),(1,3) 這樣的語句都不支持。此時(shí)嘗試三也不得不宣告失??!嘗試了這么多,我不得不使用早就準(zhǔn)備用的方法 多條insert一起執(zhí)行。

嘗試四

The Demo: 先獲取我想要的數(shù)據(jù)形式 :1,2,3 此處略??磗ql:

 
 
 
  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.         }

執(zhí)行下結(jié)果打出我的意外:在 SQL 語句結(jié)尾之后找到字符。 竟然連這種語句都不支持,沒相當(dāng)Access會(huì)對(duì)數(shù)據(jù)支持的這么少。既然這樣也不行,難道只有循環(huán)執(zhí)行每一天SQL語句嗎?我看可行!循環(huán)是必要的,只要不多次連接數(shù)據(jù)庫(kù),也不會(huì)占用太多資源的,此時(shí)引出了我的本文的重點(diǎn),如何向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.                catch (Exception ex)
  21.                {
  22.                    trans.Rollback();
  23.                    throw ex;
  24.                }
  25.            }
  26.        }

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


網(wǎng)站欄目:Access數(shù)據(jù)庫(kù)Insert多條數(shù)據(jù)的嘗試
分享網(wǎng)址:http://www.dlmjj.cn/article/djcdhee.html