日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當前位置:雨林木風下載站 > 辦公軟件教程 > 詳細頁面

Access數(shù)據(jù)庫多條數(shù)據(jù)Insert

Access數(shù)據(jù)庫多條數(shù)據(jù)Insert

更新時間:2022-05-07 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

Microsoft Office Access是由微軟發(fā)布的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它結(jié)合了 MicrosoftJet Database Engine 和 圖形用戶界面兩項特點,是 Microsoft Office 的系統(tǒng)程序之一。Microsoft Office Access是微軟把數(shù)據(jù)庫引擎的圖形用戶界面和軟件開發(fā)工具結(jié)合在一起的一個數(shù)據(jù)庫管理系統(tǒng)。它是微軟OFFICE的一個成員, 在包括專業(yè)版和更高版本的office版本里面被單獨出售。2018年9月25日,最新的微軟Office Access 2019在微軟Office 2019里發(fā)布。

當下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中沒有對應的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) 這樣的語句都不支持。此時嘗試三也不得不宣告失敗!嘗試了這么多,我不得不使用早就準備用的方法 多條insert一起執(zhí)行。

嘗試四

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

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ā)生異常,我們需要撤銷操作,就必須要用到事務。執(zhí)行Aceess的insert時,我們需要在connection關(guān)閉前循環(huán)插入,這樣才能減少資源暫用,提升性能。這里宣告嘗試五成功!


Microsoft Access在很多地方得到廣泛使用,例如小型企業(yè),大公司的部門。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 99精品久久久久久 | 斗罗大陆动漫在线观看免费樱花动漫 | 视频一区 国产 | 欧美日韩国产色综合一二三四 | 久久影视免费体验区午夜啪啪 | 国产激情一区二区三区成人91 | 国产一区二区三区在线看 | 鸥美性生交xxxxx久久久 | 免费人成年短视频在线观看免费网站 | 97夜夜操| www.狠狠撸.com | 亚洲一级香蕉视频 | 国产精品福利一区二区 | 久久美女性网 | 久久99毛片免费观看不卡 | 亚洲经典三级 | 欧美日韩精品一区二区三区四区 | 高清国产在线播放成人 | 国内精品久久久久久西瓜色吧 | flypaper未删减手机在线观看 | 亚洲国产九九精品一区二区 | 538国产视频 | 亚洲女人18毛片水真多 | 成年人网站免费 | 精久久 | 欧美日韩中文一区 | 免费视频精品一区二区三区 | 国美女福利视频午夜精品 | 色免费在线观看 | 一级欧美一级日韩片 | 日本国产在线观看 | 日本不卡高清免费 | 日本xxx片免费高清在线 | 成人αv在线视频高清 | 国产亚洲欧美日韩俺去了 | 国产精品久久久久久久久久免费 | 久久亚洲伊人中字综合精品 | 九一国产精品视频 | 中文字幕精品一区二区三区视频 | 久久色精品 | 亚洲国产字幕 |