这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例。

.NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库,它的命名空间在System.Data下,要访问SQL Server数据库,就要引用其下的System.Data.SqlClient空间,若使用别的数据库,就要下载对应的包。例如,访问MySql数据库就要下载MySql.Data包。

我们用C#连接数据库,首先要连接数据库,连接数据库使用的类是SqlConnection,

它需要一个连接字符串,这个连接字符串包含服务器地址,数据库名称,用户名,密码,或者指示为Windows身份登录。它有多种表示形式,一般我使用如下的形式:

string connString = "server=.;database=student;user id=sa;password=123456";

这种形式比较好记,server是服务器地址,一个点代表本机,你也可以写ip地址,访问别的机器,database是数据库名称,user id是用户名,一般是sa,password(可以简写为pwd)是密码。

了解了这两个元素,就能连接数据库了,代码如下:

SqlConnection connection = new SqlConnection (connString);
//注意,此时还没有真正连接,我们需要调用open()方法,打开连接
connection.Open();

连接到数据库后,我们就可以进行下一步执行sql语句了,sql语句的执行需要依赖SqlCommond这个类。SqlComand这个类需要传入sql语句和连接对象,代码如下:

SqlCommand command=new SqlCommand("此处是sql语句",connection);

在将具体的增删改查之前,我们还要了解一个类叫SqlParameter,一个SqlParameter就是一个键值对,它的键是sql语句中的变量,值是就是执行sql时的实际的数据,具体声明如下:

SqlParameter parameters = new SqlParameter("@sname", "张三");

( sql语句中变量以@开头,如果不熟悉sql这个语言,可以留意我后期的文章。)

以下是Student数据库的StudentInfo数据表中的所有数据,增删改查的演示都会基于此表:

查询操作:

接下来我们演示一下查询,查询李四的所有信息,代码如下:

SqlParameter[] parameters = new[] { new SqlParameter ("@sname", "李四"), };
string sql="select SID,SName,SGender from StudentInfo where SName=@sname ";
using (SqlConnection connection = new SqlConnection(connString))
{using (SqlCommand command = new SqlCommand (sql, connection)){try{connection.Open();if (parameters != null){command.Parameters.AddRange (parameters);}//返回SqlDataReader对象,通过这个对象获取数据SqlDataReader reader = command.ExecuteReader ();//根据HasRows属性判断是否有数据if (reader.HasRows){StudentModel data = new StudentModel ();//将指针下移一行reader.Read ();StudentModel sm = new StudentModel ();//根据索引获取数据sm.SID = reader.GetInt32(0);sm.SName = reader.GetString (1);sm.SGender = reader.GetInt32 (2);Console.WriteLine(data);}return null;}catch{return null;}}
}//student实体类
class StudentModel
{public int SID { get; set; }public string SName { get; set; }public int SGender { get; set; }public override string ToString (){return $"SID:{SID}\tSName:{SName}\tSGender:{SGender}";}
}

我们在执行查询时,会先创建一个实体对象,一个实体对象对应数据库中的一行数据。

执行查询操作,需要调用SqlCommand的ExecuteReader()方法,改方法返回一个SqlDataReader对象,通过这个对象,我们可以获取数据,它的两个常用属性的用法在代码注释中已写出,下面着重介绍Read()方法和GetXxx()方法。

如果有数据,SqlDataReader中的指针就指向第0行,我们需要调用Read()方法,将指针下移,如果下一行不为空,该方法返回true,否则返回false。在获取数据时,我们可以根据列数(列数从0开始)和对应的数据类型准确获取到数据,如:SID它是一个int类型,在第一列,我们就可以使用GetInt32(0)来获取到这个数据。另外,我们还可以通过列名去访问:如reader["SID"],这样就会获取到当前这一行中列名为SID的数据。

使用using是为了运行结束后可以及时的释放掉资源,防止内存泄漏。

以上代码的运行结果为:

插入,更新,删除:

把这三个放在一块是因为这三个在代码表现层面是一致的,都是调用SqlCommand的ExecuteNonQuery()方法,该方法返回int类型的数据,也就是受影响的行数,下面以执行插入的代码为例:

SqlParameter[] parameters = new[] { new SqlParameter ("@sname", "王五"),new SqlParameter ("@sid",20200003),new SqlParameter ("@sgender",2), };
string sql="insert into StudentInfo (SID,SName,SGender) Values(@sid,@sname,@sgender)";
using (SqlConnection connection = new SqlConnection(connString))
{using (SqlCommand command = new SqlCommand (sql, connection)){try{if (parameters != null){command.Parameters.AddRange (parameters);}int result= command.ExecuteNonQuery ();//result为1}catch{return 0;}}
}

删除和更新也是一样的,只不过是sql语句不一样,此处不再赘述。

执行聚合函数:

    SqlCommand类提供了一个ExecuteScalar()来执行聚合函数,聚合函数的返回值是不固定的,所以这个方法的返回值是object,用法也是类似,返回的这个object值就是查询的结果,我们可以拆箱为对应的数据类型进行使用。

一般我们会将这些操作封装成工具类,从而简化代码,下面贴出我自己写的一个sql工具类,读者可以自行拷贝学习、使用。

static class ADOUtils
{private static SqlConnection connection = null;/// <summary>/// 连接数据库/// </summary>/// <param name="connString">数据库连接字符串</param>/// <returns>是否连接成功 bool</returns>public static bool ConnDB (string connString){try{connection = new SqlConnection (connString);connection.Open ();return true;}catch{connection = null;return false;}}/// <summary>/// 断开连接/// </summary>public static void CloseConnect (){connection.Close ();connection.Dispose ();}/// <summary>/// 执行增,删,改操作/// </summary>/// <param name="sql">sal语句</param>/// <param name="parameters">参数</param>/// <returns>受影响的行数</returns>public static int ExcuteSQL (string sql, SqlParameter[] parameters){if (connection == null){Console.WriteLine ("数据库未连接");return 0;}using (SqlCommand command = new SqlCommand (sql, connection)){try{if (parameters != null){command.Parameters.AddRange (parameters);}return command.ExecuteNonQuery ();}catch{return 0;}}}/// <summary>/// 执行聚合函数操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">参数</param>/// <returns>聚合结果,如果执行出错,返回false</returns>public static object ExcuteMethods (string sql, SqlParameter[] parameters){if (connection == null){Console.WriteLine ("数据库未连接");return 0;}using (SqlCommand command = new SqlCommand (sql, connection)){try{if (parameters != null){command.Parameters.AddRange (parameters);}return command.ExecuteScalar ();}catch{return false;}}}/// <summary>/// 执行查询操作(泛型版)/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">参数</param>/// <returns>数据集合,出错返回null</returns>public static List<T> SelectDB<T> (string sql, SqlParameter[] parameters) where T : new(){if (connection == null){Console.WriteLine ("数据库未连接");return null;}using (SqlCommand command = new SqlCommand (sql, connection)){try{if (parameters != null){command.Parameters.AddRange (parameters);}SqlDataReader reader = command.ExecuteReader ();if (reader.HasRows){List<T> data = new List<T> ();Type type = typeof (T);object o = Activator.CreateInstance (type);while (reader.Read ()){foreach (var property in type.GetProperties ()){property.SetValue (o, reader[property.Name]);}data.Add ((T)o);}return data;}return null;}catch{return null;}}}/// <summary>/// 执行查询操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">参数</param>/// <returns>数据集合,出错返回null</returns>public static List<StudentModel> SelectStudentInfo (string sql, SqlParameter[] parameters){if (connection == null){Console.WriteLine ("数据库未连接");return null;}using (SqlCommand command = new SqlCommand (sql, connection)){try{if (parameters != null){command.Parameters.AddRange (parameters);}SqlDataReader reader = command.ExecuteReader ();if (reader.HasRows){List<StudentModel> data = new List<StudentModel> ();while (reader.Read ()){StudentModel sm = new StudentModel ();sm.SID = reader.GetInt32(0);sm.SName = reader.GetString (1);sm.SGender = reader.GetInt32 (2);data.Add (sm);}return data;}return null;}catch{return null;}}}
}

本节到此结束,下节讲对数据库的一些高级操作...

-----------------------------------

公众号【Csharp编程大全】,需要进技术群交流的,请添加小编mm1552923!

使用C#进行数据库增删改查(一)相关推荐

  1. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现

    常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现 以下方法全部亲测可用 //测试查找全部@Testpublic void testSelectAll(){List<U ...

  2. Mysql (一)Mysql 数据库增删改查

    mysql数据库增删改查增:create database DBname charset gbk; 删:drop database DBname; 改:alter database DBname ch ...

  3. sql增删改查_快速搞定数据库增删改查|附思维导图

    数据库学习,增删改查一直是测试工程师面试笔试的必考知识点,对于常用sql语法我们一定要牢记于心,尤其是各种查询的用法,在面试的时候,一个小小的知识点,面试官都可以推断出求职者的基础是否扎实. 下面是关 ...

  4. Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...

  5. php+mysql+into_PHP+Mysql 如何实现数据库增删改查

    PHP+Mysql实现数据库增删改查的方法:1.创建入口文件[index.html]连接数据库.查询数据:2.点击增加按钮,通过[addnews.html]添加数据:3.点击删除按钮,通过服务端文件[ ...

  6. Java连接Mysql数据库增删改查实现

    Java连接Mysql数据库增删改查实现 时间比较赶,我这里只实现查询,有时间再添加另外两个 难度 : ⭐⭐⭐(全星5颗星的情况下) 新建一个动态的网站工程, 把jar包全部复制进去,主要要那个mys ...

  7. flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

    Flask-SQLAlchemy对数据库增删改查 安装 pip install flask-sqlalchemy 具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释 @app.route( ...

  8. mysql 中caption_Django-Model操作数据库(增删改查、连表结构)(示例代码)

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表 基本结构 from django.db importmodelsclassuserinfo(models ...

  9. java servlet dao_Java+MyEclipse+Tomcat 详解Servlet和DAO数据库增删改查操作(源码)

    [实例简介] 该资源主要参考自己的博客http://blog.csdn.net/eastmount/article/details/45936121 讲诉Java+MyEclipse+Tomcat 详 ...

  10. mfc连接mysql增删改查_java实现mysql数据库增删改查

    1.连接数据库: import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { stat ...

最新文章

  1. python 查看函数调用栈
  2. 电脑间用网线传输文件的方法Win10-Win10(Win7)
  3. 01_Win10下CUDA的安装、查看并升级Nvidia显卡驱动、安装CUDA、设置环境变量、测试CUDA是否安装成功
  4. 一张图,看懂阿里云12年的“飞天日记”
  5. 【Python】单元测试框架unitest及其高级应用
  6. Microsoft发布用于统一事件处理的Azure事件网格
  7. 批次程序安裝手冊寫法
  8. 【华为云技术分享】云小课 | 容灾切换:业务一键切换到容灾站点
  9. 统一并发 IV——走向跨平台
  10. pandas中replace的用法
  11. win8系统服务器地址怎么查,win8查询服务器地址
  12. JVM初识之常用参数配置
  13. 知识库文章MDL9396274-How to:使用色环电阻计算器
  14. 在线qq的html代码,网页QQ
  15. crucible VS gerrit
  16. css3制作手风琴,一步步教你css3手风琴效果的实现
  17. 如何选择第三方电子发票平台服务商?
  18. SIM900A(GSM模块)学习
  19. 大数据学习一般学什么
  20. 配置群晖NAS中的cpolar开机自启动 2-2

热门文章

  1. python手机号码替换代码_手机号码中间部分替换成星号
  2. v6使用手册 天正电气t20_T20电气软件官方版下载-TElecT20V6 附安装教程 - 河东下载站...
  3. TSINGSEE青犀视频开发AI人脸对比如何输出多个对比相似度的人脸?
  4. 特征探索性分析Exploring_features
  5. 汇编篇 :关于地址总线与数据总线的换算
  6. 总结--上传插件Upload.js的使用
  7. CodeSys之CRC校验
  8. 西门子仿真软件(S7-PLCSIM Advanced )与C#通过Profinet读写DB测试总结
  9. 渗透测试工程师可以写进简历的技能介绍部分
  10. 激光雷达工作原理简介