目录:
3.SqlCommand-查询单个值(ExecuteScalar)
1.如果要执行增删改和单个值查询的时候,可以直接让【车间工人】去【中央仓库】做。
2.如果要从【中央仓库】查询多行货物的时候,有两种方式:
2.1可以选择叫一辆【货运卡车】去搬,卡车可以一次性的都搬过来,但【生产车间】一下子用不了,所以卡车就把货先放在【车间临时仓库】,这样车间需要的时候直接拿就可以了。
2.2可以让【车间工人】把自己的【摩托车】拿来,骑【摩托车】去仓库拿货,但每次只能拿一行货物,所以需要往返的拿很多次才能拿完。但因为每次只拿一行货物过来,车间就直接使用了,不必存到【车间临时仓库】里。
1.SqlCommand-执行增删改
例题:
static void Main(string[] args) { Console.WriteLine("增加数据:"); string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine() AddRecord(ss); } public static void AddRecord(string Test) { int res = -1; //准别接收新增受影响行数
string sqlCon = @"Server=.\SQLEXPRESS;database=tangsansan;uid=sa;pwd=sa";
SqlConnection conn = newSqlConnection();
conn.ConnectionString = sqlCon;
string sqlstr = "insert into T_Category(FName) values ('"+ Test + "')";//values里面的string值需要''
SqlCommand cmd = newSqlCommand(sqlstr,conn);
conn.Open();
res = cmd.ExecuteNonQuery(); //负责返回受影响行数
conn.Close(); if(res>0)
{
Console.WriteLine("新增成功!~~");
}
else
{
Console.WriteLine("失败啦!");
}
}
2.SqlCommand-查询单个值(ExecuteScalar)
SqlCommand的ExecuteScalar方法用于执行查询,并返回查询所返回的结果集中第一行的第一列,因为不能确定返回值的类型,所以返回值是object类型
md.CommandText = "select count(*) from T_Users"; int i = Convert.ToInt32(cmd.ExecuteScalar())
cmd.CommandText = "select getdate()"; DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar());
例题
static void Main(string[] args) { //Console.WriteLine("增加数据:"); //string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine() //AddRecord(ss); QuerySingle(); } //查询单个值 public static void QuerySingle() { SqlConnection conn = new SqlConnection(sqlCon); string sqlstr = "select COUNT(*) from T_Category"; SqlCommand cmd = new SqlCommand(sqlstr, conn); conn.Open(); //用于执行查询,并返回查询所返回的结果集中第一行的第一列 object obj = cmd.ExecuteScalar(); conn.Close(); Console.WriteLine(obj.ToString()); }
3.SqlCommand-查询多行(ExecuteReader)
属性 | 说明 |
HasRows |
是否返回了结果 |
方法 |
说明 |
Read | 前进到下一行记录 |
Close |
关闭 DataReader 对象 |
执行查询
执行有多行结果集的用ExecuteReader
- SqlDataReader reader = cmd.ExecuteReader();...
while (reader.Read())
{
Console.WriteLine(reader.GetString(1));
}
- reader的GetString、GetInt32等方法只接受整数参数,也就是序号,用GetOrdinal方法根据列名动态得到序号
- 为什么用using。Close:关闭以后还能打开。Dispose:直接销毁,不能再次使用。using在出了作用域以后调用Dispose,SqlConnection、FileStream等的Dispose内部都会做这样的判断:判断有没有close,如果没有Close就先Close再Dispose。
例题:
static void Main(string[] args) { //Console.WriteLine("增加数据:"); //string ss = Convert.ToString(Console.ReadLine());//字符串使用Console.ReadLine() //AddRecord(ss); //QuerySingle(); QueryList(); } //查询多个值--DataReader,逐行读取 public static void QueryList() { SqlConnection conn = new SqlConnection(sqlCon); string sqlstr = "select * from T_Category"; SqlCommand cmd = new SqlCommand(sqlstr, conn); conn.Open(); //获取一个读取器对象SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows) { while (dr.Read()) { //Console.WriteLine(dr[0].ToString() + " " + dr[1].ToString()); Console.WriteLine(dr["FId"].ToString() + " " + dr["FName"].ToString()); } } else { Console.WriteLine("无属性"); } dr.Close();//关闭读取器 conn.Close(); }
4.SqlDataAdapter&数据集-查询多行
DataSet
SqlDataReader是连接相关的, SqlDataReader中的查询结果并不是放到程序中的,而是放在数据库服务器中,SqlDataReader只是相当于放了一个指针(游标),只能读取当前游标指向的行,一旦连接断开就不能再读取。这样做的好处就是无论查询结果有多少条,对程序占用的内存都几乎没有影响。
SqlDataReader对于小数据量的数据来说带来的只有麻烦,优点可以忽略不计。ADO.Net中提供了数据集的机制,将查询结果填充到本地内存中,这样连接断开、服务器断开都不影响数据的读取。
DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset);
SqlDataAdapter是DataSet和数据库之间沟通的桥梁。数据集DataSet包含若干表DataTable,DataTable包含若干行DataRow。foreach (DataRow row in dataset.Tables[0].Rows) row["Name"]。
例题:
//适配器读取Adapter public static void QueryListByAdapter() { SqlConnection conn = new SqlConnection(sqlCon); string sqlstr = "select * from T_Category"; //创建适配器对象,告诉它要做什么事情,走哪条路 SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, conn); //创建数据集对象(程序段的临时数据表) DataSet ds = new DataSet(); //调用Fill填充数据集 adapter.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[1].ToString()); } }