热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

07ADO.Net

1、ADO.Net简介代码示例:using(MySqlConnectionconnnewMySqlConnection(Serverlocalhost;Databa

1、ADO.Net简介

代码示例:

using (MySqlConnection conn = new MySqlConnection("Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8"))
using (MySqlCommand cmd = conn.CreateCommand())
{conn.Open();
//一定要在执行前Open数据库连接cmd.CommandText = "Insert into T_Users(UserName,Password) values('中国人','123')";int rowCount = cmd.ExecuteNonQuery();Console.WriteLine("受影响的行数"+rowCount);
}

 

解释一下代码:

MySqlConnection、MySqlCommand实现了IDisposable接口,因此使用using进行资源释放;

"Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8"叫连接字符串,Server是Mysql服务器的地址,Database是连接的数据库,uid、pwd是用户名和密码,采用utf8编码。

conn.Open():在执行MySqlCommand之前一定要先打开数据库连接,否则会报错。

ExecuteNonQuery是执行Update、Insert、Delete等查询语句,返回值为受影响的行数。

 

2、ExecuteScalar

ExecuteScalar:执行查询,并返回查询所返回的结果集中的第一列,忽略其它列。一般用来简单的获得只有一行一列的查询结果的值。

案例1:

cmd.CommandText = "Select count(*) from T_Users";//查询命令:查询T_Users表的总数据条数
long count = (long)cmd.ExecuteScalar();//执行查询命令后获得的结果是一行一列的

 

案例2:

using(MySqlConnection conn = new MySqlConnection("Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8"))
using (MySqlCommand cmd = conn.CreateCommand())
{conn.Open();
//查询命令,查询用户名是amdin的密码cmd.CommandText = "select password from T_Users where UserName='admin'";//执行查询命令并接收返回的查询命令查询结果string pwd = (string)cmd.ExecuteScalar();//判断查询结果是否为空,空则没有查询到if (string.IsNullOrEmpty(pwd)){Console.WriteLine("没有找到用户");}else{Console.WriteLine("密码是:"+pwd);}
}
Console.ReadKey();

 

3、ExecuteReader

 

//创建连接对象
using(MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=study1;uid=root;pwd=root;Charset=utf8"))
using (MySqlCommand cmd = conn.CreateCommand())//创建命令对象
{conn.Open();cmd.CommandText = "select * from T_Users";using (MySqlDataReader reader = cmd.ExecuteReader()){conn.Close();//Reader读取的时候要保持Connection连接while (reader.Read())//Reader的好处是:即使查询数据量大,客户端内存也不会明显增加
{//获得数据库里各个字段的值int id = reader.GetInt32("Id");string username = reader.GetString("UserName");string password = reader.GetString("PassWord");Console.WriteLine("Id="+id+";UserName="+username+";PassWord="+password);}}
}
Console.ReadKey();

 

注意:Reader的遍历、读取时需要Connection保持连接,如果关闭了Connection,使用Reader会出错

也可以根据列序号获取列的值,效率略高,不过程序不易读;通过reader.GetOrdinal("Age")获得列名对应的列序号

 

4、参数化查询

static void Main(string[] args)
{
using (MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=study1;uid=root;pwd=root;Charset=utf8"))using (MySqlCommand cmd = conn.CreateCommand()){conn.Open();//把要插入的值用参数传递 @un @pwd cmd.CommandText = "insert into T_Users(UserName,PassWord) Values(@un,@pwd)";//填充这个参数cmd.Parameters.Add(new MySqlParameter { ParameterName = "@un", Value = "黎庆煌" });cmd.Parameters.Add(new MySqlParameter { ParameterName = "@pwd", Value = "123" });//执行MySql语句int count = cmd.ExecuteNonQuery();Console.WriteLine("影响行数:" + count);}Console.ReadKey();
}

 

(1)参数化查询有点:安全;高效(SQL预编译)

(2)所有SQL中都可以使用参数化查询传递;表名、字段名等不能用参数化查询进行替换

 

(3)陷阱:不要用 MySqlParameter(string parameterName,object value) 的这个构造函数,因为 ("@Age",0) 会被匹配成 MySqlParameter(string parameterName, MySqlDbType dbType) 这个构造函数

//int i = 0;
//cmd.Parameters.Add(new MySqlParameter("@Age", i));
//cmd.Parameters.Add(new MySqlParameter("@Age", 0));
cmd.Parameters.Add(new MySqlParameter("@Age",(object)0));//可以强制转换这样做避免这个陷阱

 

5、读取数据库中的null值

数据库中的null值在C#中不能用GetString( )、GetInt32( )等读取,需要提前用  IsDBNull( )  来判断是否数据库的null值,

 

using(MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=study1;uid=root;pwd=root;Charset=utf8"))
using (MySqlCommand cmd = conn.CreateCommand())
{conn.Open();cmd.CommandText
= "select * from T_Users";using (MySqlDataReader reader = cmd.ExecuteReader()){while (reader.Read()){string username = reader.GetString("UserName");//string password = reader.GetString("PassWord");string password;if (reader.IsDBNull(reader.GetOrdinal("PassWord"))){password = null;}else{//GetString/GetInt32无法读取数据库中的null值//需要提前用IsDBNull判断password = reader.GetString("PassWord");}int? age;if (reader.IsDBNull(reader.GetOrdinal("Age"))){age = null;}else{age = reader.GetInt32("Age");}//int age = reader.GetInt32("Age");Console.WriteLine("用户名:"+username+";密码:"+password+";年龄:"+age);}}
}
Console.ReadKey();

 

 

 

 

6、离线数据集入门

DataReader是服务器结果集游标的体现,所有    查询出来的数据都在MySQL服务器上。好处是:当查询结果数据量大的时候避免占用本地内存。不过大部分项目中都会避免大查询结果,因此缺点就明显了:读取的时候必须保持Connection,不仅用起来麻烦,而且会较长时间占用MySQL服务器的连接资源。

 

DataSet是一个离线数据结果集容器,它把结果数据放到本地内存中。因为查询结果可能包含多个表,因此DataSet包含若干个DataTable(ds.Tables)、DataTable包含若干个DataRow(dt.Rows)。

 

用法1:

 

DataSet ds = new DataSet();
MySqlDataAdapter adapter
= new MySqlDataAdapter(cmd);
adapter.Fill(ds);
DataTable table
= ds.Tables[0];

 

 

DataSet 可以盛放多个查询结果集(DataTable),DataAdapter还可以对结果进行傻瓜化更新、删除、修改。我们一般查询集就一个DataTable,DataAdapter的傻瓜化更新不适合于正式项目,因此有更简单的用法:

DataTable dt = new DataTable();
dt.Load(reader);

 

把DataTable声明到 using 外,using 外在使用查询结果
遍历DataTable:

for (int i = 0; i )
{DataRow row = dt.Rows[i];string name = row.IsNull("Name")?null:(string)row["Name"];//NULL处理Console.WriteLine("name"+name);
}

 

  1.  
案例代码:
(1)这样的方法是等所有操作才关闭连接,一直占用连接 影响别人访问数据库

static void Main(string[] args)
{
using(MySqlConnection conn = new MySqlConnection("Server=127.0.0.1;Database=study1;uid=root;pwd=root;Charset=utf8"))using (MySqlCommand cmd = conn.CreateCommand()){conn.Open();//打开链接//查询T_Users表所有数据的SQL语句cmd.CommandText = "select * from T_Users";//声明DataReader对象using (MySqlDataReader reader = cmd.ExecuteReader()){DataTable dt = new DataTable();//通过DataTable对象的Load方法填充
dt.Load(reader);//循环获得DataTable的每行的数据for (int i = 0; i ){DataRow row = dt.Rows[i];int id = (int)row["Id"];//下标方式获得的是object类型string username = (string)row["UserName"];//输出Console.WriteLine("Id="+id+";UserName="+username);}}}Console.ReadKey();
}

 

(2)这样做是获取数据填充到DataTable,填充完之后断开连接 不影响别人访问,DataTable也可以继续使用操作

DataTable table = new DataTable();//把DataTable声明到using外面
using(MySqlConnection conn = new MySqlConnection("Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8"))
using (MySqlCommand cmd = conn.CreateCommand())
{conn.Open();cmd.CommandText
= "select * from T_Users";using (MySqlDataReader reader = cmd.ExecuteReader()){table.Load(reader);//加载数据到table中
}
}
//此时DataTable已经填充完数据 即使连接断开也能操作
for (int i = 0; i )
{DataRow row = table.Rows[i];int id = (int)row["Id"];string username = (string)row["UserName"];Console.WriteLine(id+":"+username);
}

 

7、获得自动增长字段的值

不要用插入后获取最大值得方法,有并发问题,很多人访问时几乎同时插入信息,获取最大值已经不是刚才插入的值

 

在同一个连接中使用Last_Insert_Id( ) ;可以Insert、Last_Insert_Id( ) 单独执行,也可以把Last_Insert_Id( )放到 Insert语句后面用  ;  分割(使用ExecuteScalar执行即可)

 

8、事务的原子性

事务基础

事务(Transaction)有四大特征(*):原子性、一致性、隔离性、持久性。

原子性指的是“几个操作要么都成功,要么都失败”!

 

ADO.Net事务的几个关键环节

1)要在一个连接当中

2)启动事务:  MySqlTransaction tx = conn.BeginTransaction();

3)操作结束后  tx.Commit()  提交事务

4)如果执行出错,则  tx.Rollback()  回滚 (当前事务的操作全部取消)。

MySqlTransaction tx = conn.BeginTransaction();//启动事务
try
{MySqlHelper.ExecuteNonQuery(conn,
"Update t_accounts Set Amount=Amount-1000 where Number='0001'");string s = null;s.ToLower();MySqlHelper.ExecuteNonQuery(conn, "Update t_accounts Set Amount=Amount+1000 where Number='0002'");tx.Commit();//执行到这,没有错误则提交事务
}
catch (Exception ex)
{tx.Rollback();
//如果过程中出现任何错误则执行回滚(当前事务操作全部取消)
}

 

9、写一个MySqlHelper

 

1 class MySqlHelper
2 {
3 private static readonly string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
4
5 ///


6 /// 创建一个链接并打开
7 ///

8 /// MySql连接对象
9 public static MySqlConnection CreatConnection()
10 {
11 MySqlConnection conn = new MySqlConnection(connstr);
12 conn.Open();
13 return conn;
14 }
15 ///
16 /// 用已创建的连接执行一个MySQL语句
17 ///

18 /// 已创建的连接对象
19 /// 要执行的MySql语句
20 /// 参数化查询的参数值
21 /// 返回受影响的行数
22 public static int ExecuteNonQuery(MySqlConnection conn, string sql, params MySqlParameter[] parameters)
23 {
24 using (MySqlCommand cmd = conn.CreateCommand())
25 {
26 cmd.CommandText = sql;
27 //foreach (MySqlParameter p in parameters)
28 //{
29 // cmd.Parameters.Add(p);
30 //}
31 cmd.Parameters.AddRange(parameters);
32 int i=cmd.ExecuteNonQuery();
33 return i;
34 }
35 }
36 ///
37 /// 自己创建连接执行MySql语句
38 ///

39 /// 要执行的语句
40 /// 参数化查询的替换值
41 /// 受影响的行数
42 public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
43 {
44 using (MySqlConnection conn = CreatConnection())
45 {
46 return ExecuteNonQuery(conn, sql, parameters);
47 }
48 }
49 ///
50 /// 用已创建的连接查询第一行第一列
51 ///

52 /// 已创建的连接对象
53 /// 要执行的MySql语句
54 /// 参数化查询的参数传递值
55 ///
56 public static object ExecuteScalar(MySqlConnection conn, string sql, params MySqlParameter[] parameters)
57 {
58 using (MySqlCommand cmd = conn.CreateCommand())
59 {
60 cmd.CommandText = sql;
61 cmd.Parameters.AddRange(parameters);
62 return cmd.ExecuteScalar();
63 }
64 }
65 ///
66 /// 自己创建连接查询第一行第一列
67 ///

68 ///
69 ///
70 ///
71 public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
72 {
73 using (MySqlConnection conn = CreatConnection())
74 {
75 return ExecuteScalar(conn, sql, parameters);
76 }
77 }
78 ///
79 /// 获得查询的表数据
80 ///

81 /// 已创建的连接对象
82 /// 要执行的语句
83 /// 参数化查询的参数值
84 /// 返回DataTable本地结果集对象
85 public static DataTable ExecuteDataTable(MySqlConnection conn, string sql,params MySqlParameter[] parameters)
86 {
87 DataTable table = new DataTable();
88 using (MySqlCommand cmd = conn.CreateCommand())
89 {
90 cmd.CommandText = sql;
91 cmd.Parameters.AddRange(parameters);
92 using (MySqlDataReader reader = cmd.ExecuteReader())
93 {
94 table.Load(reader);
95 }
96 }
97 return table;
98 }
99 ///
100 /// 获得查询的表数据
101 ///

102 /// 要执行的语句
103 /// 参数化查询的参数值
104 /// 返回DataTable本地结果集对象
105 public static DataTable ExecuteDataTable(string sql,params MySqlParameter[] parameters)
106 {
107 using (MySqlConnection conn = CreatConnection())
108 {
109 return ExecuteDataTable(conn, sql, parameters);
110 }
111 }
112 }
View Code

 

10、ADO.Net连接SQLServer

1、ADO.Net如何连接SQLServer:SQLServer驱动.Net内置(亲生的);把MySqlConnection转换成SqlConnection,MySql***换成Sql***;

2、连接字符串:    server=ip;user id= sa;password=密码;database=db1

3、SQLHelper:把MySql替换成Sql就可以了

4、获得自动增长列的值:Insert into T1(...) output Insert.Id Values(......)

5、如果基于接口编程,只要改动 CreateConnection 就可以;查询参数以Dictionary传递;如果使用Provider,连代码都不用改,改配置文件即可

6、需要特别注意:SqlServer 的事务和MySql事务使用有一点不一样的地方是 “需要把 BeginTransaction 返回的 SqlTransaction 对象赋值给 SqlCommand 的 Transaction 属性”。

 

 

 

转:https://www.cnblogs.com/pirates/p/4550005.html



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
憨哇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有