C#学习笔记之数据库连接操作,小编在学习做一个图书馆管理C#窗体程序时,涉及到了数据库连线操作。其中就有一个问题就是使用哪一种方式去连接,其中有连线数据库操作和离线数据库操作,主要都是运用ADO.NET去连接,至于ADO.NET就不在这里详解了,可以点击百度百科ADO.NET了解或者再CSDN搜索ADO.NET即可找到详解。小编在下就放入一个表格简单说明
数据提供程序是应用程序与数据库交互的基础,实现离线操作的技术基础是XML 。
ADO.NET概述具体步骤如下:
第1步:首先要建立数据库连接,此时要用到Connection对象。
第2步:应用程序通过Command对象向数据库发送指令,为了方便对增删查改命令进行集中管理,可以把对某一个表的增删查改四个Command对象组合成一DataAdapter对象。
第3步:如果是读取数据,返回的数据存放在DataReader对象中,此时,仍然需要保持数据库连接,而且DataReader对象中的数据只能从前到后检索一次。
第4步:为了多次检索数据,可以采用离线访问模型。即把取得的数据存放到DataTable对象中,如果DataTable比较多,而且彼此之间存在关系,可以把多个DataTable对象组合在一个DataSet对象中。
连接数据库的方法也不在此详说了,今天重点讲离线和连线数据操作
连线数据操作以我做的图书管理系统的添加用户功能为例
private void skinButton2_Click(object sender, EventArgs e)
{
DAC dac = new DAC();//DAC是一个封装好的连接数据库类
string cmdTextInsert = "INSERT INTO TUser(UserID,Pwd,UserName)";
cmdTextInsert += "VALUES(@userid,@pwd,@username)";//封装数据库插入语句
try
{
dac.Connection.Open();//打开数据库连接,OPEN方法
SqlCommand cmdInsert = new SqlCommand(cmdTextInsert, dac.Connection);//把封装好的数据库插入语句发给sql执行
cmdInsert.Parameters.AddWithValue("@userid", txtID.Text);
cmdInsert.Parameters.AddWithValue("@pwd", txtPaw.Text);
cmdInsert.Parameters.AddWithValue("@username", txtName.Text);//把值赋给参数
cmdInsert.ExecuteNonQuery();
MessageBox.Show("添加成功");
dac.Connection.Close();
}
catch(SqlException ex){
MessageBox.Show("添加失败" + ex.Message.ToString());
}
}
而离线数据库操作以我的借阅功能为例
//1定义适配器,数据集
DataSet ds ;
SqlDataAdapter daBook, daLend, daReader;
//2初始化,装载数据
void init() {
DAC dac = new DAC();
ds = new DataSet();
daBook = new SqlDataAdapter("select * from TBookDetail",dac.Connection);
daLend = new SqlDataAdapter("select * from TLendInfo", dac.Connection);
daReader = new SqlDataAdapter("select * from TReader", dac.Connection);
daBook.Fill(ds,"TBookDetail");
daLend.Fill(ds,"TLendInfo");
daReader.Fill(ds, "TReader");
}
//3显示在库图书
void showBookInstore() {
DataView dvBook = new DataView(ds.Tables["TBookDetail"]);
dvBook.RowFilter = "Status='在库'";
dgvBookList.DataSource = dvBook;
}
//4绑定读者
void showReader() {
DataView dvReader = new DataView(ds.Tables["TReader"]);
cbbReaderSelect.DataSource = dvReader;
cbbReaderSelect.DisplayMember = "Name";
cbbReaderSelect.ValueMember = "ReaderID";
}
//显示读者借阅的图书
void showReaderLendInfo() {
DataView dvlend = new DataView(ds.Tables["TLendInfo"]);
dvlend.RowFilter="ReaderID='"+ cbbReaderSelect.SelectedValue.ToString()+"'";
dgvUserLendList.DataSource = dvlend;
}
//借阅图书
private void BookLend(){
string readerID = cbbReaderSelect.SelectedValue.ToString();
List bookIdToLend=new List();
//获取选中的书籍ID号
foreach(DataGridViewRow row in dgvBookList.Rows){
if(row.Cells["ColSelect"].Value!=null){
int bookId=(int)row.Cells[1].Value;//将BookIdJ加入泛型列表
bookIdToLend.Add(bookId);
}
}
//对每一本书,做两个数据操作:改TBookDetail,加TLendInfo
foreach(int bookId in bookIdToLend){
DataRow[]
bookRows=ds.Tables["TBookDetail"].Select("bookId='"+bookId+"'");
bookRows[0]["Status"] = "借出";
DataRow LendRow = ds.Tables["TLendInfo"].NewRow();
LendRow["BookID"] = bookId;
LendRow["ReaderID"] = readerID;
LendRow["LendDate"] = DateTime.Today;
ds.Tables["TLendInfo"].Rows.Add(LendRow);
}
}
private void Form1_Load(object sender, EventArgs e)
{
init();
showBookInstore();
showReader();
showReaderLendInfo();
setTitle();
}
//选择读者时触发的事件
private void cbbReaderSelect_SelectedIndexChanged(object sender, EventArgs e)
{
showReaderLendInfo();
}
//点击借阅按钮时触发的事件
private void btnLend_Click(object sender, EventArgs e)
{
BookLend();
showReaderLendInfo();
}
//取消操作,此时数据并未写入到数据库
private void btnCancle_Click(object sender, EventArgs e)
{
ds.RejectChanges();
}
//保存借阅信息,此时将DataSet中的数据写入数据库
private void btnSave_Click(object sender, EventArgs e)
{
try
{
SqlCommandBuilder dbbook = new SqlCommandBuilder(daBook);
SqlCommandBuilder dblend = new SqlCommandBuilder(daLend);
daBook.Update(ds, "TBookDetail");
daLend.Update(ds, "TLendInfo");
MessageBox.Show("成功办理借阅");
}
catch (SqlException ex) {
MessageBox.Show(ex.Message.ToString());
}
}
略微斗胆做个总结,就是连线数据库操作就是一次从头到尾去查,且每一次操作都要和数据库做连接,而离线数据库操作是连接一次之后就把需要用到的表保存下来,关闭数据库连接后,对保存下来的数据表进行增删改查的操作,然后再保存回数据库,也就是更新数据库表。
其实小编也有个疑惑就是两者都能实现某功能,那该选择哪一种呢???希望有大佬帮我解惑解惑!谢谢