Access数据库Insert多条数据的尝试

由于在此之前我没有用过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

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/229831.html<

(0)
运维的头像运维
上一篇2025-04-18 23:06
下一篇 2025-04-18 23:07

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注