使用C#进行数据库增删改查ADO.NET(一)
这节讲一下如何使用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;
}
}
}
}
个人公众号,热爱分享,知识无价。

使用C#进行数据库增删改查ADO.NET(一)的更多相关文章
- 使用C#进行数据库增删改查ADO.NET(三)
文章代码如下: class Program { static void Main (string[] args) { //连接数据库 string connString = "server= ...
- 使用C#进行数据库增删改查ADO.NET(二)
这节接着讲用C#进行数据库CRUD,高级部分. 事务: 事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改.C#提供了SqlTransac ...
- NX二次开发-NX访问SqlServer数据库(增删改查)C#版
版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...
- Yii2.0高级框架数据库增删改查的一些操作(转)
yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- go——beego的数据库增删改查
一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...
- (转)SQLite数据库增删改查操作
原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...
- Yii2.0高级框架数据库增删改查的一些操作
yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...
- WindowsPhone8 数据库增删改查
今天第一次在博客园发表文章,如果有的地方写的不对,还请大家指出! 1.这就是一个简单wp8数据库增删改查 1.创建数据表Person [Table] public class Person : INo ...
随机推荐
- Go语言中使用K8s API及一些常用API整理
Go Client 在进入代码之前,理解k8s的go client项目是对我们又帮助的.它是k8s client中最古老的一个,因此具有很多特性. Client-go 没有使用Swagger生成器,就 ...
- [Azure Devops] 使用 Azure Repos 管理代码
1. 什么是 Azure Repos Azure Repos 是一组版本控制工具,可用于管理代码.无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制. 版本控制系统是可帮助您跟踪随时间变化对 ...
- [LeetCode]2. 两数相加(难度:中等)
题目: 给你两个非空的链表,表示两个非负的整数.它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字.请你将两个数相加,并以相同形式返回一个表示和的链表.你可以假设除了数字0之外,这两个 ...
- Codeforces-121C(逆康托展开)
题目大意: 给你两个数n,k求n的全排列的第k小,有多少满足如下条件的数: 首先定义一个幸运数字:只由4和7构成 对于排列p[i]满足i和p[i]都是幸运数字 思路: 对于n,k<=1e9 一眼 ...
- 一键部署etcd集群管理脚本
一.编写脚本 1 #!/bin/sh 2 # 安装 3 # ./run.sh etcd03 etcd01=http://192.168.2.44:2380,etcd02=http://192.168. ...
- B1029/A1048 旧键盘损坏了,在输入一段文字时坏了的键不可以正常使用,现给出应输入的一段文字,和实际输出的文字,找出坏掉的键。
#include<cstdio> #include<cstring> const int maxn = 1000; bool HashTable[maxn] = { false ...
- 【CTF】图片隐写术 · 盲水印
前言 盲水印同样是CTF Misc中极小的一个知识点,刚刚做到一题涉及到这个考点的题目. 感觉还挺有意思的,就顺便去了解了下盲水印技术. 数字水印 数字水印(Digital Watermark)一种应 ...
- ret2dl64
ret2dl64 ret2dl64 与ret2dl32不同,ret2dl64需要知道libc. 检查保护: IDA看一看 read_got 被置为0,强制你使用ret2dlresolve. 我们先伪造 ...
- 王炸!!IDEA 2021.1 推出语音、视频功能,边写代码边聊天,我真的服了…
IDEA 2020.3 刚没用多久,2021.1 又陆续给我推送更新了: 启动就提醒更新,麻烦,那不如更新下,体验下新版本. 如上图所示,2021.1 更新了 9 个新特性,下面栈长会一一体验给大家介 ...
- Spring Boot 2.x 快速集成Kafka
1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...