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. /// 
  2. /// 添加Role关系
  3. /// 
  4. /// 角色关系 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下就会出现这样的错误: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;
  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.         }

当代码到这里我就知道此方法行不通,因为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();
  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中定义一个零时表,然后向其中插入尽可能全的数据,然后在基于零时表查询出想要的数据放入到我想要的数据中执行!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.                catch (Exception ex)
  21.                {
  22.                    trans.Rollback();
  23.                    throw ex;
  24.                }
  25.            }
  26.        }

注意当插入多条语句时我们不要忘了一旦发生异常,我们需要撤销操作,就必须要用到事务。执行Aceess的insert时,我们需要在connection关闭前循环插入,这样才能减少资源暂用,提升性能。这里宣告尝试五成功!

标题名称:Access数据库Insert多条数据的尝试
本文来源:http://www.shufengxianlan.com/qtweb/news43/481593.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联