2024年10月笔者分享:在Access中加入多条数据的小技巧

发布时间:

  ⑴当下Aess数据库可能要被遗忘了!比较这个轻量级数据库被精简了许多功能,个人感觉用起来还是挺麻烦的!当前Aess在企业项目中就是一块鸡肋。数据量小使用SQL Server是浪费,既然选择了Aess就别抱怨了!如果用好了还是一块宝!今天就来跟着探讨下如何向Aess中插入多条数据把!

  ⑵由于在此之前我没有用过Aess数据库的,当需要想数据库中插入多条数据时,我们不妨先按照sql server的做法:“insert into tablename(column,column) values (a,b),(c,d),(e,f)”。

  ⑶The Demo:

  ⑷StringBuilder BuiList = new StringBuilder(string.Format("({},)", UserID));

  ⑸foreach (RepeaterItem item in Rpt_AdminRole.Items)

  ⑹if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)

  ⑺HtmlInputCheckBox cbRole = item.FindControl("cb_Role") as HtmlInputCheckBox;

  ⑻if (cbRole.Checked)

  ⑼BuiList.Append(",(");

  ⑽BuiList.Append(UserID);

  ⑾BuiList.Append(",");

  ⑿BuiList.Append(cbRole.Value);

  ⒀BuiList.Append(")");

  ⒁}The Dal:

  ⒂///

  ⒃/// 添加Role关系

  ⒄///

  ⒅/// 角色关系 eg: "(,),(,)"

  ⒆///

  ⒇public static int InsertRoleContact(string roleContact)

  ⒈string sql = "insert into Sky_Admin_Role(AdminID,RoleID) values "+roleContact;

  ⒉return mon.OleDbHelper.ExecuteNonQuery(mandType.Text, sql, null);

  ⒊}exec下就会出现这样的错误:SQL 语句的结束位置缺少分号 (;)。

  ⒋Aess对sql的支持果然是大大精简,到此尝试一失败!, 很快在我有另外idea。sql server 多表查询对select table 的支持!我可以直接传一个DataTable到sql语句中,说干就干!

  ⒌The Demo : 获取DataTable

  ⒍public DataTable GetInsertSQL(Repeater rep,string controlID)

  ⒎DataTable data = new DataTable();

  ⒏data.Columns.Add("AdminID");

  ⒐data.Columns.Add("RoleID");

  ⒑foreach (RepeaterItem item in rep.Items)

  ⒒if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)

  ⒓HtmlInputCheckBox cb = item.FindControl(controlID) as HtmlInputCheckBox;

  ⒔if (cb.Checked)

  ⒕DataRow row = data.NewRow();

  ⒖row.ItemArray = new object[] { UserID, cb.Value};

  ⒗data.Rows.Add(row);

  ⒘return data;

  ⒙}The Dal:

  ⒚public static int InsertRoleContact(DataTable dt)

  ⒛string sql = "insert into Sky_Admin_Role(AdminID,RoleID) select * from Data";

  ①OleDbParameter[] param = new OleDbParameter[] {

  ②new OleDbParameter("Data",?){Value =dt}

  ③return mon.OleDbHelper.ExecuteNonQuery(mandType.Text, sql, param);

  ④}当代码到这里我就知道此方法行不通,因为OledbType中没有对应的table类型,如果是SQL server由于支持xml可以设置为 SqlDbType.Xml类型来传递DataTable数据,由于sql本事对xml的支持 ,可以用sql基于xml的查询,本文主要讨论Aess,此处暂不讨论了!尝试二宣布失败!。接下来我又想到了零时表,Aess是不是也支持零时表的查询呢?

  ⑤The Demo: 取出我想要的数据格式 (,,

  ⑥public string GetInserCollection(Repeater rep, string controlID)

  ⑦StringBuilder buiCollecton = new StringBuilder("");

  ⑧buiCollecton.Append("(");

  ⑨foreach (RepeaterItem item in rep.Items)

  ⑩if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)

  ⅠHtmlInputCheckBox cb = item.FindControl(controlID) as HtmlInputCheckBox;

  Ⅱif (cb.Checked)

  ⅢbuiCollecton.Append(string.Format(",{}", cb.Value));

  ⅣbuiCollecton.Append(")");

  Ⅴreturn buiCollecton.ToString();

  ⅥThe Dal :

  Ⅶpublic static int InsertRoleContact(int UserID,string RoleCollection)

  ⅧStringBuilder BuiSQL = new StringBuilder("");

  ⅨBuiSQL.Append("declare SkyContact table(userID int,roleID int);");

  ⅩBuiSQL.Append("insert into SkyContact values select " + UserID + ",R_ID from Sky_Role;");

  ㈠BuiSQL.Append(string.Format("insert into Sky_Admin_Role values (select * from SkyContact where roleID in {})",RoleCollection));

  ㈡return mon.OleDbHelper.ExecuteNonQuery(mandType.Text, BuiSQL.ToString(), null);

  ㈢这里模仿SQL Server中定义一个零时表,然后向其中插入尽可能全的数据,然后在基于零时表查询出想要的数据放入到我想要的数据中执行!exec下结果又出问错了!此处抛出这样的错误:无效的 SQL语句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'。其实会出错完全可以想想的到,毕竟Aess中连insert into table values (,),(,) 这样的语句都不支持。此时尝试三也不得不宣告失败!尝试了这么多,我不得不使用早就准备用的方法 多条insert一起执行。

  ㈣The Demo: 先获取我想要的数据形式 :,, 此处略。看sql:

  ㈤public static int InsertRoleContact(int UserID, string RoleCollection)

  ㈥string[] arr = RoleCollection.Split(',');

  ㈦StringBuilder BuilSQL = new StringBuilder("");

  ㈧foreach (string item in arr)

  ㈨BuilSQL.Append(string.Format("insert into Sky_Admin_Role(AdminID,RoleID) values ({},{});",UserID,Convert.ToInt(item)));

  ㈩return mon.OleDbHelper.ExecuteNonQuery(mandType.Text, BuilSQL.ToString(), null);

  }执行下结果打出我的意外:在 SQL 语句结尾之后找到字符。 竟然连这种语句都不支持,没相当Aess会对数据支持的这么少。既然这样也不行,难道只有循环执行每一天SQL语句吗?我看可行!循环是必要的,只要不多次连接数据库,也不会占用太多资源的,此时引出了我的本文的重点,如何向Aess中插入多条记录。

  The Demo:

  public static void InsertMultipleSQL(int UserID,string RoleCollection)

  string[] arr = RoleCollection.Split(',');

  using (OleDbConnection conn = new OleDbConnection(mon.config.AessConnStr))

  OleDbmand cmd = conn.Createmand();

  OleDbTransaction trans = null;

  conn.Open();

  trans = conn.BeginTransaction();

  cmd.Transaction = trans;

  foreach (string item in arr)

  cmd.mandText = string.Format(string.Format("insert into Sky_Admin_Role(AdminID,RoleID) values ({},{});", UserID, Convert.ToInt(item)));

  cmd.ExecuteNonQuery();

  trans.mit();

  catch (Exception ex)

  trans.Rollback();

  throw ex;

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