⑴当下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关闭前循环插入,这样才能减少资源暂用,提升性能。这里宣告尝试五成功!