ADO.NET连接操作SQLServer数据库
本文章从简单的c#连接数据到基础增删改查数据库,最后进行了封装复用在实际开发中具有很大的帮助(所有代码均可复制)
一、简述基础
1、连接数据库的四个条件
- 服务器名称:计算机名称(默认实例)、计算机名称\命名实例。
- 具体数据库:数据库名称。
- 登录名:学习中一般采用sa即可。
- 密码:sa账号的密码。
2、SQLServer身份验证字符串格式
Server=服务器名称;DataBase=数据库名称;User ID=登录账号;Password=登录密码
其中User ID可以简化成Uid,Password简化成Pwd。
默认实例的服务器名称=计算机名称(也可以把“计算机名称”用“.”来代替)
命名实例的服务器名称=计算机名称\\实例名称(右斜杠“\”在C#中必须用“\\”来转义)
示例如下:
//默认实例:“计算机名”
private string connString1 = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=123456";
//默认实例:“.”
private string connString2 = "Server=.;DataBase=MISDB;Uid=sa;Pwd=123456";
//命名实例:双右斜杠\\
private string connString3 = "Server=TSSIS001\\SQLEXPRESS;DataBase=MISDB;Uid=sa;Pwd=123456";
//命名实例:使用@
private string connString4 = @"Server=TSSIS001\SQLEXPRESS;DataBase=MISDB;Uid=sa;Pwd=123456";
3、Windows身份验证字符串格式
DataSource=服务器名称;Initial Catalog=数据库名称;Inregrated Security=True
示例如下:
//使用Windows身份验证
private string connString5 = "DataSource=.; Initial Catalog=MISDB; Integrated Security=True";
4、SqlConnection连接对象
连接的四个经典步骤:
- 引入命名空间System.Data.SqlClient 和 System.Data。
- 定义连接字符串。
- 创建连接对象。
- 打开和关闭连接对象
示例如下:
public class ConnSql
{
//连接字符串
private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
public void Conn()
{
//[1]创建Connection对象
SqlConnection conn = new SqlConnection(connString);
//[2]打开连接
conn.Open();
if(conn.State == ConnectionState.Open)
{
Console.WriteLine("成功连接");
}
//[3]关闭连接
conn.Close();
if(conn.State == ConnectionState.Closed)
{
Console.WriteLine("成功关闭");
}
}
}
二、ADO.NET 增、删、改、查 操作
1、Command对象的两个属性
作用:Command对象用于封装要执行的SQL语句,并发送给数据库;同时命令数据库执行;根据SQL语句类型区分对应的操作、调用不同方法,返回不同的结果。
常用属性1:CommandText用来封装要执行的SQL语句。
常用属性2:Connection用来关联连接对象SqlConnection。
2、ExecuteNonQuery()方法
中文意思是:执行非查询。这个方法可以执行 insert、update、delete类型的SQL语句。方法返回结果是“受影响的行数”。
示例如下:
public void Insert()
{
//连接字符串
private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
//[1]创建连接对象
SqlConnection conn = new SqlConnection(connString);
//[2]定义SQL语句
string sql = "insert into Employee(EmployeeName, Gender,NowAddress,)values('Kiter21','男','天津')";
//[3]创建Command对象
SqlCommand cmd = new SqlCommand(sql, conn);
//方式二
//SqlCommand cmd = new SqlCommand();
//cmd.CommandText = sql;
//cmd.Connection = conn;
//[4]打开连接
conn.Open();
//[5]执行操作
int result = cmd.ExecuteNonQuery();
Console.WriteLine("受影响的行数:" + result);
//[6]关闭连接
conn.Close();
}
修改和删除的实现如下:
public void Update()
{
//连接字符串
private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
//[1]创建连接对象
SqlConnection conn = new SqlConnection(connString);
//[2]定义SQL语句
string sql = "update Employee set EmployeeName='Kiter22' where EmployeeId=1011";
//[3]创建Command对象
SqlCommand cmd = new SqlCommand(sql, conn);
//[4]打开连接
conn.Open();
//[5]执行操作
int result = cmd.ExecuteNonQuery();
Console.WriteLine("受影响的行数:" + result);
//[6]关闭连接
conn.Close();
}
public void Delete()
{
//连接字符串
private string connString = "Server=TSSIS001;DataBase=MISDB;Uid=sa;Pwd=153153";
//[1]创建连接对象
SqlConnection conn = new SqlConnection(connString);
//[2]定义SQL语句
string sql = "delete from Employee where EmployeeId=1011";
//[3]创建Command对象
SqlCommand cmd = new SqlCommand(sql, conn);
//[4]打开连接
conn.Open();
//[5]执行操作
int result = cmd.ExecuteNonQuery();
Console.WriteLine("受影响的行数:" + result);
//[6]关闭连接
conn.Close();
}
3、ExecuteScalar()方法
中文意思:执行单一结果查询。执行后返回单行、单列的查询结果。
示例如下:
public void GetSingleResult()
{
SqlConnection conn = new SqlConnection(connString);
string sql = "select EmployeeName from Employee where EmployeeId=1001";
SqlCommand sqlCommand = new SqlCommand(sql, conn);
conn.Open();
object result = sqlCommand.ExecuteScalar();
conn.Close();
Console.WriteLine(result);
}
此方法还有一个特别的地方,它可以执行一个insert、update、delete类型的SQL语句,同时返回标识列的值,使用这个方法是最好的选择。
示例如下:
public void DoInsertAndGetSingleResult()
{
SqlConnection conn = new SqlConnection(connString);
string sql = "insert into Employee(EmployeeName, Gender, NowAddress,)values('Kiter21','男','天津')";
sql += ";select @@identity";
SqlCommand sqlCommand = new SqlCommand(sql, conn);
conn.Open();
object result = sqlCommand.ExecuteScalar();
conn.Close();
Console.WriteLine(result);
}
4、ExcuteReader()方法
此方法可以返回多行多列的数据,也就是常说的数据列表。
注意:ExcuteReader()方法返回一个DataReader对象,在没有读取完毕之前,数据库的连接对象Connection始终是Opend状态,不能关闭。
DataReader对象提供了多个结果集的读取方法,默认第一次读取就用第一个结果集;当第一个读取完毕后,可通过NextResult()方法判断是否还有下一个结果集。
示例如下:
public void GetReaderList()
{
SqlConnection conn = new SqlConnection(connString);
string sql = "select EmployeeName, Gender from Employee";
sql += ";select * from Department";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataReader readData = cmd.ExecuteReader();
while (readData.Read())
{
Console.WriteLine(readData["EmployeeName"].ToString()+"\t"+readData["Gender"].ToString());
}
if (readData.NextResult())
{
while (readData.Read())
{
Console.WriteLine(readData[0] + "\t" + readData[1]);
}
}
readData.Close();
conn.Close();
}
5、DateSet数据集的使用
其实把DataSet可以直接理解成“内存数据库”。也就是一个DataSet中可以包含很多查询结果的数据表,并且这些数据表结果中不仅仅是数据,还包括表的结果,甚至表之间的各种关系也能查询出来。其特点如下:
第一、可以将查询结果“一次性的”读取到客户机的内存中,然后根据需要可以提取。
第二、可以在DataSet中去修改表的数据,然后更新到实体数据库(实际开发不建议采用)。
第三、可以为“代码生成器这类开发工具”的编写提供数据表的结构。
第四、作为数据展示非常方便。
DataSet是可以同时对多个结果集操作的,如下实例:
public void getDataSet()
{
SqlConnection conn = new SqlConnection(connString);
string sql = "select * from Employee";
SqlCommand cmd = new SqlCommand(sql, conn);
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "Employee");//填充数据[第一个查询结果集]
cmd.CommandText = "select * from Department";//封装第二查询
adapter.Fill(ds, "Department");//填充数据[第二个查询结果集]
conn.Close();
DataTable dt1 = ds.Tables["Employee"];
foreach (DataRow dr in dt1.Rows)
{
Console.WriteLine(dr["EmployeeName"] + "\t" + dr["Gender"]);
}
DataTable dt2 = ds.Tables["Department"];
foreach (DataRow dr in dt2.Rows)
{
Console.WriteLine(dr["DepartmentId"]);
}
}
三、方法封装复用
1、App.config文件配置连接字符串
打开配置文件,在<configuration>节点中添加一个新的数据库连接字符串:
特别说明:在配置文件中,命名实例的右斜杠不能用两个,只用一个。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<connectionStrings>
<add name="connString" connectionString="Server=TSSIS001\SQLTEST;DataBase=MISDB;Uid=sa;Pwd=153153"/>
</connectionStrings>
</configuration>
2、App.config配置节点读取
在项目引用中,添加System.configuration这个引用。
找到“程序集”选项卡,然后把“System.configuration”引用对勾选上,确认。
3、封装SqlHelper通用类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace HeatingControlProject
{
//数据库通用数据访问类
public class SqlHelper
{
//读取配置文件获得连接字符串
private static string connString =
ConfigurationManager.ConnectionStrings["connString"].ToString();
/// <summary>
/// 执行非查询操作
/// </summary>
/// <param name="cmdText">sql语句</param>
/// <param name="param">Sql语句参数</param>
/// <returns></returns>
public static int ExecuteNonQuery(string cmdText,SqlParameter[] param=null)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(cmdText, conn);
if (param != null)
{
cmd.Parameters.AddRange(param);
}
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw new Exception("ExecuteNonQuery()异常:" + ex.Message);
}
finally //以上不管是否发生异常,都会执行的代码
{
conn.Close();
}
}
/// <summary>
/// 返回单一结果查询
/// </summary>
/// <param name="cmdText">SQL语句或存储过程名称</param>
/// /// <param name="param">Sql语句参数</param>
/// <returns>返回单行单列</returns>
/// <exception cref="Exception"></exception>
public static object ExecuteScalar(string cmdText, SqlParameter[] param = null)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(cmdText, conn);
if (param != null)
{
cmd.Parameters.AddRange(param);
}
try
{
conn.Open();
return cmd.ExecuteScalar();
}
catch (Exception ex)
{
throw new Exception("ExecuteScalar()异常:" + ex.Message);
}
finally
{
conn.Close();
}
}
/// <summary>
/// 返回只读结果集的查询
/// </summary>
/// <param name="cmdText"></param>
/// <param name="param">Sql语句参数</param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string cmdText, SqlParameter[] param = null)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(cmdText, conn);
if (param != null)
{
cmd.Parameters.AddRange(param);
}
try
{
conn.Open();
//必须添加这个枚举
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{
throw new Exception("ExecuteReader()异常:" + ex.Message);
}
}
/// <summary>
/// 返回一个DataSet内存数据集的查询
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="tableName">数据表名称</param>
/// <param name="param">Sql语句参数</param>
/// <returns></returns>
public static DataSet GetDataSet(string sql, string tableName = null, SqlParameter[] param = null)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
if (param != null)
{
cmd.Parameters.AddRange(param);
}
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
conn.Open();
if (tableName == null)
da.Fill(ds);
else
da.Fill(ds, tableName);
return ds;
}
catch (Exception ex)
{
throw new Exception("GetDataSet()异常:" + ex.Message);
}
finally
{
conn.Close();
}
}
/// <summary>
/// 返回Dataset结果集带有表名称
/// </summary>
/// <param name="dic">[表名称][sql语句]</param>
/// <returns></returns>
public static DataSet GetDataSet(Dictionary<string,string> dic)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlDataAdapter adapter= new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
try
{
conn.Open();
foreach (string key in dic.Keys)
{
cmd.CommandText = dic[key];
adapter.Fill(ds,key);
}
return ds;
}
catch (Exception ex)
{
throw new Exception("GetDataSet(Dictionary<string,string> dic)"+ex.Message);
}
finally
{
conn.Close();
}
}
}
}
更多推荐
所有评论(0)