本文介绍SQL Server基本的CRUD操作,参考了微软官方教程
Create C# apps using SQL Server on Windows
注意
- 本程序使用了demo数据库,请事先在SQL Server服务器上创建,或者将代码中的
sb.Append("use demo;");
注释,注释后students
表将会创建在master数据库中 - 本程序使用SQL Server2000服务器,搭建方式请参考 极简SQL Server 2000使用
- 本程序编译环境搭建方法请参考 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班
网友评论