前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用C#进行数据库增删改查(一)

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

作者头像
宿春磊Charles
发布2022-03-29 10:20:14
1.5K0
发布2022-03-29 10:20:14
举报
文章被收录于专栏:DotNet 致知

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

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

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

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

代码语言:javascript
复制
string connString = "server=.;database=student;user id=sa;password=123456";

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

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

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

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

代码语言:javascript
复制
SqlCommand command=new SqlCommand("此处是sql语句",connection);

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

代码语言:javascript
复制
SqlParameter parameters = new SqlParameter("@sname", "张三");

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

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

查询操作:

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

代码语言:javascript
复制
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类型的数据,也就是受影响的行数,下面以执行插入的代码为例:

代码语言:javascript
复制
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工具类,读者可以自行拷贝学习、使用。

代码语言:javascript
复制
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;
            }
        }
     }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档