學(xué)校c#大作業(yè)連接數(shù)據(jù)庫(kù)的辛路歷程

用到的網(wǎng)站

準(zhǔn)備工作

  1. 下載安裝Visual Studio
  1. 下載安裝數(shù)據(jù)庫(kù)

代碼中連接數(shù)據(jù)庫(kù)

  1. 下載MySql.Data.dll庫(kù)遵岩, 并添加到程序的引用中
  1. 在程序中創(chuàng)建MySqlHelper.cs類(lèi)
  • 網(wǎng)上有很多眷细,可以自己下載
  • 源碼附在最后,粘貼時(shí)注意添加引用
  • 我使用的百度網(wǎng)盤(pán)連接 密碼:iazn鹃祖,也可以在這兒下
  • 注意修改命名空間
  1. 在布局中添加DataGridView控件溪椎,并設(shè)置好其數(shù)據(jù)源
string sql = "SELECT * FROM students";//合法的sql語(yǔ)句即可,此處只是舉例
this.dgd_view.ClearSelection();
MySqlConnection connection = new MySqlConnection();
this.dgd_view.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;

小問(wèn)題

主體已經(jīng)完成恬口,接下來(lái)列出遇到的幾個(gè)小問(wèn)題及解決過(guò)程作為參考

  • 對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本操作校读,比如修改、查找等的時(shí)候祖能,經(jīng)常需要獲取到選中的單元格/行的內(nèi)容
  • 一開(kāi)始無(wú)從下手歉秫,怎么辦呢,從百度下手
  • 網(wǎng)上的解決方案中對(duì)于新手來(lái)說(shuō)不夠具體养铸,比如添加什么點(diǎn)擊事件并沒(méi)有說(shuō)明
  • 怎么辦呢雁芙,自己動(dòng)手豐衣足食,在設(shè)計(jì)界面雙擊DataGridView添加點(diǎn)擊事件CellContentClick钞螟,然而發(fā)生了一個(gè)神奇的問(wèn)題兔甘,點(diǎn)擊時(shí)有時(shí)會(huì)觸發(fā)綁定的事件,有時(shí)候不會(huì)鳞滨,思考了十多分鐘才弄明白洞焙,為什么你們也自己想下-、-
  • 接下來(lái)就是怎么實(shí)現(xiàn)此功能,我的解決方式是澡匪,先對(duì)數(shù)據(jù)庫(kù)操作(比如添加/修改/刪除記錄)熔任,然后更新DataGridView
  • 需要將查詢(xún)結(jié)果展現(xiàn)在TextBox中
  • 因?yàn)闀r(shí)間比較緊,所以依舊采用之前用到的MySqlHelper中的GetDataSet方法
  • 此方法返回的是DataSet類(lèi)型仙蛉,直接操作不方便
  • 我的解決方案是新建一個(gè)隱藏的DataGridView作為過(guò)渡

上面的兩個(gè)小問(wèn)題可能很多人覺(jué)得很簡(jiǎn)單不值一提笋敞,但是對(duì)于我這種剛接觸c#沒(méi)幾天的學(xué)生來(lái)說(shuō)還是比較困擾的碱蒙,希望給我這樣的c#菜鳥(niǎo)給一些啟發(fā)

  • 附:MySQLHelper.cs
    public abstract class MySqlHelper {
        //數(shù)據(jù)庫(kù)連接字符串
        public static string Conn = "Database='db_cars';Data Source='localhost';User Id='root';Password='H2SO4HNO3';charset='utf8';pooling=true";

        // 用于緩存參數(shù)的HASH表
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

        /// <summary>
        ///  給定連接的數(shù)據(jù)庫(kù)用假設(shè)參數(shù)執(zhí)行一個(gè)sql命令(不返回?cái)?shù)據(jù)集)
        /// </summary>
        /// <param name="connectionString">一個(gè)有效的連接字符串</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>執(zhí)行命令所影響的行數(shù)</returns>
        public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {

            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connectionString)) {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        /// 用現(xiàn)有的數(shù)據(jù)庫(kù)連接執(zhí)行一個(gè)sql命令(不返回?cái)?shù)據(jù)集)
        /// </summary>
        /// <param name="connection">一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)連接</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>執(zhí)行命令所影響的行數(shù)</returns>
        public static int ExecuteNonQuery(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {

            MySqlCommand cmd = new MySqlCommand();

            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }

        /// <summary>
        ///使用現(xiàn)有的SQL事務(wù)執(zhí)行一個(gè)sql命令(不返回?cái)?shù)據(jù)集)
        /// </summary>
        /// <remarks>
        ///舉例:
        ///  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="trans">一個(gè)現(xiàn)有的事務(wù)</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>執(zhí)行命令所影響的行數(shù)</returns>
        public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {
            MySqlCommand cmd = new MySqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
            int val = cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            return val;
        }

        /// <summary>
        /// 用執(zhí)行的數(shù)據(jù)庫(kù)連接執(zhí)行一個(gè)返回?cái)?shù)據(jù)集的sql命令
        /// </summary>
        /// <remarks>
        /// 舉例:
        ///  MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connectionString">一個(gè)有效的連接字符串</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>包含結(jié)果的讀取器</returns>
        public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {
            //創(chuàng)建一個(gè)MySqlCommand對(duì)象
            MySqlCommand cmd = new MySqlCommand();
            //創(chuàng)建一個(gè)MySqlConnection對(duì)象
            MySqlConnection conn = new MySqlConnection(connectionString);

            //在這里我們用一個(gè)try/catch結(jié)構(gòu)執(zhí)行sql文本命令/存儲(chǔ)過(guò)程荠瘪,因?yàn)槿绻@個(gè)方法產(chǎn)生一個(gè)異常我們要關(guān)閉連接,因?yàn)闆](méi)有讀取器存在赛惩,
            //因此commandBehaviour.CloseConnection 就不會(huì)執(zhí)行
            try {
                //調(diào)用 PrepareCommand 方法哀墓,對(duì) MySqlCommand 對(duì)象設(shè)置參數(shù)
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //調(diào)用 MySqlCommand  的 ExecuteReader 方法
                MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                //清除參數(shù)
                cmd.Parameters.Clear();
                return reader;
            }
            catch {
                //關(guān)閉連接,拋出異常
                conn.Close();
                throw;
            }
        }

        /// <summary>
        /// 返回DataSet
        /// </summary>
        /// <param name="connectionString">一個(gè)有效的連接字符串</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns></returns>
        public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {
            //創(chuàng)建一個(gè)MySqlCommand對(duì)象
            MySqlCommand cmd = new MySqlCommand();
            //創(chuàng)建一個(gè)MySqlConnection對(duì)象
            MySqlConnection conn = new MySqlConnection(connectionString);

            //在這里我們用一個(gè)try/catch結(jié)構(gòu)執(zhí)行sql文本命令/存儲(chǔ)過(guò)程喷兼,因?yàn)槿绻@個(gè)方法產(chǎn)生一個(gè)異常我們要關(guān)閉連接篮绰,因?yàn)闆](méi)有讀取器存在,

          //  try {
                //調(diào)用 PrepareCommand 方法季惯,對(duì) MySqlCommand 對(duì)象設(shè)置參數(shù)
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //調(diào)用 MySqlCommand  的 ExecuteReader 方法
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();

                adapter.Fill(ds);
                //清除參數(shù)
                cmd.Parameters.Clear();
                conn.Close();
                return ds;
       //     }
       //     catch (Exception e) {
       //         throw e;
      //      }
        }



        /// <summary>
        /// 用指定的數(shù)據(jù)庫(kù)連接字符串執(zhí)行一個(gè)命令并返回一個(gè)數(shù)據(jù)集的第一列
        /// </summary>
        /// <remarks>
        ///例如:
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
        /// </remarks>
        ///<param name="connectionString">一個(gè)有效的連接字符串</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>用 Convert.To{Type}把類(lèi)型轉(zhuǎn)換為想要的 </returns>
        public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {
            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection connection = new MySqlConnection(connectionString)) {
                PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
                object val = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return val;
            }
        }

        /// <summary>
        /// 用指定的數(shù)據(jù)庫(kù)連接執(zhí)行一個(gè)命令并返回一個(gè)數(shù)據(jù)集的第一列
        /// </summary>
        /// <remarks>
        /// 例如:
        ///  Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));
        /// </remarks>
        /// <param name="connection">一個(gè)存在的數(shù)據(jù)庫(kù)連接</param>
        /// <param name="cmdType">命令類(lèi)型(存儲(chǔ)過(guò)程, 文本, 等等)</param>
        /// <param name="cmdText">存儲(chǔ)過(guò)程名稱(chēng)或者sql命令語(yǔ)句</param>
        /// <param name="commandParameters">執(zhí)行命令所用參數(shù)的集合</param>
        /// <returns>用 Convert.To{Type}把類(lèi)型轉(zhuǎn)換為想要的 </returns>
        public static object ExecuteScalar(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) {

            MySqlCommand cmd = new MySqlCommand();

            PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
            object val = cmd.ExecuteScalar();
            cmd.Parameters.Clear();
            return val;
        }

        /// <summary>
        /// 將參數(shù)集合添加到緩存
        /// </summary>
        /// <param name="cacheKey">添加到緩存的變量</param>
        /// <param name="commandParameters">一個(gè)將要添加到緩存的sql參數(shù)集合</param>
        public static void CacheParameters(string cacheKey, params MySqlParameter[] commandParameters) {
            parmCache[cacheKey] = commandParameters;
        }

        /// <summary>
        /// 找回緩存參數(shù)集合
        /// </summary>
        /// <param name="cacheKey">用于找回參數(shù)的關(guān)鍵字</param>
        /// <returns>緩存的參數(shù)集合</returns>
        public static MySqlParameter[] GetCachedParameters(string cacheKey) {
            MySqlParameter[] cachedParms = (MySqlParameter[])parmCache[cacheKey];

            if (cachedParms == null)
                return null;

            MySqlParameter[] clonedParms = new MySqlParameter[cachedParms.Length];

            for (int i = 0, j = cachedParms.Length; i < j; i++)
                clonedParms[i] = (MySqlParameter)((ICloneable)cachedParms[i]).Clone();

            return clonedParms;
        }

        /// <summary>
        /// 準(zhǔn)備執(zhí)行一個(gè)命令
        /// </summary>
        /// <param name="cmd">sql命令</param>
        /// <param name="conn">OleDb連接</param>
        /// <param name="trans">OleDb事務(wù)</param>
        /// <param name="cmdType">命令類(lèi)型例如 存儲(chǔ)過(guò)程或者文本</param>
        /// <param name="cmdText">命令文本,例如:Select * from Products</param>
        /// <param name="cmdParms">執(zhí)行命令的參數(shù)</param>
        private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms) {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null) {
                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

    }


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吠各,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勉抓,更是在濱河造成了極大的恐慌贾漏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藕筋,死亡現(xiàn)場(chǎng)離奇詭異纵散,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)隐圾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)伍掀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人暇藏,你說(shuō)我怎么就攤上這事蜜笤。” “怎么了盐碱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵瘩例,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我甸各,道長(zhǎng)垛贤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任趣倾,我火速辦了婚禮聘惦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己善绎,他們只是感情好黔漂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著禀酱,像睡著了一般炬守。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剂跟,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天减途,我揣著相機(jī)與錄音,去河邊找鬼曹洽。 笑死鳍置,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的送淆。 我是一名探鬼主播税产,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼偷崩!你這毒婦竟也來(lái)了辟拷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阐斜,失蹤者是張志新(化名)和其女友劉穎衫冻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體智听,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羽杰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了到推。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片考赛。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莉测,靈堂內(nèi)的尸體忽然破棺而出颜骤,到底是詐尸還是另有隱情,我是刑警寧澤捣卤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布忍抽,位于F島的核電站,受9級(jí)特大地震影響董朝,放射性物質(zhì)發(fā)生泄漏鸠项。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一子姜、第九天 我趴在偏房一處隱蔽的房頂上張望祟绊。 院中可真熱鬧,春花似錦、人聲如沸牧抽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扬舒。三九已至阐肤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讲坎,已是汗流浹背孕惜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衣赶,地道東北人诊赊。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓厚满,卻偏偏與公主長(zhǎng)得像府瞄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碘箍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容