午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    Access數(shù)據(jù)庫多條數(shù)據(jù)Insert
    來源:易賢網(wǎng) 閱讀:850 次 日期:2014-10-22 10:06:24
    溫馨提示:易賢網(wǎng)小編為您整理了“Access數(shù)據(jù)庫多條數(shù)據(jù)Insert”,方便廣大網(wǎng)友查閱!

    當下Access數(shù)據(jù)庫可能要被遺忘了!比較這個輕量級數(shù)據(jù)庫被精簡了許多功能,個人感覺用起來還是挺麻煩的!當前Access在企業(yè)項目中就是一塊雞肋。數(shù)據(jù)量小使用SQL Server是浪費,既然選擇了Access就別抱怨了!如果用好了還是一塊寶!廢話不多說了,今天就來探討下如何向Access中插入多條數(shù)據(jù)把!

    由于在此之前我沒有用過Access數(shù)據(jù)庫的,當需要想數(shù)據(jù)庫中插入多條數(shù)據(jù)時,我們不妨先按照sql server的做法:“insert into tablename(column1,column2) values (a,b),(c,d),(e,f)”。于是按照這個思路,我的第一個方案出來了。

    嘗試一:

    The Demo:

    StringBuilder BuiList = new StringBuilder(string.Format("({0},0)", 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:

    /// <summary>

    /// 添加Role關(guān)系

    /// </summary>

    /// <param name="roleContact">角色關(guān)系 eg: "(1,1),(1,2)"</param>

    /// <returns></returns>

    public static int InsertRoleContact(string roleContact)

    {

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

    return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, sql, null);

    }

    exec下就會出現(xiàn)這樣的錯誤:SQL 語句的結(jié)束位置缺少分號 (;)。

    Access對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 Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, sql, param);

    }

    當代碼到這里我就知道此方法行不通,因為OledbType中沒有對應(yīng)的table類型,如果是SQL server由于支持xml可以設(shè)置為 SqlDbType.Xml類型來傳遞DataTable數(shù)據(jù),由于sql本事對xml的支持 ,可以用sql基于xml的查詢,本文主要討論Access,此處暫不討論了!嘗試二宣布失??!。接下來我又想到了零時表,Access是不是也支持零時表的查詢呢?

    嘗試三

    The Demo: 取出我想要的數(shù)據(jù)格式 (1,2,3)

    public string GetInserCollection(Repeater rep, string controlID)

    {

    StringBuilder buiCollecton = new StringBuilder("");

    buiCollecton.Append("(0");

    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(",{0}", 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 {0})",RoleCollection));

    return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, BuiSQL.ToString(), null);

    }

    這里模仿SQL Server中定義一個零時表,然后向其中插入盡可能全的數(shù)據(jù),然后在基于零時表查詢出想要的數(shù)據(jù)放入到我想要的數(shù)據(jù)中執(zhí)行!exec下結(jié)果又出問錯了!此處拋出這樣的錯誤:無效的 SQL語句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE'。其實會出錯完全可以想想的到,畢竟Access中連insert into table values (1,2),(1,3) 這樣的語句都不支持。此時嘗試三也不得不宣告失?。L試了這么多,我不得不使用早就準備用的方法 多條insert一起執(zhí)行。

    嘗試四

    The Demo: 先獲取我想要的數(shù)據(jù)形式 :1,2,3 此處略??磗ql:

    public static int InsertRoleContact2(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 ({0},{1});",UserID,Convert.ToInt32(item)));

    }

    return Common.OleDbHelper.ExecuteNonQuery(CommandType.Text, BuilSQL.ToString(), null);

    }

    執(zhí)行下結(jié)果打出我的意外:在 SQL 語句結(jié)尾之后找到字符。 竟然連這種語句都不支持,沒相當Access會對數(shù)據(jù)支持的這么少。既然這樣也不行,難道只有循環(huán)執(zhí)行每一天SQL語句嗎?我看可行!循環(huán)是必要的,只要不多次連接數(shù)據(jù)庫,也不會占用太多資源的,此時引出了我的本文的重點,如何向Access中插入多條記錄。

    嘗試五

    The Demo:

    public static void InsertMultipleSQL(int UserID,string RoleCollection)

    {

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

    using (OleDbConnection conn = new OleDbConnection(Common.config.AccessConnStr))

    {

    OleDbCommand cmd = conn.CreateCommand();

    OleDbTransaction trans = null;

    try

    {

    conn.Open();

    trans = conn.BeginTransaction();

    cmd.Transaction = trans;

    foreach (string item in arr)

    {

    cmd.CommandText =

    string.Format(

    string.Format(

    "insert into Sky_Admin_Role(AdminID,RoleID

    ) values ({0},{1});", UserID, Convert.ToInt32(item)));

    cmd.ExecuteNonQuery();

    }

    trans.Commit();

    }

    catch (Exception ex)

    {

    trans.Rollback();

    throw ex;

    }

    }

    }

    注意當插入多條語句時我們不要忘了一旦發(fā)生異常,我們需要撤銷操作,就必須要用到事務(wù)。執(zhí)行Aceess的insert時,我們需要在connection關(guān)閉前循環(huán)插入,這樣才能減少資源暫用,提升性能。這里宣告嘗試五成功!

    更多信息請查看IT技術(shù)專欄

    更多信息請查看數(shù)據(jù)庫
    易賢網(wǎng)手機網(wǎng)站地址:Access數(shù)據(jù)庫多條數(shù)據(jù)Insert
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇剩?/div>

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)