ADO.NET-数据库操作
一、连接数据库
关于SqlConnection类,MSDN中有详细解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.aspx
(1)直接在VS中创建数据库
static void Main(string[] args) { string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("Data Directory", dataDir); } SqlConnection conn = new SqlConnection(@"Data source=.\SQLEXPRESS; AttachDBFilename=|DataDirectory|\Database2.mdf;Integrated Security=True;User Instance=True"); conn.Open(); Console.WriteLine("数据库连接成功"); Console.ReadLine(); }
(2)连接到SQL Server上
string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; SqlConnection myConn = new SqlConnection(); myConn.Open();
二、与数据库交互
(1)使用SqlCommand提交命令
SqlCommand类在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.aspx
using(SqlConnection myConn=new SqlConnection(connectionText)) { myConn.Open(); string updateCmdText = "update student set stuName='"+txtStuName.Text.Trim()+"' where stuNumber='"+txtStuNumber.Text.Trim()+"'"; SqlCommand cmd = new SqlCommand(updateCmdText,myConn); //如果不添加 cmd.ExecuteNonQuery();好像提交不到数据库中,查查为什么! cmd.ExecuteNonQuery(); MessageBox.Show("更新成功!"); }
(2)使用DataAdapter提交命令
SqlDataAdapter类在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.aspx
private static DataSet SelectRows(DataSet dataset, string connectionString,string queryString) { using (SqlConnection connection = new SqlConnection(connectionString)) { SqlDataAdapter adapter = new SqlDataAdapter(); adapter.SelectCommand = new SqlCommand( queryString, connection); adapter.Fill(dataset); return dataset; } }
其中SqlDataAdapter包含有:SelectCommand、InsertCommand、DeleteCommand、Fill
三、管理内存数据
当完成对数据库的查询后,需要把所获得的数据保留下来,ADO.NET使用数据集对象在内存中缓存结果数据。
(1)使用DataTable实现内存表
DataTable在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.datatable.aspx
DataTable:数据表
DataCloumn:数据列
DataRow:数据行
Constraint:约束
DataRelation:关系
private void btnCreateAndShow_Click(object sender, EventArgs e) { //首先声明一个DataTable DataTable myDT = new DataTable("StudentInfo"); //生成学号列,并放入DataTable中 DataColumn myDCStuNumber = new DataColumn(); //设置学号列的数据类型Int32 myDCStuNumber.DataType = System.Type.GetType("System.Int32"); //设置学号的列名为学号 myDCStuNumber.ColumnName = "学号"; myDT.Columns.Add(myDCStuNumber); //生成姓名列,并放入DataTable中 DataColumn myDTStuName = new DataColumn(); //设置姓名列的数据类型为String类型 myDTStuName.DataType = System.Type.GetType("System.String"); //设置姓名列的列名为姓名 myDTStuName.ColumnName = "姓名"; myDT.Columns.Add(myDTStuName); //设置学号列作为DataTable主键 DataColumn [] PrimaryKeyColumns=new DataColumn[1]; PrimaryKeyColumns[0]=myDT.Columns["学号"]; myDT.PrimaryKey = PrimaryKeyColumns; //向DataTable中插入数据 DataRow myDR1 = myDT.NewRow(); myDR1["学号"] = 2010181001; myDR1["姓名"] = "春天"; myDT.Rows.Add(myDR1); DataRow myDR2 = myDT.NewRow(); myDR2["学号"] = 2010181002; myDR2["姓名"] = "夏天"; myDT.Rows.Add(myDR2); DataRow myDR3 = myDT.NewRow(); myDR3["学号"] = 2010181003; myDR3["姓名"] = "秋天天"; myDT.Rows.Add(myDR3); DataRow myDR4 = myDT.NewRow(); myDR4["学号"] = 2010181004; myDR4["姓名"] = "冬天"; myDT.Rows.Add(myDR4); //显示DataTable中的数据 this.dataGridView1.DataSource = myDT; }
(2)使用DataSet管理数据
如果内存表DataTable对应的是数据库的表,那么DataSet对象则对应整个数据库。
DataSet是从数据源中检索到的数据在内存中的缓存,可以包含多个DataTable对象。
DataSet在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.dataset.aspx
<1>合并DataSet中的内容(Merge方法)
private void Form1_Load(object sender, EventArgs e) { //连接数据库 string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using(SqlConnection myConn=new SqlConnection(connectionText)) { //创建两个DataSet对象 DataSet ds1 = new DataSet(); DataSet ds2 = new DataSet(); //创建一个SqlDataReader对象 string sqlText1 = "select * from student"; SqlDataAdapter sda1 = new SqlDataAdapter(sqlText1,myConn); //使用Fill()方法填充DataSet对象 sda1.Fill(ds1); //创建第二个SqlDataReader对象 string sqlText2 = "select * from employee"; SqlDataAdapter sda2 = new SqlDataAdapter(sqlText2,myConn); sda2.Fill(ds2); ds1.Merge(ds2,true,MissingSchemaAction.AddWithKey); dataGridView1.DataSource=ds1.Tables[0]; } }
<2>复制DataSet中的内容(Copy)
DataSet myDS; private void btnShow_Click(object sender, EventArgs e) { //创建到数据库的连接 string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using(SqlConnection myConn=new SqlConnection(connectionText)) { //查询语句 string selectText = "select * from Employee"; //创建一个SqlDataAdapter对象 SqlDataAdapter mySDA = new SqlDataAdapter(selectText,myConn); //创建一个DataSet对象 myDS = new DataSet(); //使用Fill方法填充DataSet对象 mySDA.Fill(myDS); //设置dataGridView的数据源 dataGridView1.DataSource=myDS.Tables[0]; } } private void btnCopy_Click(object sender, EventArgs e) { DataSet myDS2 = myDS.Copy(); dataGridView2.DataSource=myDS2.Tables[0]; }
注:DataSet中可以复制到的内容有:
1>创建DataSet的原样副本(其中包含架构、数据、行状态信息和行版本)
2>创建包含现有的DataSet的架构,但仅包含已修改行的DataSet
3>仅复制DataSet的架构(即关系结构)
例如:Copy()方法就是一个深拷贝方法,深拷贝复制原对象的所有成员,对于引用类型成员亦复制其所指的堆上的对象。
浅拷贝创建原对象类型的一个新实例,复制原对象的所有值类型数据
Clone()方法只拷贝DataTable的结构(不包含数据)
(3)使用DataReader获取只读数据
SqlDataReader在MSDN中的解释:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldatareader.aspx
static void Main() { string str = "Data Source=(local);Initial Catalog=Northwind;" + "Integrated Security=SSPI"; ReadOrderData(str); } private static void ReadOrderData(string connectionString) { string queryString = "SELECT OrderID, CustomerID FROM dbo.Orders;"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); connection.Open(); SqlDataReader reader = command.ExecuteReader(); // Call Read before accessing data. while (reader.Read()) { ReadSingleRow((IDataRecord)reader); } // Call Close when done reading. reader.Close(); } } private static void ReadSingleRow(IDataRecord record) { Console.WriteLine(String.Format("{0}, {1}", record[0], record[1])); }
三、数据绑定
数据绑定:指系统在运行时自动将数据赋予控件的技术。
.NET中绑定技术包括两种方式:
(1)绑定数据到单值控件。单值控件可以一次显示一个数据值,包括TextBox、Label等。
(2)绑定数据到多值控件。多值控件可以同时显示一个或多个数据记录,包括列表控件ListBox、CheckBoxList、ComboBox等,复合绑定控件DataGridView、ListView等。
绑定到ComboxBox
private void Form1_Load(object sender, EventArgs e) { TestData(); } public void TestData() { string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using(SqlConnection myConn=new SqlConnection(connectionText)) { if(myConn.State==ConnectionState.Closed) { myConn.Open(); } //使用SqlCommand提交查询命令 SqlCommand myCmd = new SqlCommand("select * from student",myConn); //获取数据适配器 SqlDataAdapter mySDA = new SqlDataAdapter(); mySDA.SelectCommand = myCmd; //填充DataSet DataSet myDS = new DataSet(); mySDA.Fill(myDS); //将DataSet对象上的数据绑定到ComboxBox //cmbDataShow.DisplayMember = "stuNumber"; cmbDataShow.ValueMember = "stuName"; cmbDataShow.DataSource = myDS.Tables[0].DefaultView; //断开连接 myConn.Close(); } }
绑定到ListBox上
string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using (SqlConnection myConn = new SqlConnection(connectionText)) { if (myConn.State == ConnectionState.Closed) { myConn.Open(); } //使用SqlCommand提交查询命令 SqlCommand myCmd = new SqlCommand("select * from student", myConn); //获取数据适配器 SqlDataAdapter mySDA = new SqlDataAdapter(); mySDA.SelectCommand = myCmd; SqlDataReader mySDR = myCmd.ExecuteReader(); while(mySDR.Read()) { listBox1.Items.Add(mySDR[1].ToString()); } myConn.Close(); }
绑定到ListView上
string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using (SqlConnection myConn = new SqlConnection(connectionText)) { if (myConn.State == ConnectionState.Closed) { myConn.Open(); } //使用SqlCommand提交查询命令 SqlCommand myCmd = new SqlCommand("select * from student", myConn); //获取数据适配器 SqlDataAdapter mySDA = new SqlDataAdapter(); mySDA.SelectCommand = myCmd; SqlDataReader mySDR = myCmd.ExecuteReader(); while(mySDR.Read()) { listBox1.Items.Add(mySDR[1].ToString()); } myConn.Close(); }
将数据绑定到ListView
string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; using (SqlConnection myConn = new SqlConnection(connectionText)) { if (myConn.State == ConnectionState.Closed) { myConn.Open(); } //使用SqlCommand提交查询命令 SqlCommand myCmd = new SqlCommand("select * from student", myConn); SqlDataReader mySDR = myCmd.ExecuteReader(); listView1.View = View.Details; listView1.FullRowSelect = true; while (mySDR.Read()) { ListViewItem myLVI = new ListViewItem(mySDR[0].ToString()); myLVI.SubItems.Add(mySDR[1].ToString()); listView1.Items.Add(myLVI); } myConn.Close(); }
将数据绑定到DataGridView中
string connectionText = "Data Source=(local);Database=testDB;Integrated Security=true"; private void btnPresent_Click(object sender, EventArgs e) { using(SqlConnection myConn=new SqlConnection(connectionText)) { if(myConn.State==ConnectionState.Closed) { myConn.Open(); } //查询字符串 string selectCommandText = "select * from student where stuNumber=' "+txtStuNumber.Text.Trim()+"'"; //根据连接对象和SQL语句创建SqlCommand对象 SqlCommand myComd = new SqlCommand(selectCommandText,myConn); //使用Command对象创建SqlDataReader对象 SqlDataAdapter sda = new SqlDataAdapter(selectCommandText,myConn); DataSet ds = new DataSet(); sda.Fill(ds,"student"); dgvShow.DataSource=ds.Tables[0]; }
实例:
http://www.cnblogs.com/chenyongblog/archive/2013/03/13/chenyongblog.html