
已解决问题
谷歌Yangrunjing用户在2017.01.30提交了关于“贾樟柯Access**库多条**Insert”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-12-17T08:42:00。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
当下Access**库可能要被遗忘了!比较这个轻量级**库被精简了许多功能,个人感觉用起来还是挺麻烦的!当前Access在企业项目中就是一块鸡肋。**量小使用SQLServer是浪费,既然选择了Access就别抱怨了!如果用好了还是一块宝!废话不多说了,今天就来探讨下如何向Access中插入多条**把!
由于在此之前我没有用过Access**库的,当需要想**库中插入多条**时,我们不妨先按照sqlserver的做法:insertintotablename(column1,column2)values(a,b),(c,d),(e,f)。于是按照这个思路,我的第一个方案出来了。
尝试一:
TheDemo:
StringBuilderBuiList=newStringBuilder(string.Format(({0},0),UserID));foreach(RepeaterItemiteminRpt_AdminRole.Items){if(item.ItemType==ListItemType.Item||item.ItemType==ListItemType.AlternatingItem){h**tmlInputCheckBoxcbRole=item.FindControl(cb_Role)ash**tmlInputCheckBox;if(cbRole.Checked){BuiList.Append(,();BuiList.Append(UserID);BuiList.Append(,);BuiList.Append(cbRole.Value);BuiList.Append());}}}TheDal:
///summary///添加Role关系////summary///paramname=roleContact角色关系eg:(1,1),(1,2)/param///returns/returnspublicstaticintInsertRoleContact(stringroleContact){stringsql=insertintoSky_Admin_Role(AdminID,RoleID)values+roleContact;returnCommon.OleDbh**elper.ExecuteNonQuery(CommandType.Text,sql,**ll);}exec下就会出现这样的错误:SQL语句的结束位置缺少分号(;)。
Access对sql的支持果然是大大精简,到此尝试一失败!,很快在我有另外idea。sqlserver多表查询对selecttable的支持!我可以直接传一个DataTable到sql语句中,说干就干!
尝试二
TheDemo:获取DataTable
publicDataTableGetInsertSQL(Repeaterrep,stringcontrolID){DataTabledata=newDataTable();data.Columns.Add(AdminID);data.Columns.Add(RoleID);foreach(RepeaterItemiteminrep.Items){if(item.ItemType==ListItemType.Item||item.ItemType==ListItemType.AlternatingItem){h**tmlInputCheckBoxcb=item.FindControl(controlID)ash**tmlInputCheckBox;if(cb.Checked){DataRowrow=data.NewRow();row.ItemArray=newobject[]{UserID,cb.Value};data.Rows.Add(row);}}}returndata;}TheDal:
publicstaticintInsertRoleContact(DataTabledt){stringsql=insertintoSky_Admin_Role(AdminID,RoleID)select*from@Data;OleDbParameter[]param=newOleDbParameter[]{newOleDbParameter(@Data,?){Value=dt}};returnCommon.OleDbh**elper.ExecuteNonQuery(CommandType.Text,sql,param);}当代码到这里我就知道此方法行不通,因为OledbType中没有对应的table类型,如果是SQLserver由于支持xml可以设置为SqlDbType.Xml类型来传递DataTable**,由于sql本事对xml的支持,可以用sql基于xml的查询,本文主要讨论Access,此处暂不讨论了!尝试二宣布失败!。接下来我又想到了零时表,Access是不是也支持零时表的查询呢?
TheDemo:取出我想要的**格式(1,2,3)
publicstringGetInserCollection(Repeaterrep,stringcontrolID){StringBuilderbuiCollecton=newStringBuilder();buiCollecton.Append((0);foreach(RepeaterItemiteminrep.Items){if(item.ItemType==ListItemType.Item||item.ItemType==ListItemType.AlternatingItem){h**tmlInputCheckBoxcb=item.FindControl(controlID)ash**tmlInputCheckBox;if(cb.Checked){buiCollecton.Append(string.Format(,{0},cb.Value));}}}buiCollecton.Append());returnbuiCollecton.ToString();}
TheDal:
publicstaticintInsertRoleContact(intUserID,stringRoleCollection)
{
StringBuilderBuiSQL=newStringBuilder();
BuiSQL.Append(declare@SkyContacttable(userIDint,roleIDint););
BuiSQL.Append(insertinto@SkyContactvaluesselect+UserID+,R_IDfromSky_Role;);
BuiSQL.Append(string.Format(insertintoSky_Admin_Rolevalues(select*from@SkyContactwhereroleIDin{0}),RoleCollection));
returnCommon.OleDbh**elper.ExecuteNonQuery(CommandType.Text,BuiSQL.ToString(),**ll);
}
这里模仿SQLServer中定义一个零时表,然后向其中插入尽可能全的**,然后在基于零时表查询出想要的**放入到我想要的**中执行!exec下结果又出问错了!此处抛出这样的错误:无效的SQL语句;期待'DELETE'、'IN**RT'、'PROCEDURE'、'**LECT'、或'UPDATE'。其实会出错完全可以想想的到,毕竟Access中连insertintotablevalues(1,2),(1,3)这样的语句都不支持。此什不得不宣告失败!尝试了这么多,我不得不使用早就准备用的方法多条insert一起执行。