在连接数据库之后便需要进行增删改查,ADO.net(数据访问技术)是将C#和MSSQL连接起来的一个纽带。
用ADO.net对数据库进行访问需要引用一个类 using System,通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用所有数据访问技术的基础,连接数据库基本格式:
需要两个类
1、数据库连接类 SqlConnection
2、数据库操作类 SqlCommand
1、连接数据库
写连接字符串,立马就要想到有4点要写完,1、连接哪台服务器,2、连接哪个数据库,3、连接用户名,4、密码
string sql = "server=.;database=Data0720;user=sa;pwd=123;"; //编写连接字符串
实例化数据连接类,将连接字符串写到构造函数中,让这个类构造完毕后就连接到指定的服务器和数据库上
SqlConnection conn = new SqlConnection(sql);
2、设置要对数据库中的表的操作
//通过已经连接的数据库创建一个对此库的操作类
SqlCommand cmd = conn.CreateCommand();
//编写TSQL语句
cmd.CommandText = "delete from Users where UserName='" + Uname + "'";
3、执行操作
conn.Open(); //数据库连接打开
cmd.ExecuteNonQuery(); //数据库操作执行
conn.Close();//数据库连接关闭
ADO.NET数据库操作图
数据库连接语句
[csharp] view plain copystatic string sqlCon = @"server =.;database=strike;Integrated Security=True";
[csharp] view plain copy///
/// 连接测试
///
private static void TestConnection()
{
//string conStr = @"server=.;database=strike;Integrated Security=True;";
SqlConnection conn = new SqlConnection(sqlCon);
conn.Open();
conn.Close();
Console.WriteLine("连接对象新建成功。");
Console.ReadKey();
}
1增删改
增删改都是类似的操作,使用SqlCommand进行,
都是执行非查询语句ExecuteNonQuery()进行数据库操作,只是sql语句有点不同。
新增记录
[csharp] view plain copy///
/// 新增记录
///
public static void AddRecord()
{
int res = -1;
//string sqlCon = "server =.;database=strike;Integrated Security=True";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = sqlCon;
string b_title = "标";
string b_content = "容";
string b_author = "作";
string addtime = "2011-11-11";
int b_cid = 102;
string sqlStr2 = string.Format("insert book(b_cid,b_title,b_content,b_author,b_isdel,b_addtile,b_money) values({0},'{1}','{2}','{3}',0,'{4}',10)", b_cid, b_title, b_content, b_author, addtime);
string sqlStr = "insert book(b_cid,b_title,b_content,b_author,b_isdel,b_addtile,b_money) values(103,'dsf','dfdf','dfd',0,'2011-11-11',10)";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStr2;
conn.Open();
res = cmd.ExecuteNonQuery();
conn.Close();
if (res > 0)
{
Console.WriteLine("受影响" + res);
}
}
删除数据
[csharp] view plain copy///
/// 删除数据
///
public static void DelRecord()
{
int res = -1;
//string sqlCon = "server =.;database=strike;Integrated Security=True";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = sqlCon;
string sqlStr = "delete book where b_id=18";
SqlCommand cmd = new SqlCommand(sqlStr, conn);
conn.Open();
res = cmd.ExecuteNonQuery();
conn.Close();
if (res > 0)
{
Console.WriteLine(res + "行受影响");
}
}
更新操作
[csharp] view plain copy///
/// 软删除
///
public static void SoftDelRecord()
{
int res = -1;
// string sqlCon = @"server =.;database=strike;Integrated Security=True";
SqlConnection conn = new SqlConnection();
conn.ConnectionString = sqlCon;
string sqlStr = "update book set b_isdel=1 where b_cid=103";
SqlCommand cmd = new SqlCommand(sqlStr, conn);
conn.Open();
res = cmd.ExecuteNonQuery();
conn.Close();
if (res > 0)
{
Console.WriteLine(res + "行受影响");
}
}
2.查询操作
1)SqlCommand查询单个值
用ExecuteScalar()方法 ,返回单个值(Object)(查询结果第一行第一列的值)
[csharp] view plain copypublic static void QuerySingle()
{
SqlConnection conn = new SqlConnection(sqlCon);
string sqlStr = "select * from book";
SqlCommand cmd = new SqlCommand(sqlStr, conn);
conn.Open();
//返回的是查询结果集第一单元格的值,返回的是object类型
object obj = cmd.ExecuteScalar();
conn.Close();
Console.WriteLine(obj.ToString());
}
2)SqlCommand查询多行
用ExecuteReader()方法
[csharp] view plain copy///
/// 查询多行数据---DataReader逐行读取,每次读一行
///
public static void QueryList()
{
SqlConnection con = new SqlConnection(sqlCon);
string sqlStr = "select * from book";
SqlCommand cmd = new SqlCommand(sqlStr, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())//dr每read()一次就读取一行
{
//read()后,dr就是一行数据
object o = dr["b_title"];
for (int i = 0; i < dr.FieldCount; i++)
{
Console.Write(dr[i].ToString() + "\t");
int a = dr.GetInt32(0);
}
Console.Write("\n");
}
// Console.WriteLine("有数据");
}
else
{
Console.WriteLine("无数据");
}
}
3)使用适配器读取数据
[csharp] view plain copypublic static void QueryListByAdapter()
{
SqlConnection conn = new SqlConnection(sqlCon);
string sqlStr = "select * from book";
//创建适配器对象,高数它要做些什么事情,走哪条路去
SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
// SqlDataAdapter da = new SqlDataAdapter();
//创建数据集对象(程序的临时数据库)
DataSet ds = new DataSet();
DataTable dt1 = new DataTable();
//调用fill方法,填充数据集。
da.Fill(dt1);
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"].ToString());
}
}
4)调用存储过程
[csharp] view plain copypublic static void QueryListByProc2()
{
string sqlCon = "server=.;database=strike;Integrated Security=True;";
SqlConnection conn = new SqlConnection(sqlCon);
SqlCommand cmd = new SqlCommand("uspo_GetPageBooks", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter[] paras ={
new SqlParameter("@pageIndex",SqlDbType.Int,4),
new SqlParameter("@pageSize",SqlDbType.Int,4)
};
paras[0].Value = 1;
paras[1].Value = 3;
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());
}
查询基本格式:
//数据库连接类(连接字符串)
SqlConnection conn = new SqlConnection("server=.;database=Data0720;user=sa;pwd=123");
//数据库操作类,通过上面的连接类构建出来
SqlCommand cmd = conn.CreateCommand();
//查询语句
cmd.CommandText = "select *from Users";
conn.Open();//数据库连接开启SqlDataReader dr = cmd.ExecuteReader();//调用此方法用来查询 !!!!
//每执行一次这个方法,指针就向下走一行,读取下面一行的数据,如果下面没有数据了,那么会返回一个false
while (dr.Read())
{
//如果读出来数据,那么当前读到的这一行数据就放在dr这个对象里,可以使用两种方式将数据取出来
//1、使用索引 - dr[索引值]
Console.WriteLine(dr[0] + " " + dr[1] + " " + dr[2] + " " + (((bool)dr[3]) ? "男" : "女") + " " + Convert.ToDateTime(dr[4]).ToString("yyyy年MM月dd日") + " " + dr[5]);
//2、使用列名 - dr["列名"]
Console.WriteLine(dr["UserName"] + " " + dr["Nation"]);
}
conn.Close();//数据库连接关闭
//数据库中存放的数据并不一定能够直接拿出来给用户看,那么就需要C#段将数据加工以后,再展现出来