学校c#大作业在连接mysql数据库过程中遇到的坑们
2016-07-03 12:24
417 查看
目录
用到的网站
准备工作
代码中连接数据库
小问题
写在前面:这篇文档是我一年之前写学校c#大作业时遇到的坑,不赘述基本语法入门之类的东西,只把有用的干活分享出来,都是当时踩的坑。
C# 官方API文档
MySQL官方下载地址
Navicat官方下载地址
哪儿不懂就问度娘
当然谷歌更好
CSDN -“最大中文IT社区”
vs2015官方下载地址
vs2015百度网盘链接 密码:500f
社区版免费,均默认安装即可
下载安装数据库
我使用的是MySQLMySQL官方下载地址 百度网盘链接 密码:0x24, 不想用SQL Server,后者不但冗杂占得地方大,卸载还特别复杂
社区版依旧免费,默认安装即可
正常人都不会喜欢命令行操作,使用Navicat对MySQL进行图形化的操作Navicat官方下载地址 百度网盘链接 密码:jwhh
连接Navicat和MySQL,除了密码一切皆默认
被csdn坑了一个金币才下到-、-百度网盘链接 密码:4s91
引用 ->(右键)添加引用 -> 浏览
在程序中创建MySqlHelper.cs类
网上有很多,可以自己下载
源码附在最后,粘贴时注意添加引用
我使用的百度网盘连接 密码:iazn,也可以在这儿下
注意修改命名空间
在布局中添加DataGridView控件,并设置好其数据源
对数据库进行基本操作,比如修改、查找等的时候,经常需要获取到选中的单元格/行的内容
一开始无从下手,怎么办呢,从百度下手
网上的解决方案中对于新手来说不够具体,比如添加什么点击事件并没有说明
怎么办呢,自己动手丰衣足食,在设计界面双击DataGridView添加点击事件CellContentClick,然而发生了一个神奇的问题,点击时有时会触发绑定的事件,有时候不会,思考了十多分钟才弄明白,为什么你们也自己想下-、-
接下来就是怎么实现此功能,我的解决方式是,先对数据库操作(比如添加/修改/删除记录),然后更新DataGridView
需要将查询结果展现在TextBox中
因为时间比较紧,所以依旧采用之前用到的MySqlHelper中的GetDataSet方法
此方法返回的是DataSet类型,直接操作不方便
我的解决方案是新建一个隐藏的DataGridView作为过渡
上面的两个小问题可能很多人觉得很简单不值一提,但是对于我这种刚接触c#没几天的学生来说还是比较困扰的,希望给我这样的c#菜鸟给一些启发
附:MySQLHelper.cs
用到的网站
准备工作
代码中连接数据库
小问题
写在前面:这篇文档是我一年之前写学校c#大作业时遇到的坑,不赘述基本语法入门之类的东西,只把有用的干活分享出来,都是当时踩的坑。
用到的网站
Visual Studio 2015 Community官方下载地址C# 官方API文档
MySQL官方下载地址
Navicat官方下载地址
哪儿不懂就问度娘
当然谷歌更好
CSDN -“最大中文IT社区”
准备工作
下载安装Visual Studiovs2015官方下载地址
vs2015百度网盘链接 密码:500f
社区版免费,均默认安装即可
下载安装数据库
我使用的是MySQLMySQL官方下载地址 百度网盘链接 密码:0x24, 不想用SQL Server,后者不但冗杂占得地方大,卸载还特别复杂
社区版依旧免费,默认安装即可
正常人都不会喜欢命令行操作,使用Navicat对MySQL进行图形化的操作Navicat官方下载地址 百度网盘链接 密码:jwhh
连接Navicat和MySQL,除了密码一切皆默认
代码中连接数据库
下载MySql.Data.dll库, 并添加到程序的引用中被csdn坑了一个金币才下到-、-百度网盘链接 密码:4s91
引用 ->(右键)添加引用 -> 浏览
在程序中创建MySqlHelper.cs类
网上有很多,可以自己下载
源码附在最后,粘贴时注意添加引用
我使用的百度网盘连接 密码:iazn,也可以在这儿下
注意修改命名空间
在布局中添加DataGridView控件,并设置好其数据源
string sql = "SELECT * FROM students";//合法的sql语句即可,此处只是举例 this.dgd_view.ClearSelection(); MySqlConnection connection = new MySqlConnection(); this.dgd_view.DataSource = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sql, null).Tables[0].DefaultView;
小问题
主体已经完成,接下来列出遇到的几个小问题及解决过程作为参考对数据库进行基本操作,比如修改、查找等的时候,经常需要获取到选中的单元格/行的内容
一开始无从下手,怎么办呢,从百度下手
网上的解决方案中对于新手来说不够具体,比如添加什么点击事件并没有说明
怎么办呢,自己动手丰衣足食,在设计界面双击DataGridView添加点击事件CellContentClick,然而发生了一个神奇的问题,点击时有时会触发绑定的事件,有时候不会,思考了十多分钟才弄明白,为什么你们也自己想下-、-
接下来就是怎么实现此功能,我的解决方式是,先对数据库操作(比如添加/修改/删除记录),然后更新DataGridView
需要将查询结果展现在TextBox中
因为时间比较紧,所以依旧采用之前用到的MySqlHelper中的GetDataSet方法
此方法返回的是DataSet类型,直接操作不方便
我的解决方案是新建一个隐藏的DataGridView作为过渡
上面的两个小问题可能很多人觉得很简单不值一提,但是对于我这种刚接触c#没几天的学生来说还是比较困扰的,希望给我这样的c#菜鸟给一些启发
附:MySQLHelper.cs
public abstract class MySqlHelper { //数据库连接字符串 public static string Conn = "Database='#your_db_name#';Data Source='localhost';User Id='root';Password='#your_password#';charset='utf8';pooling=true"; // 用于缓存参数的HASH表 private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable()); /// <summary> /// 给定连接的数据库用假设参数执行一个sql命令(不返回数据集) /// </summary> /// <param name="connectionString">一个有效的连接字符串</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>执行命令所影响的行数</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> /// 用现有的数据库连接执行一个sql命令(不返回数据集) /// </summary> /// <param name="connection">一个现有的数据库连接</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>执行命令所影响的行数</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> ///使用现有的SQL事务执行一个sql命令(不返回数据集) /// </summary> /// <remarks> ///举例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="trans">一个现有的事务</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>执行命令所影响的行数</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> /// 用执行的数据库连接执行一个返回数据集的sql命令 /// </summary> /// <remarks> /// 举例: /// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="connectionString">一个有效的连接字符串</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>包含结果的读取器</returns> public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) { //创建一个MySqlCommand对象 MySqlCommand cmd = new MySqlCommand(); //创建一个MySqlConnection对象 MySqlConnection conn = new MySqlConnection(connectionString); //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在, //因此commandBehaviour.CloseConnection 就不会执行 try { //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //调用 MySqlCommand 的 ExecuteReader 方法 MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); //清除参数 cmd.Parameters.Clear(); return reader; } catch { //关闭连接,抛出异常 conn.Close(); throw; } } /// <summary> /// 返回DataSet /// </summary> /// <param name="connectionString">一个有效的连接字符串</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns></returns> public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters) { //创建一个MySqlCommand对象 MySqlCommand cmd = new MySqlCommand(); //创建一个MySqlConnection对象 MySqlConnection conn = new MySqlConnection(connectionString); //在这里我们用一个try/catch结构执行sql文本命令/存储过程,因为如果这个方法产生一个异常我们要关闭连接,因为没有读取器存在, // try { //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters); //调用 MySqlCommand 的 ExecuteReader 方法 MySqlDataAdapter adapter = new MySqlDataAdapter(); adapter.SelectCommand = cmd; DataSet ds = new DataSet(); adapter.Fill(ds); //清除参数 cmd.Parameters.Clear(); conn.Close(); return ds; // } // catch (Exception e) { // throw e; // } } /// <summary> /// 用指定的数据库连接字符串执行一个命令并返回一个数据集的第一列 /// </summary> /// <remarks> ///例如: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> ///<param name="connectionString">一个有效的连接字符串</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>用 Convert.To{Type}把类型转换为想要的 </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> /// 用指定的数据库连接执行一个命令并返回一个 c2cd 数据集的第一列 /// </summary> /// <remarks> /// 例如: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="connection">一个存在的数据库连接</param> /// <param name="cmdType">命令类型(存储过程, 文本, 等等)</param> /// <param name="cmdText">存储过程名称或者sql命令语句</param> /// <param name="commandParameters">执行命令所用参数的集合</param> /// <returns>用 Convert.To{Type}把类型转换为想要的 </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> /// 将参数集合添加到缓存 /// </summary> /// <param name="cacheKey">添加到缓存的变量</param> /// <param name="commandParameters">一个将要添加到缓存的sql参数集合</param> public static void CacheParameters(string cacheKey, params MySqlParameter[] commandParameters) { parmCache[cacheKey] = commandParameters; } /// <summary> /// 找回缓存参数集合 /// </summary> /// <param name="cacheKey">用于找回参数的关键字</param> /// <returns>缓存的参数集合</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> /// 准备执行一个命令 /// </summary> /// <param name="cmd">sql命令</param> /// <param name="conn">OleDb连接</param> /// <param name="trans">OleDb事务</param> /// <param name="cmdType">命令类型例如 存储过程或者文本</param> /// <param name="cmdText">命令文本,例如:Select * from Products</param> /// <param name="cmdParms">执行命令的参数</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); } } }
相关文章推荐
- 关于MySql的DBHelper类以及数据分页
- MySQL实践-子查询
- 重装Mysql失败,卡在最后一步解决办法
- Mysql游标和预定义语句的用法
- Mysql存储过程,函数,视图,触发器的用法
- Mysql流程构造语句 变量定义,判断分支,循环
- Mysql数据库引擎,字符集,排序规则的概念
- Mysql常用的数据类型以及转换函数
- Mysql表结构操作,crud操作
- Mysql用户结构,用户管理,权限管理
- Mysql介绍目录结构,常用的客户端,体系结构,常用命令
- MySQL传智播客--Lession4-Lession12笔记
- mysql安装失败
- MySQL 的 RowNum 实现
- MySql服务未知原因消失了的终极解决办法
- 基于mysql-proxy实现读写分离的启动脚本
- 4、MySql的存储过程
- ubuntu16.04安装mysql和mysql-workbench(通过deb包)
- mysql主键 外键 索引
- MySQL::SQL_MODE