用到的網(wǎng)站
- Visual Studio官網(wǎng)
- C# 官方API文檔
- MySQL官網(wǎng)
- Navicat官網(wǎng)
- 哪兒不懂就問(wèn)度娘
- 當(dāng)然谷歌更好
- CSDN -“最大中文IT社區(qū)”
準(zhǔn)備工作
- 下載安裝Visual Studio
- vs2015官方下載地址
- vs2015百度網(wǎng)盤(pán)鏈接 密碼:500f
- 社區(qū)版免費(fèi)抛计,均默認(rèn)安裝即可
- 下載安裝數(shù)據(jù)庫(kù)
- 我使用的是MySQLMySQL官方下載地址 百度網(wǎng)盤(pán)鏈接密碼:0x24巴席, 不想用SQL Server,后者不但冗雜占得地方大搞隐,卸載還特別復(fù)雜
- 社區(qū)版依舊免費(fèi)翔脱,默認(rèn)安裝即可
- 正常人都不會(huì)喜歡命令行操作昔穴,使用Navicat對(duì)MySQL進(jìn)行圖形化的操作Navicat官方下載地址 百度網(wǎng)盤(pán)鏈接 密碼:jwhh
- 連接Navicat和MySQL料仗,除了密碼一切皆默認(rèn)
代碼中連接數(shù)據(jù)庫(kù)
- 下載MySql.Data.dll庫(kù)遵岩, 并添加到程序的引用中
- 被csdn坑了一個(gè)金幣才下到-鸭巴、-百度網(wǎng)盤(pán)鏈接 密碼:4s91
- 引用 ->(右鍵)添加引用 -> 瀏覽
- 在程序中創(chuàng)建MySqlHelper.cs類(lèi)
- 網(wǎng)上有很多眷细,可以自己下載
- 源碼附在最后,粘貼時(shí)注意添加引用
- 我使用的百度網(wǎng)盤(pán)連接 密碼:iazn鹃祖,也可以在這兒下
- 注意修改命名空間
- 在布局中添加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);
}
}
}