C#——SQLServer数据库入门
- 学习目标:通过本文,读者将学会使用C#连接SQL Server、执行基本SQL操作,并理解关键概念。
- 环境准备:确保安装Visual Studio(推荐最新版)、SQL Server Express或更高版本,以及SQL Server Management Studio (SSMS)。
一.SQL Server Management Studio的简单运用
首先,在这里我们创建我们的数据库。
这里可以填写数据库的名称和文件所创建的位置。
创建完整后,我们的TestDB会出现在数据库下的根目录下面。
在创建的数据库下选择表右机选择新建表。
在右边表格处,填写列名和数据类型。
注意:右边可以选择这边的列名是否可以有null值。
找到我们创建的表右键选择前1000行,会出现我们刚刚创建的表格数据。
右击编辑前200行可以在表格里面ti'a
点击新建查询可以通过使用sql语句对表格进行操作。
二.SQL语句的简单运用
SQL语句——查询,新增,删除,修改
--取
select UserName,Password,NikeName from UserT--存
insert into UserT(UserName,Password,NikeName) values('111','222','333')--删除
delete from UserT where UserName='111'--修改
update UserT set UserName='我是大帅哥'
在SQL Server Management Studio里面选择写的sql语句点击执行即可。
取:
存:
删除:
修改:
SQL语句——更改主键
键:用于唯一标识记录,确保数据的唯一性和完整性,不能包含 NULL
值。
三.C#连接数据库的简单运用
1.取
首先,我们创建一个C#的项目模板——控制台应用(.NET Framework)。
//创建并配置数据库连接
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";//打开数据库连接
conn.Open();
//创建SQL命令对象,并设置SQL命令和连接
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from UserT;";//创建数据适配器对象,并设置SQL命令
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;//创建DataSet对象,并使用数据适配器填充数据
DataSet ds = new DataSet();
adapter.Fill(ds);//关闭数据库连接
conn.Close();//从DataSet中获取数据表,并遍历输出指定列的值
DataTable table = ds.Tables[0];
for (int i = 0; i < table.Rows.Count; i++)
{Console.WriteLine($"{table.Rows[i]["AdminID"]}{table.Rows[i]["Pwd"]}{table.Rows[i]["Name"]}");
}
注意:在这里我们采用Windows默认的方式连接
如上代码的流程是:
创建并配置数据库连接。
打开数据库连接。
创建SQL命令对象,并设置SQL命令和连接。
创建数据适配器对象,并设置SQL命令。
创建
DataSet
对象,并使用数据适配器填充数据。关闭数据库连接。
从
DataSet
中获取数据表,并遍历输出指定列的值。
数据库连接部分
SqlConnection conn = new SqlConnection();
作用:创建一个
SqlConnection
对象,用于建立与SQL Server数据库的连接。解释:
SqlConnection
是.NET框架中用于与SQL Server数据库进行交互的类。
conn.ConnectionString = "Server=localhost;Database=TestDB;Trusted_Connection=true;";
作用:设置连接字符串,指定数据库服务器、数据库名称和身份验证方式。
解释:
Server=localhost
:指定数据库服务器地址为本地计算机。Database=TestDB
:指定要连接的数据库名称为TestDB
。Trusted_Connection=true
:使用Windows身份验证方式连接数据库,不需要手动输入用户名和密码。
conn.Open();
作用:打开数据库连接。
解释:在执行任何数据库操作之前,必须先打开连接。
SQL命令和数据适配器部分
SqlCommand cmd = new SqlCommand();
作用:创建一个
SqlCommand
对象,用于执行SQL命令。解释:
SqlCommand
是.NET框架中用于执行SQL语句的类。
cmd.Connection = conn;
作用:将
SqlCommand
对象与前面创建的数据库连接对象conn
关联起来。解释:这样
SqlCommand
对象就知道使用哪个数据库连接来执行SQL命令。
cmd.CommandText = "select * from UserT;";
作用:设置要执行的SQL命令。
解释:这里设置的SQL命令是查询
UserT
表中的所有数据。
SqlDataAdapter adapter = new SqlDataAdapter();
作用:创建一个
SqlDataAdapter
对象,用于将数据从数据库加载到内存中的DataSet
对象。解释:
SqlDataAdapter
是.NET框架中用于数据填充的类。
adapter.SelectCommand = cmd;
作用:将
SqlCommand
对象赋值给SqlDataAdapter
的SelectCommand
属性。解释:这样
SqlDataAdapter
就知道使用哪个SQL命令来获取数据。
DataSet ds = new DataSet();
作用:创建一个
DataSet
对象,用于在内存中存储数据。解释:
DataSet
是.NET框架中用于存储和操作数据的类,类似于一个内存中的数据库。
adapter.Fill(ds);
作用:将从数据库中查询到的数据填充到
DataSet
对象中。解释:
Fill
方法会执行SelectCommand
中的SQL命令,并将结果存储到DataSet
中。
数据处理部分
conn.Close();
作用:关闭数据库连接。
解释:在完成数据操作后,应该关闭数据库连接,释放资源。
DataTable table = ds.Tables[0];
作用:从
DataSet
中获取第一个DataTable
对象。解释:
DataSet
可以包含多个DataTable
,这里获取的是第一个表。
for (int i = 0; i < table.Rows.Count; i++)
{Console.WriteLine($"{table.Rows[i]["UserName"]}{table.Rows[i]["Password"]}{table.Rows[i]["NikeName"]}");
}
作用:遍历
DataTable
中的每一行,并输出指定列的值。解释:
table.Rows.Count
:获取表中的行数。table.Rows[i]
:获取第i
行的数据。table.Rows[i]["UserName"]
:获取第i
行中UserName
列的值。Console.WriteLine
:将获取到的值输出到控制台。
拓展:
DataTable的底层理解:
DataTable
底层采用行集结构,每一行是一个独立的对象,类似于链表。当将DataTable
数据填充到数组时,通常是逐行遍历,将每行的ItemArray
(内部存储数据的数组)复制到目标数组。这种实现支持动态扩展行,但填充到数组的性能不如直接二维数组快。
2.存
// 创建一个新的SQL连接对象,用于与SQL Server进行通信
SqlConnection conn = new SqlConnection();
// 设置连接字符串,指定了服务器名称、数据库名称以及身份验证方式
conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";
// 打开连接,与SQL Server建立会话
conn.Open();// 定义用户信息
string AdminID = "222";
string Pwd = "222";
string Name = "222";
// 构造SQL插入语句(采用字符串拼接方式,容易导致安全问题)
string insertSQL = $"insert into UserT values('{AdminID}','{Pwd}','{Name}');";// 创建一个SQL命令对象,用于执行SQL语句
SqlCommand cmd = new SqlCommand(insertSQL, conn);
// 执行插入语句,并返回受影响的行数。该方法适用于不返回结果集的命令,如插入、更新和删除操作
int count = cmd.ExecuteNonQuery();// 关闭连接,释放资源
conn.Close();
// 输出执行结果
Console.WriteLine($"执行新增语句,受影响的行数是:{count}");
3.封装的存取方法
接下来我们要对下面这段进行封装。
static void Main(string[] args){// 创建一个新的SQL连接对象,用于与SQL Server进行通信SqlConnection conn = new SqlConnection();// 设置连接字符串,指定了服务器名称、数据库名称以及身份验证方式conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";// 打开连接,与SQL Server建立会话conn.Open();// 定义用户信息string AdminID = "222";string Pwd = "222";string Name = "222";// 构造SQL插入语句(采用字符串拼接方式,容易导致安全问题)string insertSQL = $"insert into UserT values('{AdminID}','{Pwd}','{Name}');";// 创建一个SQL命令对象,用于执行SQL语句SqlCommand cmd = new SqlCommand(insertSQL, conn);// 执行插入语句,并返回受影响的行数。该方法适用于不返回结果集的命令,如插入、更新和删除操作int count = cmd.ExecuteNonQuery();// 关闭连接,释放资源conn.Close();// 输出执行结果Console.WriteLine($"执行新增语句,受影响的行数是:{count}");}
下面是封装后的语句。
static void Main(string[] args){// 定义用户信息string AdminID = "111";string Pwd = "222";string Name = "222";// 构造SQL插入语句(采用字符串拼接方式,容易导致安全问题)string insertSQL = $"insert into UserT values('{AdminID}','{Pwd}','{Name}');";int count = EditDate(insertSQL);if (count>0){Console.WriteLine($"新增成功,新增{count}条数据");}else{Console.WriteLine("新增数据失败");}}public static int EditDate(string sql){//连接数据库SqlConnection conn = new SqlConnection();//要连接的数据要操作的数据库文件 采用windows conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";conn.Open();SqlCommand cmd = new SqlCommand(sql, conn);int count = 0;try{count = cmd.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex);}conn.Close();return count;}
4.封装的删方法
static void Main(string[] args)
{string sql = "delete from UserT where AdminID ='222';";int count = EditDate(sql);if (count>0){Console.WriteLine($"删除成功,新增{count}条数据");}else{Console.WriteLine("删除数据失败");}}
public static int EditDate(string sql)
{//连接数据库SqlConnection conn = new SqlConnection();//要连接的数据要操作的数据库文件 采用windows conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";conn.Open();SqlCommand cmd = new SqlCommand(sql, conn);int count = 0;try{count = cmd.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex);}conn.Close();return count;}
5.封装查询方法
static void Main(string[] args)
{string sql = "delete from UserT where AdminID ='111';";int count = EditDate(sql);if (count>0){Console.WriteLine($"删除成功,新增{count}条数据");}else{Console.WriteLine("删除数据失败");}sql = "select * from UserT;";DataTable dt = SelectDate(sql);for (int i = 0; i < dt.Rows.Count;i++){Console.WriteLine($"{dt.Rows[i]["AdminID"]}{dt.Rows[i]["Pwd"]}{dt.Rows[i]["Name"]}");}Console.ReadKey();
}
public static int EditDate(string sql)
{//连接数据库SqlConnection conn = new SqlConnection();//要连接的数据要操作的数据库文件 采用windows conn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";conn.Open();SqlCommand cmd = new SqlCommand(sql, conn);int count = 0;try{count = cmd.ExecuteNonQuery();}catch (Exception ex){Console.WriteLine(ex);}conn.Close();return count;}
public static DataTable SelectDate(string sql)
{// 连接数据库SqlConnection conn = new SqlConnection();//要连接的数据 要操作的数据库文件采用windowsconn.ConnectionString = "Data Source=DESKTOP-TKS3EDJ\\TEW_SQLEXPRESS;Initial Catalog=TestDB;Integrated Security=True;Encrypt=False";conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = sql;SqlDataAdapter adapter = new SqlDataAdapter();adapter.SelectCommand = cmd;DataSet ds = new DataSet();adapter.Fill(ds);conn.Close();DataTable table = ds.Tables[0];return table;}