mysql数据通讯方式_c# 与 Mysql 的通讯方式总结
两种开发方式
1.使用 vs 自带的可视化工具,不推荐。
在 vs 的项目中添加 ‘数据集’,然后通过可视化的工具添加数据库为数据源,默认可添加 SQL Server 和 Oracle 等,添加 Mysql 前需要额外安装组件。
优点,自带 sql 语句中特殊字符的转义,不会出现 sql 注入的问题,配合数据绑定可以在项目前期快速推进项目进度。
缺点:可视化工具的使用并不流行,不利于开发团队的招募和项目后期的修改维护。许多常用的功能很难使用,如:存储过程,事务,连接池控制等。
2.引用 mysql.data.dll ,在此基础上进行开发,推荐。
完全由代码完成通讯过程。
优点:可以方便的使用各种功能,
缺点:需要手写代码,开发速度稍慢。
完整的通讯过程
1.建立连接,连接分 “长连接” 和 “短连接”
长连接在高频次的通讯时快速高效,但是占用资源,在并发访问下容易耗尽网络资源,对于带宽较低的局域网来说,如果大量使用长连接,会占用网速,影响使用体验。
短连接在使用时 open, 使用完成后 close,此时连接资源会进入连接池,等待下次连接时使用。虽然资源未被释放掉,但连接池的开销不大,是完全可以接受的。短连接一样需要考虑并发问题。
短连接在使用完成后可以直接 dispose,或者使用 using(){} 来限定连接的作用域,使用完成后自动释放掉,不进入连接池,这种方式资源占用最少,但在需要反复建立连接的情况下连接效率较低。
在实际开发的时候最好使用短连接,并在使用结束后关闭并放入连接池。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
conn.Close();
2.使用连接创建 sql 命令并执行
1.纯 sql 语句,执行后有三种返回方式:
cmd.ExecuteScalar(); // 查询结果仅一行一列,直接接收
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();string name = "Tom";
cmd.CommandText= string.Format("select count(*) from student where Name = '{0}';", name);object obj = cmd.ExecuteScalar(); //可能未nullint count = 0;
if (!obj.Equals(DBNull.Value))
{
count = Convert.ToInt32(obj);}conn.Close();
MySqlDataReader reader = cmd.ExecuteReader(); // 通过 reader 获得大量数据
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandText= string.Format("select Name from student;");
MySqlDataReader reader=cmd.ExecuteReader();
List list = new List();while(reader.Read())
{
list.Add(reader.GetString("Name"));
}
reader.Close();
conn.Close();
cmd.ExecuteNonQuery(); // 获得增删改语句执行后影响的行数
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();string name = "Tom";
cmd.CommandText= string.Format("update student SET Name='Tommy' where Name = '{0}';", name);int count =cmd.ExecuteNonQuery();
conn.Close();
普通 sql 语句的缺点:如果上面例子中的 name 参数中带有单引号,整个 sql 语句将执行错误,因为未对特殊字符进行转义。主要特殊字符有单引号,反斜杠,# 等,而这些特殊字符在不同的使用情况下有时需要转义,有时不需要转义。Mysql 提供了类似 QUOTE(str) 这样的字符串处理函数,但不能完全满足要求。
这就是 sql 注入,sql 注入的概念网上资料较多,在此不再赘述,而常用的解决方案是采用参数化的 sql 语句。
2.sql 语句和 sql 参数
带有参数的 sql 语句和 sql 参数会分开传入数据库服务器中,服务器先将 sql 语句进行编译,然后将 sql 参数导入编译后的 sql 语句中(在此过程中自动对特殊字符进行转义),从而从根源上防止了 sql 注入的发生。
string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn= newMySqlConnection(connStr);
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandText= "select count(*) from student where Name = @Name;";cmd.Parameters.AddWithValue("@Name", "Tom");
object obj = cmd.ExecuteScalar(); //可能为null int count = 0;if (!obj.Equals(DBNull.Value)) { count=Convert.ToInt32(obj); } conn.Close();
3.DataAdapter
private static void Test(MySqlCommand cmd)
{
//获取记录
DataTable dt1 = new DataTable();
cmd.CommandText = "select * from table1;";
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
da.Fill(dt1);
//插入记录
cmd.CommandText = "select * from pet where 1=0;";
da = new MySqlDataAdapter(cmd);
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.UpdateCommand = cb.GetInsertCommand();
DataTable dt2 = new DataTable();
da.Fill(dt2);
//对dt2进行赋值
da.Update(dt2);
}
4.事务
多条 sql 语句的组合会出现某一条 sql 语句执行出错,而其他 sql 语句顺利执行的情况,这可能与预期不符合。此时需要使用事务。
事务在执行出错时可以回滚。
事务往往带有多条 sql 语句,在使用参数化的 sql 语句时要注意参数名称不能相同。
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
MySqlTransaction myTrans=conn.BeginTransaction();
cmd.Connection=conn;
cmd.Transaction=myTrans;
cmd.CommandText= "";
cmd.ExecuteNonQuery();
myTrans.Commit();
conn.Close();
5.存储过程
不论是 sql 语句还是事务,在传输指令的时候都需要耗费大量的时间,数据库编译这些指令也需要耗费大量时间,这不利于高访问量的数据库的运行。
存储过程是将 sql 指令写在数据库中,此时数据库直接完成编译,与数据库通讯是只需要传递参数即可。节省了传输时间和编译时间。
conn.Open();
MySqlCommand cmd=conn.CreateCommand();
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText= "SpFillStudent";
MySqlParameter paraMoney;
paraMoney= cmd.Parameters.Add("@inMoney", MySqlDbType.Decimal);
paraMoney.Direction=ParameterDirection.Input;
paraMoney.Value= 50;
MySqlParameter paraTradeType;
paraTradeType= cmd.Parameters.Add("@inTradeType", MySqlDbType.String);
paraTradeType.Direction=ParameterDirection.Input;
paraTradeType.Value= "会员卡充值";
MySqlParameter paraPayDetailStr;
paraPayDetailStr= cmd.Parameters.Add("@inPayDetailStr", MySqlDbType.String);
paraPayDetailStr.Direction=ParameterDirection.Input;
paraPayDetailStr.Value= "";
MySqlParameter paraOutResult;
paraOutResult= cmd.Parameters.Add("@outResult", MySqlDbType.String);
paraOutResult.Direction=ParameterDirection.Output;
cmd.ExecuteNonQuery();string result = (string)paraOutResult.Value;
conn.Close();
mysql数据通讯方式_c# 与 Mysql 的通讯方式总结相关推荐
- Elasticsearch和MySQL数据同步(logstash-input-jdbc)全量增量方式同步近千万数据
同步方案: 同步读写:最为简单的方式在将数据写到mysql时,同时将数据写到ES,实现数据的双写. 异步双写(MQ方式):MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高. 定时器 ...
- linux mysql 数据文件,Linux下修改MySQL数据库数据文件路径的步骤
使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...
- mysql连接编程环境_C++连接MySQL(一):环境配置和实例
摘要:MySQL API中提供了对C语言的支持,C++是兼容C语言的,那么只要稍加完善就可以让C++写出来的程序直接连接MySQL,并且编程和执行的效率都比较高. 1.为什么使用MySQL C API ...
- MySQL 数据库命令之 mysqlshow -- 显示 MySQL 数据库相关信息
文章目录 介绍 语法格式 常用选项 参考示例 (一)显示指定数据库中的所有表的记录数和列数 (二)显示指定数据库中所有的数据表的额外信息 (三)查看指定数据库中的所有数据表 (四)显示所有的数据库 ( ...
- mysql数据表最高速迁移,mysql的存储引擎为:myisam
本文链接:http://blog.csdn.net/u010670689/article/details/41346689 需求: 开发产品过程中,有个项目分支,数据库须要带数据拷贝,可是表的数据非常 ...
- mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...
基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程 课程目录 (1)SQL与数Ju分析;目录中文件数:23个 (1) 开课-课时3SQL与数Ju库的价值.flv (2) ...
- mysql 数据分组_详解MySQL 数据分组
创建分组 分组是在select语句中的group by 子句中建立的. 例: select vend_id, count(*) as num_prods from products group by ...
- docker中mysql数据定时备份_[Docker]MySql 定时备份
前言 今天调整了机器的参数,要做一个备份,想到还没有做自动备份,要是数据丢了,就啥都没了.所以研究了下,使用mysqldump来定时备份mysql的数据. 分析 我这块数据库是在容器中运行的,在宿主机 ...
- c#连接mysql数据库查询语句_C#连接MySQL数据库(增删改查)
using System; using MySql.Data.MySqlClient; namespace CSharp直接连接MySQL { class Program { static void ...
- 两台电脑mysql数据迁移,各版本mysql迁移(亲测)
迁移只适用于往全新的电脑上迁移data,如果新电脑数据库也有数据,你想新老数据库都能使用,就看新老谁的数据库没那么大,导出数据再导入这样迁移也行 迁移过程中两台电脑用户密码都一样,root 12345 ...
最新文章
- 错误:ORA-12537: TNS: 连接关闭
- vim 代码跳转神器 YouComPlete
- Uber无人车收购MightyAI:掘金尚未暴富,卖水先获财务自由
- Interview:算法岗位面试—上海某公司算法岗位技术(偏机器学习,证券基金行业)面试考点之进程与线程区别、GD改进的算法、ROC和AUC
- mysql批量加逗号_批量插入数据到数据库的方式
- 如何高效搜索汪子熙公众号发表的文章
- Android 属性动画ObjectAnimator使用demo,组合动画
- 基于动态混合高斯模型的商品价格模型算法
- 如何才能成为一个成功的项目经理
- SQL Server2008 错误源:.net SqlClient data provider的解决方法
- BAT Java面试154道题分享!搞懂轻松进BAT
- win7副本不是正版_征途正版官网版下载-征途正版手游官网版下载1.0
- h264和h265视频流SDP描述详解
- java applet介绍,Java Applet教程介绍
- python pandas 数据透视表_python 用pandas实现数据透视表功能
- c语言共阴极数码管编码,数码管之共阴极与共阳极编码
- 数据结构 插入排序(InsertionSort Sort) 详解 附C++代码实现:
- 《上海市优质中小企业梯度培育管理实施细则》的通知
- 在线沙盒(恶意软件行为分析工具)整理介绍
- 所见即所得——小程序可视化开发
热门文章
- 来,和腾讯一起共建未来城市
- 腾讯副总裁姚星:腾讯AI Lab将致力打造通往AGI之路
- PMP之项目整合管理---各种工具与技术
- Kotlin的hello world
- 区块链在银行业的应用
- Direct2D的使用
- ubuntu 修改ssh登陆端口
- Hive更改表名FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Una ble
- javaSE各阶段练习题--工具类-常用类-递归-包装类-内部类
- leetcode 650. 2 Keys Keyboard | 650. 只有两个键的键盘(暴力递归->傻缓存->DP)