整个ADO包含两大部分:数据提供程序和数据集
NonQuery :非查询,只要影响行数
Scalar :查询出来的数据,只要第一行第一列
Reader:查询出来的数据,全部都要(所有行,所有列),大数据量的
不同:
DataSet:查询出来的数据,全部都要(所有行,所有列),比较小数据量的,因为 DataSet是一次新吧所有查询出来的数据全部都搬回 本地内存中
DataSet
把数据库查询过后的 结果集 拿到本地来存储在本地内存中,就变成了数据集。
DataSet=ds; DaTable=dt;DataRow=dra;DataColumn =dc
DataSet包含多个DaTable,DaTable被包含在DataSet 的DaTableCollection中
DataSet.DaTableCollection[0]--->DataTable。
DataTable包含多个DataColumn,DataColnumn被包含在DataTable的DataColumnCollection中。
DataTable包含多个DataRow ,DataRow被包含在DataTable 的DataRowCollection中。
SqlDataAdapter
相当于卡车的作用,自动的根据命令到数据库查询数据,并且拿回来,倒在零时的数据仓库(DataSet),不用手动打开数据库连接,不用手动创建命令对象,不用手动关闭连接通道.
简单的下拉菜单:
using System; using System.Data; using System.Windows.Forms; using Ado3; namespace FstuAdd { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void cbba_SelectedIndexChanged(object sender, EventArgs e) { MessageBox.Show(cbba.SelectedValue.ToString()); } private void Form1_Load(object sender, EventArgs e) { DataSet ds = SqlHelper.ExcuteDataSet("select * from Classes"); cbba.DisplayMember = "Name"; cbba.ValueMember = "id"; cbba.DataSource = ds.Tables[0]; } } }
Hepler类
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ado3 { class SqlHelper { static string contr = "server=PC201609230944\SQL2005;database=HeiMaBlog;user=sa;pwd=123456"; public static DataSet ExcuteDataSet(string sql) { using (SqlConnection conn = new SqlConnection(contr)) { using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn)) { using (DataSet ds = new DataSet()) { adapter.Fill(ds); return ds; } } } } } }
利用SqlSet自己建表
DataSet ds = new DataSet();//创建了一个 空 的数据集 DataTable dt = new DataTable();//创建一个空的数据表 ds.Tables.Add(dt);//将创建出来的表,添加到数据集的表集合中 DataColumn dc = new DataColumn();//创建一个列 dc.ColumnName = "id";//指定列名 dc.DataType = typeof(int);//指定列的类型 dc.AllowDBNull = false;//指定不能为null dc.Unique = true; //不能重复 dc.AutoIncrement = true;//自动增长 dc.AutoIncrementSeed = 100;//增长种子 dc.AutoIncrementStep = 10;//增量 dt.Columns.Add(dc);//把列添加到表中 DataColumn dcName = new DataColumn(); dcName.ColumnName = "Name"; dcName.DataType = typeof(string); dcName.AllowDBNull = false; dt.Columns.Add(dcName); //不能调用new,构造函数访问不到,被保护 //要询问数据表,你有什么列,告诉我,然后我就有什么列 DataRow dr = dt.NewRow(); dr[1] = "张三";//设置name dt.Rows.Add(dr);//添加到行集合中 DataRow dr2 = dt.NewRow(); dr2[0] = 1;//手动设置id dr2[1] = "李四"; dt.Rows.Add(dr2); //如果手动赋值了id列,就是手动赋值的值,如果不手动赋值,那么就跟着种子和增量走 DataRow dr3 = dt.NewRow(); dr3[1] = "张三2"; dt.Rows.Add(dr3); //打印数据集中有几张表 MessageBox.Show(ds.Tables.Count.ToString()); //打印第一张表有几个列 MessageBox.Show(ds.Tables[0].Columns.Count.ToString()); //打印第一张表有几行 MessageBox.Show(ds.Tables[0].Rows.Count.ToString()); //打印第一张表的第一行的第一列 MessageBox.Show(ds.Tables[0].Rows[0][0].ToString()); //打印第一张表的第二行的第一列 MessageBox.Show(ds.Tables[0].Rows[1][0].ToString()); //打印第一张表的第三行的第一列 MessageBox.Show(ds.Tables[0].Rows[2][0].ToString());
内部:其实也是有一个SqlCommand 对象的,通过命令对象返回DataReader,然后再通过读取器读取数据,填充数据集。
带有配置文件的省市联动:
主程序:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Ado3; namespace FssId { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { List<Area> list = SqlHelper.ExecuteList("select * from Area where ar_uid = 0"); cbba.DisplayMember = "Ar_name"; cbba.ValueMember = "Ar_id"; cbba.DataSource = list; } private void cbba_SelectedIndexChanged(object sender, EventArgs e) { SqlParameter sp = new SqlParameter("@uid",cbba.SelectedValue); List<Area> list = SqlHelper.ExecuteList("select * from Area where ar_uid = @uid",sp); cbbb.DisplayMember = "Ar_name"; cbbb.ValueMember = "Ar_id"; cbbb.DataSource = list; } } }
SqlHelper类
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using FssId; namespace Ado3 { class SqlHelper { // WinForm项目,添加对“System.Configuration”的引用 // 对配置文件connectionStrings节进行读取。 static string contr = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString; /// <summary> /// 查询数据库,返回一张表 /// </summary> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { DataSet ds = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(sql,contr); adapter.SelectCommand.Parameters.AddRange(parameters); try { adapter.Fill(ds); return ds.Tables[0]; } catch { return null; } } /// <summary> /// 输入参数更改 /// </summary> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(contr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(parameters); conn.Open(); // 这个的报错不用捕捉 return cmd.ExecuteNonQuery(); } } } /// <summary> /// 查询 /// </summary> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static object ExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(contr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(parameters); conn.Open(); return cmd.ExecuteScalar(); } } } /// <summary> /// 针对某个类,进行SqlDataReader读取 /// </summary> /// <param name="sql"></param> /// <param name="parameters"></param> /// <returns></returns> public static List<Area> ExecuteList(string sql, params SqlParameter[] parameters) { List<Area> list = null; using(SqlConnection conn = new SqlConnection(contr)) { using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(parameters); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); if (dr.HasRows) { list = new List<Area>(); Area ar; while (dr.Read()) { ar = new Area(); ar.Ar_id = dr.GetInt32(0); ar.Ar_name = dr[1].ToString(); ar.Ar_uid = dr.GetInt32(2); list.Add(ar); } } } } if (list != null) { return list; } else { return null; } } } }
Area类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FssId { class Area { int ar_id; public int Ar_id { get { return ar_id; } set { ar_id = value; } } string ar_name; public string Ar_name { get { return ar_name; } set { ar_name = value; } } int ar_uid; public int Ar_uid { get { return ar_uid; } set { ar_uid = value; } } } }
App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name ="constr" connectionString="server=PC201609230944SQL2005;database=HeiMaBlog;user=sa;pwd=123456"/> </connectionStrings> </configuration>
数据库
配置文件:
每个程序保存一些信息的文件,开发的时候,winfrom的名字叫app.config。
WebForm的web.config。
在winform程序被编译之后,这个文件会变成“程序名.config”。
在configuration节点里面添加一个connectionStrings节点,再里面添加一个add节点。