C#操作SQL Server

2019-12-07  本文已影响0人  Godan

本文介绍SQL Server基本的CRUD操作,参考了微软官方教程

Create C# apps using SQL Server on Windows

注意

  1. 本程序使用了demo数据库,请事先在SQL Server服务器上创建,或者将代码中的 sb.Append("use demo;"); 注释,注释后 students 表将会创建在master数据库中
  2. 本程序使用SQL Server2000服务器,搭建方式请参考 极简SQL Server 2000使用
  3. 本程序编译环境搭建方法请参考 C# 极简环境搭建
/*
MSSQL SERVER基本数据库操作示例
1. 连接、关闭数据库
2. CRUD(创建、读取、更新、删除)操作
*/

using System;
using System.Text;
using System.Data.SqlClient;


class Hello
{
    static void QueryStudent(SqlConnection conn, String name)
    {
        Console.WriteLine("\n查询{0}同学的信息", name);
        String sqlText = "SELECT * FROM students WHERE name='" + name + "';";
        var cmd = new SqlCommand(sqlText, conn);
        // 可以使用 var 定义 reader
        // var reader = cmd.ExecuteReader();
        // 编译器将自行推导出reader的具体类型
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine("编号:{0} 姓名:{1} 班级:{2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
        }
        // 不再使用reader就关闭
        // 帮助文档 https://docs.microsoft.com/zh-cn/dotnet/api/system.data.sqlclient.sqldatareader?view=netframework-4.8
        reader.Close();
    }

    static void CreateTable(SqlConnection conn)
    {
        Console.WriteLine("\n创建学生表");
        var sb = new StringBuilder();
        // 如果demo数据库中存在students表,则删除它
        // 适用于SQL SERVER2016以下
        sb.Append("use demo;");

        sb.Append("IF OBJECT_ID(N'students', N'U') IS NOT NULL");
        sb.Append(" DROP TABLE students;");
        // 适用SQL SERVER2016及以上
        // sb.Append("DROP TABLE IF EXISTS students;");

        // 创建students表
        sb.Append("CREATE TABLE students(");
        // 字段id,类型int,自增(从1开始,递增1),不能为空,主键
        sb.Append("id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,");
        // 字段name,字符串类型(长度12个字符)
        sb.Append("name NVARCHAR(12),");
        // 字段class,字符串类型(长度16个字符)
        sb.Append("class NVARCHAR(16),");
        sb.Append(");");

        new SqlCommand(sb.ToString(), conn).ExecuteNonQuery();
        Console.WriteLine("创建学生表完成");

        sb.Clear();
        // 新增学生信息
        sb.Append("INSERT INTO students (name, class) VALUES('王小虎', '一年级4班');");
        sb.Append("INSERT INTO students (name, class) VALUES('周建军', '一年级1班');");
        sb.Append("INSERT INTO students (name, class) VALUES('胡苗', '一年级1班');");
        sb.Append("INSERT INTO students (name, class) VALUES('孙咚咚', '一年级2班');");
        // 执行新增操作
        var rowsAffected = new SqlCommand(sb.ToString(), conn).ExecuteNonQuery();
        Console.WriteLine("新增学生信息完成,影响行数:{0}", rowsAffected);
    }

    static void Main()
    {
        try
        {
            // 设置连接参数
            var builder = new SqlConnectionStringBuilder();
            // 主机地址
            builder.DataSource = "localhost";
            // 用户名
            builder.UserID = "sa";
            // 密码
            builder.Password = "";
            // 数据库名称 
            builder.InitialCatalog = "master";

            // 连接数据库服务器
            Console.WriteLine("连接到MSSQL服务器");
            // 用连接参数初始化连接对象
            var conn = new SqlConnection(builder.ConnectionString);
            // 打开连接
            conn.Open();
            Console.WriteLine("连接成功,当前数据库:{0}", builder.InitialCatalog);

            // 创建学生表
            CreateTable(conn);

            // 查询
            Console.WriteLine("\n查询学生表 students");
            var sb = new StringBuilder();
            // 添加字符串:使用demo数据库
            // 如果将 builder.InitialCatalog 设置为demo,use demo;这句就不需要
            sb.Append("use demo;");

            // 添加字符串:查询demo数据库下的students表里所有数据
            sb.Append("select * from students;");

            // StringBuilder.ToString() 拼接字符串
            // Console.WriteLine("sb拼接结果:{0}", sb.ToString());

            // SqlCommand 关联查询字符串sb与连接conn
            var cmd = new SqlCommand(sb.ToString(), conn);
            // cmd.ExecuteReader() 执行sql语句,并返回查询结果读取器reader
            var reader = cmd.ExecuteReader();
            //(逐行)遍历reader中所有数据
            while (reader.Read())
            {
                // reader.GetInt32(0) 这里的0表示第1列(数组下标从0开始),同理 reader.GetString(1)中1表示第2列
                // 每次循环,reader读取一行,比如:第1次循环中,readerGetInt32(0)读取的是 1行1列 的数据

                Console.WriteLine("编号:{0} 姓名:{1} 班级:{2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
            }
            reader.Close();

            // 增加新学生到 students 表中
            // 复用sb对象,清空字符串内容
            Console.WriteLine("\n新增学生 王小川");
            sb.Clear();
            sb.Append("INSERT INTO students(name, class) VALUES('王小川', '三年级2班');");
            // 复用cmd对象,重新分配SqlCommand,原来(查询时)的引用自动丢失
            cmd = new SqlCommand(sb.ToString(), conn);
            int rowsAffected = cmd.ExecuteNonQuery();
            Console.WriteLine("查询结束,影响行数:{0}", rowsAffected);

            // 验证新插入的数据
            QueryStudent(conn, "王小川");


            // 修改王小川同学的班级
            Console.WriteLine("\n将王小川同学改为 二年1班");
            rowsAffected = new SqlCommand("UPDATE students SET class='二年级1班' where name='王小川';", conn).ExecuteNonQuery();
            Console.WriteLine("修改完毕,影响行数:{0}", rowsAffected);

            // 验证修改后的数据
            QueryStudent(conn, "王小川");

            // 删除王小川同学的信息
            Console.WriteLine("\n删除王小川同学的信息");
            rowsAffected = new SqlCommand("DELETE FROM students WHERE name='王小川';", conn).ExecuteNonQuery();
            Console.WriteLine("删除完毕,影响行数:{0}", rowsAffected);

            // 验证修改后的数据
            QueryStudent(conn, "王小川");

            // 不再使用conn就关闭
            conn.Close();
        }
        catch (SqlException e)
        {
            Console.WriteLine("数据库操作失败:{0}", e.ToString());
            return;
        }
    }
}

代码执行结果如下

c:\csharp\sqlserver>csc CRUD.cs
c:\csharp\sqlserver>CRUD.exe
连接到MSSQL服务器
连接成功,当前数据库:master

创建学生表
创建学生表完成
新增学生信息完成,影响行数:4

查询学生表 students
编号:1 姓名:王小虎 班级:一年级4班
编号:2 姓名:周建军 班级:一年级1班
编号:3 姓名:胡苗 班级:一年级1班
编号:4 姓名:孙咚咚 班级:一年级2班

新增学生 王小川
查询结束,影响行数:1

查询王小川同学的信息
编号:5 姓名:王小川 班级:三年级2班

将王小川同学改为 二年1班
修改完毕,影响行数:1

查询王小川同学的信息
编号:5 姓名:王小川 班级:二年级1班
上一篇下一篇

猜你喜欢

热点阅读