前言
在7月10日就要去揚州實習(xí)了,首先是為期2個月的培訓(xùn)狂打。一個月的Java擂煞,一個月的C#。在這一個月里面趴乡,準(zhǔn)備梳理一下java和C#的基礎(chǔ)知識对省,同時也進(jìn)行更深一步的學(xué)習(xí)。最近也一直在聽八三夭的一首晾捏,我不想改變世界蒿涎,我只想不被世界改變。同時也對自己的未來充滿著信心和憧憬惦辛。
ADO.NET概述
ADO.NET是美國微軟公司推出的.NET平臺中的一種數(shù)據(jù)訪問技術(shù)劳秋。ADO.NET類庫中提供了用于數(shù)據(jù)連接,處理數(shù)據(jù)操作的類。
ADO.NET組件
ADO.NET有2個重要的組成部分:DataSet對象和.NET數(shù)據(jù)提供者玻淑。
DataSet對象用于以表格形式在程序中放置一組數(shù)據(jù)嗽冒,它不關(guān)心數(shù)據(jù)的來源。
數(shù)據(jù)提供者包含很多針對數(shù)據(jù)源的組件补履,設(shè)計者通過這些組件可以使程序與指定的數(shù)據(jù)源進(jìn)行鏈接添坊。.NET數(shù)據(jù)提供者主要包括:Connection對象,Command對象,DataReader對象以及DataAdapter對象。
DataSet對象
ADO.NET一個比較突出的特點是支持離線訪問箫锤,即在非連接環(huán)境下對數(shù)據(jù)進(jìn)行處理贬蛙。DataSet是支持離線訪問的關(guān)鍵對象,它將數(shù)據(jù)存儲在緩存中麻汰。
創(chuàng)建一個ADO.NET數(shù)據(jù)庫應(yīng)用程序一般步驟
- 創(chuàng)建Windows窗體速客。
- 創(chuàng)建Connection對象,連接數(shù)據(jù)庫。創(chuàng)建Command對象五鲫,執(zhí)行SQL命令溺职。
- 創(chuàng)建DataAdapter對象,提供數(shù)據(jù)源與記錄集之間的數(shù)據(jù)交換位喂,數(shù)據(jù)庫與內(nèi)存中的數(shù)據(jù)交換浪耘。
- 創(chuàng)建DataSet對象,將從數(shù)據(jù)源中得到的數(shù)據(jù)保存在內(nèi)存中塑崖,然后對數(shù)據(jù)進(jìn)行相關(guān)的各種操作七冲。
具體代碼
-
數(shù)據(jù)庫連接
調(diào)用Connection對象的open()方法進(jìn)行指定的數(shù)據(jù)源連接。
Close()方法肯定就是關(guān)閉指定的數(shù)據(jù)源連接咯规婆。
Dispose()方法肯定就是釋放Connection對象所占的資源了澜躺。
一般使用try {}catch {}finally{}塊進(jìn)行相關(guān)數(shù)據(jù)庫相關(guān)的操作。
String url = @"Data Source=KQVRDUTYAH5ADL1\SQLEXPRESS;Initial Catalog=user;Integrated Security=True";
conn = new SqlConnection(url);
conn.Open();
-
創(chuàng)建Command對象
Command對象用于執(zhí)行數(shù)據(jù)庫的命令操作抒蚜。
ExecuteNonQuery():一般用于刪除掘鄙,修改,更新等操作嗡髓。返回一個int型數(shù)據(jù)操漠,就是受查詢影響的行數(shù)。一般大于0就是操作成功饿这,反之浊伙,操作失敗。
ExecuteReader():一般用于查詢操作长捧,返回一個數(shù)據(jù)集Reader對象嚣鄙。通過遍歷Reader,就能獲取查詢的數(shù)據(jù)串结。這跟MySQL的ResultSet很像拗慨。
String sql = "insert into Student values('" + name + "','" + course + "')";
sqlCommand.CommandText = sql;
int result = sqlCommand.ExecuteNonQuery();
-
創(chuàng)建DataAdapter對象
SelectCommand廓八,InsertCommand,UpdateCommand,DeleteCommand這是DataAdapter對象的4個屬性。用于定義處理數(shù)據(jù)存儲中數(shù)據(jù)的命令赵抢,并且每一個命令都是對Command對象的一個引用,可以共享同一個數(shù)據(jù)源声功。
Fill()方法:該方法用于執(zhí)行SelectCommand里面的SQL命令烦却,把數(shù)據(jù)源的數(shù)據(jù)填充到DataSet對象。
Update()方法:該方法用于將DataSet對象中某一個數(shù)據(jù)表更改的內(nèi)容更新到對應(yīng)的真實的數(shù)據(jù)庫里面的數(shù)據(jù)表中先巴。
adapter = new SqlDataAdapter(s, conn);
-
創(chuàng)建SqlCommandBuilder對象
創(chuàng)建這個對象其爵,需要傳入SqlDataAdapter的對象。為什么要創(chuàng)建這個對象?因為這個對象可以自動生成與DataSet對象關(guān)聯(lián)的操作伸蚯,如更新摩渺,刪除,增加等剂邮。如果沒有這個對象摇幻,SqlDataAdapter對象調(diào)用Update()方法會報一個異常:System.InvalidOperationException: 當(dāng)傳遞具有已修改行的 DataRow 集合時,更新要求有效的 UpdateCommand
scb = new SqlCommandBuilder(adapter);
-
創(chuàng)建DataSet對象
DataSet對象用于實現(xiàn)通過DataAdapter里面的數(shù)據(jù)來提供程序控件與數(shù)據(jù)庫相連接挥萌。DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的結(jié)構(gòu)很相似绰姻,它包括表集合(TABLES)和描述表之間關(guān)系的表集合。
AcceptChanges()方法:該方法一般用于修改了DataSet對象里面某一個表里面的內(nèi)容引瀑,然后把修改的具體內(nèi)容提交給DataSet對象中的表狂芋,調(diào)用了這個方法,RowState記錄就初始化了憨栽,注意:如果用調(diào)用到RowState初始化的DataTable再去調(diào)用Update()方法去更新數(shù)據(jù)庫里面的表帜矾,將不會有任何變化。
//DataSet對象用于實現(xiàn)DataAdapter數(shù)據(jù)提供程序控件與數(shù)據(jù)庫相連接
//DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的機(jī)構(gòu)相似屑柔,它包括表集合和描述表之間的關(guān)系集合
data = new DataSet("myDataSet");
DataTable myTable = new DataTable("StudentTable");
data.Tables.Add(myTable);
//把數(shù)據(jù)源中的數(shù)據(jù)填充到DataSet對象
adapter.Fill(data, "StudentTable");
dataGridView1.DataSource = myTable;
- 完整實例代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApplication19
{
public partial class dasd : Form
{
//BindingManagerBase類是一個抽象類屡萤,管理所有
//綁定相同的數(shù)據(jù)源和數(shù)據(jù)成員的控件
private BindingManagerBase myBind;
private String TAG = "Form";
private SqlConnection conn;
private SqlDataAdapter adapter;
private DataSet data ;
//這樣會讓SqlDataAdapter對象自動實現(xiàn)與DataSet更改和關(guān)聯(lián)的SQL語句
private SqlCommandBuilder scb;
private int i;
private int selectedId=-1;
private int selectedSid=-1;
private SqlCommand sqlCommand;
public dasd()
{
InitializeComponent();
//設(shè)置DataGirdView選中模式 為每一行選中
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
initData();
}
private void initData()
{
String url = @"Data Source=KQVRDUTYAH5ADL1\SQLEXPRESS;Initial Catalog=user;Integrated Security=True";
conn = new SqlConnection(url);
conn.Open();
String s = "select * from Student";
adapter = new SqlDataAdapter(s, conn);
scb = new SqlCommandBuilder(adapter);
//DataSet對象用于實現(xiàn)DataAdapter數(shù)據(jù)提供程序控件與數(shù)據(jù)庫相連接
//DataSet的結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的機(jī)構(gòu)相似,它包括表集合和描述表之間的關(guān)系集合
data = new DataSet("myDataSet");
DataTable myTable = new DataTable("StudentTable");
data.Tables.Add(myTable);
//把數(shù)據(jù)源中的數(shù)據(jù)填充到DataSet對象
adapter.Fill(data, "StudentTable");
dataGridView1.DataSource = myTable;
sqlCommand = new SqlCommand(s,conn);
}
private void add_Click_1(object sender, EventArgs e)
{
String name="獨一無二的小馬同志"+i;
String course="計算機(jī)";
String sql = "insert into Student values('" + name + "','" + course + "')";
sqlCommand.CommandText = sql;
int result = sqlCommand.ExecuteNonQuery();
if (result>0)
{
MessageBox.Show("添加記錄成功!");
}
doUpdateDataSet();
i++;
}
private void button1_Click(object sender, EventArgs e)
{
MyLog.i(TAG, "selectedId=" + selectedId);
if (selectedId ==-1)
{
MessageBox.Show("沒有選中任何一項");
return;
}
//先從DataSet獲取我們之前定義的StudentTable表
DataTable myTable = data.Tables["StudentTable"];
myTable.Rows[selectedId].Delete();
//對指定的數(shù)據(jù)集DataSet中的數(shù)據(jù)表StudentTable更新到數(shù)據(jù)源锯蛀。
int result= adapter.Update(data,"StudentTable");
MyLog.i(TAG,"result="+result);
if (result>0)
{
MessageBox.Show("刪除記錄成功");
}
//把修改結(jié)果提交到數(shù)據(jù)集dataset中的數(shù)據(jù)表studenttable
data.AcceptChanges();
selectedId = -1;
selectedSid = -1;
dataGridView1.Rows[int.Parse(dataGridView1.RowCount.ToString())-1].Selected = false;
}
private void Form1_Load(object sender, EventArgs e)
{
//默認(rèn)不選中
if (dataGridView1.RowCount > 0)
{
dataGridView1.Rows[0].Selected = false;
}
dataGridView1.AllowUserToAddRows = false;
//設(shè)置只讀模式
dataGridView1.ReadOnly = true;
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
//獲取當(dāng)前行的index
selectedId = dataGridView1.CurrentRow.Index;
//獲取當(dāng)前行的sid
selectedSid = int.Parse(dataGridView1.Rows[selectedId].Cells[0].Value.ToString());
MyLog.i(TAG, "您選中的selectedId=" + selectedId + ",sid=" + selectedSid);
}
private void del1_Click(object sender, EventArgs e)
{
if (selectedId == -1)
{
MessageBox.Show("您沒有選中任何一項");
return;
}
MyLog.i(TAG, "selectedId=" + selectedId+",sid="+selectedSid);
String sql = "delete from Student where sid=" + selectedSid;
sqlCommand.CommandText = sql;
int result = sqlCommand.ExecuteNonQuery();
if (result>0)
{
MessageBox.Show("刪除成功");
}
doUpdateDataSet();
}
private void doUpdateDataSet()
{
data.Tables.Clear();
data.AcceptChanges();
adapter.Fill(data, "StudentTable");
dataGridView1.DataSource = data.Tables["StudentTable"];
dataGridView1.Rows[0].Selected = false;
selectedId = -1;
selectedSid = -1;
}
private void add1_Click(object sender, EventArgs e)
{
DataTable myTable=data.Tables["StudentTable"];
//要添加的sid 肯定是最后一項數(shù)據(jù)的sid+1
int sid=int.Parse(dataGridView1.Rows[int.Parse(dataGridView1.RowCount.ToString())-1].Cells[0].Value.ToString())+1;
Object[] newRow = {sid, "我是沉夢" + i, "英語" };
myTable.Rows.Add(newRow);
int result = adapter.Update(data, "StudentTable");
if (result > 0)
{
MessageBox.Show("添加成功");
}
//把修改結(jié)果提交給DataSet中的表里
data.AcceptChanges();
i++;
}
private void edit1_Click(object sender, EventArgs e)
{
int sid = selectedSid;
MyLog.i(TAG,"sid=" + sid);
String sql="update Student set name='"+textBox2.Text+"', course='"+textBox3.Text+"' where sid='"+sid+"'";
sqlCommand.CommandText = sql;
int result = sqlCommand.ExecuteNonQuery();
if (result > 0)
{
MessageBox.Show("修改成功灭衷!");
}
else
{
MessageBox.Show("修改失敗!");
}
doUpdateDataSet();
}
private void edit2_Click(object sender, EventArgs e)
{
DataTable myTable=data.Tables["StudentTable"];
//獲取某一行指定列的值
myTable.Rows[selectedId]["name"]=textBox2.Text;
myTable.Rows[selectedId]["course"] = textBox3.Text;
int result=adapter.Update(data, "StudentTable");
if (result > 0)
{
MessageBox.Show("修改成功!");
}
else
{
MessageBox.Show("修改失敗!");
}
data.AcceptChanges();
}
}
}
-
演示效果
尾言
這樣一個基本的數(shù)據(jù)庫程序就完成了,實現(xiàn)了基本的增刪改查等功能旁涤。如果你們有時間翔曲,可以進(jìn)行更一步的優(yōu)化,實現(xiàn)代碼的復(fù)用呢劈愚。