黑马程序员---ADO.NET基础之增删改查等代码示例
ADO.NET提供了程序到数据库的增删改查操作,通过几大对象的方法进行实现,下面是学习中总结的代码:
//server 指定要连接的数据库所在的服务器IP;database 要连接的数据库;windows集成身份验证=true
static string conStr = @"server=.;database=SimpleArticle;Integrated Security=True;";
#region 1.测试连接通道
/// <summary>
/// 测试连接通道
/// </summary>
public static void TestConnection()
{
//1.连接通道的连接字符串
//string conStr = @"server=.;database=SimpleArticle;Integrated Security=True;";
//2.连接通道对象
SqlConnection conn = new SqlConnection(conStr);
//3.打开通道
conn.Open();
//4.关闭通道
conn.Close();
//SqlConnection conn2 = new SqlConnection();
//conn2.ConnectionString = conStr;
Console.WriteLine("连接对象新建操作成功~~~~:)");
}
#endregion
#region 2.新增记录
/// <summary>
/// 新增记录
/// </summary>
public static void AddRecord()
{
int res = -1;//准备接受新增受影响的行数
string sqlCon = "server=.;database=SimpleArticle;Integrated Security=True;";
//1.新建连接通道
SqlConnection conn = new SqlConnection();
//2.手动为连接通道对象指定连接字符串
conn.ConnectionString = sqlCon;
//3.准备新增的sql命令
string sqlStr = "insert into Book(b_cid,b_title,b_content,b_author,b_money,b_isdel) values(2,'没有控件的ASP.NET','内容','未知',10,0)";
//4.新建命令对象(工人),并且告诉他要走哪条路(conn)去做什么事情(sqlStr)
SqlCommand cmd = new SqlCommand(sqlStr, conn);
//cmd.CommandText = sqlStr;
//cmd.Connection = conStr;
//5.打开连接通道
conn.Open();
//6.调用方法去数据库执行sql语句
res = cmd.ExecuteNonQuery();//执行非查询语句,此方法负责 增删改,返回受影响行数(int)
//7.关闭连接通道
conn.Close();
if (res > 0)
{
Console.WriteLine("新增成功啦~~:)");
}
else
{
Console.WriteLine("新增失败啦~~:(");
}
}
#endregion
#region 3.删除记录
/// <summary>
/// 删除记录
/// </summary>
public static void DelRecord()
{
int res = -1;//准备接受新增受影响的行数
string sqlCon = "server=.;database=SimpleArticle;Integrated Security=True;";
//1.新建连接通道
SqlConnection conn = new SqlConnection(sqlCon);
//3.准备新增的sql命令
string sqlStr = "delete book where b_id=34";
//4.新建命令对象(工人),并且告诉他要走哪条路(conn)去做什么事情(sqlStr)
SqlCommand cmd = new SqlCommand(sqlStr, conn);
//5.打开连接通道
conn.Open();
//6.调用方法去数据库执行sql语句
res = cmd.ExecuteNonQuery();//此方法负责 增删改,返回受影响行数(int)
//7.关闭连接通道
conn.Close();
if (res > 0)
{
Console.WriteLine("删除成功啦~~:)");
}
else
{
Console.WriteLine("删除失败啦~~:(");
}
}
#endregion
#region 4.软删除记录 -- 更新语句
/// <summary>
/// 软删除记录
/// </summary>
public static void SoftDelRecord()
{
int res = -1;//准备接受新增受影响的行数
string sqlCon = "server=.;database=SimpleArticle;Integrated Security=True;";
//1.新建连接通道
SqlConnection conn = new SqlConnection();
//2.手动指定连接字符串
conn.ConnectionString = sqlCon;
//3.准备新增的sql命令
string sqlStr = "update book set b_isdel=1 where b_cid=2";//删除是true(1),没删除是false(0)
//4.新建命令对象(工人),并且告诉他要走哪条路(conn)去做什么事情(sqlStr)
SqlCommand cmd = new SqlCommand(sqlStr, conn);
//5.打开连接通道
conn.Open();
//6.调用方法去数据库执行sql语句
res = cmd.ExecuteNonQuery();//此方法负责 增删改,返回受影响行数(int)
//7.关闭连接通道
conn.Close();
if (res > 0)
{
Console.WriteLine("软删除记录成功啦~~:)");
}
else
{
Console.WriteLine("软删除记录失败啦~~:(");
}
}
#endregion
#region 5.查询单个值
/// <summary>
/// 5.查询单个值
/// </summary>
public static void QuerySingle()
{
SqlConnection con = new SqlConnection(conStr);
//string sqlStr = "select count(*) from Book";
string sqlStr = "select * from Book";
SqlCommand cmd = new SqlCommand(sqlStr, con);
con.Open();
//调用此方法,获得查询语句在数据库执行后得到的结果集的第一个单元格的值,返回类型是object
object obj = cmd.ExecuteScalar();
con.Close();
Console.WriteLine(obj.ToString());
}
#endregion
//6.查询多行数据
//数据读取器通过连接通道在数据库中维护一个结果集,每次执行Read()方法去数据库的这个结果集中拿取下一行数据
#region 6.1查询多行数据--DataReader,逐行读取,通过下标访问列
/// <summary>
/// 6.1查询多行数据--DataReader,逐行读取,通过下标访问列
/// </summary>
public static void QueryListByDrIndex()
{
SqlConnection con = new SqlConnection(conStr);
string sqlStr = "select * from Book";
SqlCommand cmd = new SqlCommand(sqlStr, con);
con.Open();
//调用此方法 获得一个 读取器对象
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)//如果结果集有数据行,则为true,否则为false
{
while (dr.Read())//read方法,如果读到下一行数据,则返回true,而且dr本身就等于那一行数据
{
Console.WriteLine(dr[0].ToString() + "_" + dr[1].ToString() + "_" + dr[2].ToString());
}
}
else Console.WriteLine("无数据");
dr.Close();//关闭读取器
con.Close();//关闭连接通道
}
#endregion
#region 6.1查询多行数据--DataReader,逐行读取,通过结果集的列名访问数据
/// <summary>
/// 6.1查询多行数据--DataReader,逐行读取,通过结果集的列名访问数据
/// </summary>
public static void QueryListByColName()
{
SqlConnection con = new SqlConnection(conStr);
string sqlStr = "select * from Book";
SqlCommand cmd = new SqlCommand(sqlStr, con);
con.Open();
//调用此方法 获得一个 读取器对象
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())//read方法,如果读到下一行数据,则返回true,而且dr本身就等于那一行数据
{
Console.WriteLine(dr["b_id"].ToString() + "_" + dr["b_title"].ToString() + "_" + dr["b_cid"].ToString());
}
}
else Console.WriteLine("无数据");
dr.Close();
con.Close();
}
#endregion
#region 6.3查询多行数据--DataReader,逐行读取,通过结果集的列名访问数据
/// <summary>
/// 6.3查询多行数据--DataReader,逐行读取,通过Get—方法
/// </summary>
public static void QueryListByGet()
{
SqlConnection con = new SqlConnection(conStr);
string sqlStr = "select * from Book";
SqlCommand cmd = new SqlCommand(sqlStr, con);
con.Open();
//调用此方法 获得一个 读取器对象
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())//read方法,如果读到下一行数据,则返回true,而且dr本身就等于那一行数据
{
Console.WriteLine(dr.GetInt32(0) + "_{0}_" + dr.GetString(2) + "_" + dr.GetInt32(1),"占位符");
//object o = dr.GetValue(0);//以object方式拿出数据
//Console.WriteLine(o.ToString());
//dr.GetOrdinal("b_cid");//传入列名,找到它在结果集中的下标
}
}
else Console.WriteLine("无数据");
dr.Close();
con.Close();
}
#endregion
//7.使用适配器读取数据
#region 7.1使用适配器填充数据集
/// <summary>
/// 7.1使用适配器填充数据集
/// </summary>
public static void QueryListByAdapter()
{
SqlConnection conn = new SqlConnection(conStr);
string sqlStr = "select * from book";
//创建适配器对象,告诉它要做什么事情,走哪条路去
SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);//不需要代码打开和关闭连接通道
//创建数据集对象(程序端的临时数据库)
DataSet ds = new DataSet();
//调用fill方法,填充数据集。(先去数据库查询结果集,并把结果集返回赋值给数据集。)
da.Fill(ds);
//获得数据集中的第一张表
DataTable dt = ds.Tables[0];
//循环数据表中的每一行
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];//将循环到的行拿出来给dr对象
//通过下标获得者一行的某列的值
Console.WriteLine(dr[0].ToString() + " __ " + dr["b_title"]);
}
}
#endregion
//7.2使用适配器填充数据表
#region 7.2使用适配器填充数据表
/// <summary>
/// 7.2使用适配器填充数据表
/// </summary>
public static void QueryListByAdapter2()
{
SqlConnection conn = new SqlConnection(conStr);
string sqlStr = "select * from book";
//创建适配器对象,告诉它要做什么事情,走哪条路去
SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);//不需要代码打开和关闭连接通道
//创建数据表对象
DataTable dt = new DataTable();
//调用fill方法,填充数据集。(先去数据库查询结果集,并把结果集返回赋值给数据集。)
da.Fill(dt);
//循环数据表中的每一行
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];//将循环到的行拿出来给dr对象
//通过下标获得者一行的某列的值
Console.WriteLine(dr[0].ToString() + " __ " + dr["b_title"]);
}
}
#endregion
//8.调用存储过程
//8.1调用存储过程
public static void QueryListByProc()
{
SqlConnection conn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("usp_GetBookByCateId",conn);
cmd.CommandType = CommandType.StoredProcedure;//指定 命令类型 为 存储过程
SqlParameter sp = new SqlParameter();//指定 存储过程 中的 参数
sp.ParameterName = "@cateId";
sp.SqlDbType = SqlDbType.Int;
//sp.Size=4;
sp.Value = 2;
cmd.Parameters.Add(sp);//将 参数 对象 加入到命令对象的参数集合中
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr[0].ToString() + " __ "+dr[1].ToString() + " __ " + dr["b_title"]);
}
}
//8.1.1调用含多个参数的存储过程
#region 8.1.1调用含多个参数的存储过程
/// <summary>
/// 8.1.1调用含多个参数的存储过程
/// </summary>
public static void QueryListByProc2()
{
string sqlCon = "server=.;database=SimpleArticle;Integrated Security=True;";
SqlConnection conn = new SqlConnection(sqlCon);
SqlCommand cmd = new SqlCommand("proGetPageData", conn);
cmd.CommandType = CommandType.StoredProcedure;//指定作为存储过程执行
//SqlParameter p = new SqlParameter("@aa", SqlDbType.Int);
//SqlParameter p = new SqlParameter("@aa", 8);
SqlParameter[] paras ={
new SqlParameter("@pageIndex", SqlDbType.Int,4),
new SqlParameter("@pageSize", SqlDbType.Int,4)
};
paras[0].Value = 1;//设置搜索第1页
paras[1].Value = 3;//设置每页显示3条
cmd.Parameters.AddRange(paras);//为cmd对象添加 参数数组
SqlDataAdapter da = new SqlDataAdapter(cmd);//创建 适配器
DataTable dt = new DataTable();//创建 数据表(程序端)
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr[0].ToString() + " -- " + dr[1].ToString() + " -- " + dr[2].ToString());
}
}
#endregion
//8.2调用带输出参数存储过程
#region 8.2调用带输出参数存储过程
/// <summary>
/// 8.2调用带输出参数存储过程
/// </summary>
public static void QueryListProc3()
{
SqlConnection conn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand("proGetPageData2", conn);
cmd.CommandType = CommandType.StoredProcedure;//指定为存储过程
SqlParameter[] paras ={
new SqlParameter("@pageIndex",SqlDbType.Int),
new SqlParameter("@pageSize",SqlDbType.Int),
new SqlParameter("@pageCount",SqlDbType.Int),
new SqlParameter("@rowCount",SqlDbType.Int)
};
paras[0].Value = 2;//页码
paras[1].Value = 2;//页容量
paras[2].Direction = ParameterDirection.Output;//设置参数的输出方向
paras[3].Direction = ParameterDirection.Output;//设置参数的输出方向
cmd.Parameters.AddRange(paras);//讲参数加入命令对象
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr[0].ToString() + " -- " + dr[1].ToString() + " -- " + dr[2].ToString());
}
int pageCount = Convert.ToInt32(cmd.Parameters[2].Value);
int rowCount = Convert.ToInt32(cmd.Parameters[3].Value);
Console.WriteLine("pageCount=" + pageCount + ",rowCount=" + rowCount);
}
#endregion