您的位置:首页 > 编程语言 > C#

C#成魔之路<6>ADO.NET数据访问技术(2)

2016-03-06 19:53 309 查看
1、读取数据:DataReader对象

在使用Command对象执行完SQL命令后,若需要从返回的结果集中读取数据,可以使用DataReader对象。

(1)DataReader对象详述

DataReader是数据读取器对象,提供只读向前的游标,如果应用程序需要每次从数据库中取出最新的数据,或者只是需要快速读取数据,并不需要修改数据,那么就可以使用DataReader对象进行读取。对于不同的数据库连接,有不同的DataReader类型,具体如下:

在System.Data.SqlClient命名空间下时,可以调用SqlDataReader类。

在System.Data.OleDb命名空间下时,可以调用OleDbDataReader类。

在System.Data.Odbc命名空间下时,可以调用OdbcDataReade类。

在System.Data.Oracle命名空间下,可以调用OracleDataReader类。

在使用DataReader对象读取数据的时候,可以调用Command对象的ExecuteReader方法,根据SQL语句的结果创建一个DataReader对象。

示例程序:

conn = new SqlConnection("server= ;database= ;uid= ;pwd= ");
conn.Open();//打开数据库
SqlCommand sqlCmd = new SqlCommand();//创建数据库command
sqlCmd.Connection = conn;//创建连接
sqlCmd.CommandText = " from tb_command";//设置SQL语句
sqlCmd.CommandType = CommandType.Text;//设置其type格式
SqlDataReader sdr = sqlCmd.ExecuteReader();//注意利用该方法进行datareader的创建
//若要创建SqlDataReader,必须调用SqlCommand对象的ExecuteReader方法。


(2)判断查询结果中是否有值

可以通过SqlDataReader对象的HasRows属性获取一个值,该值指示SqlDataReader是否包含一行或者多行,即判断检查结果中是否有值。

public override bool HasRows{get;}
//如果sqlDataReader包含一行或者多行,则属性值为true,否则为false。


示例程序:

private void button1_Click(object sender, EventArgs e)
{
try
{
SqlConnection sqlConn = new SqlConnection("server= ;database= ;uid= ;pwd=  ");
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand("select*from " + textBox1.Text.Trim(), sqlConn);
SqlDataReader sdr = sqlCmd.ExecuteReader();
sdr.Read();
if (sdr.HasRows)
{
MessageBox.Show("表中有值");
}
else
{
MessageBox.Show("表中无值");
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}


(3)读取数据

如果要读取数据表中的数据,通过ExecuteReader方法,根据SQL语句创造一个SqlDataReader对象之后,在调用SqlDataReader对象的read方法读取数据。read方法使qlDataReader前进到下一条记录,qlDataReader的默认位置是在第一条记录前面。因此,必须调用read方法访问数据。

语法:

public override bool Read()
//说明:如果存在多个行,则返回值为true,否则为false。


对于每个关联的SqlConnection,一次只能打开一个SqlDataReader,在一个关闭之后,打开另一个的任何尝试都将失败。

2、数据适配器DataAdapter对象

DataAdapter对象的工作方式有两种:一种是通过Command对象执行SQL语句,从数据源中检索数据,并且将检索到的数据填充到DataSet对象。

另一种方法是把对DataSet对象所做的更改写入数据源。

(1)DataAdapter对象概述

DataAdapter独享是一个数据适配器对象,是DataSet和数据源之间的桥梁。DataAdampter对象提供了四个属性,实现和数据源之间的互通。

SelectCommand:向数据库发送查询SQL语句。

DeleteCommand:向数据库发送删除SQL语句。

InsertCommand:向数据库发送插入SQL语句。

UpdateCommand:向数据库发送更新SQL语句。

对数据库进行操作的时候,只要将这四个属性设置成相应的SQL语句即可。DataAdampter对象中还有几个主要的方法,具体如下:

Fill方法用数据填充DataSet。语法:

public int Fill(DataSet dataset,string srcTable)
//dataSet表示要填充的数据集。srcTable表示用于表映射的源表的名称。该方法的返回值为已在DataSet中成功添加或刷新的行数,这不包括手不返回行的语句影响的行。


如果所连接的是SQLServer 数据库,则可以通过将SqlDataAdapter和关联的SqlCommand和SqlConnection对象一起使用,从而提高总体性能。

Update方法更新数据库的时候,DataAdapter将调用DeleteCommand、InsertCommand和UpdateCommand属性。语法:

public int Update(DataTable dataTable)
//dataTable表示用于更新数据源的DataTable。该方法返回值DataSet中成功更新的行数。


(2)填充DataSet数据集

通过DataAdapter对象的Fill方法填充DataSet数据集。Fill方法使用Select语句从数据源中检索数据。和Select命令相关连的Connection对象必须有效,但是不需要将其打开。

public partial class Form1 : Form
{
SqlConnection sqlConn;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
SqlConnection sqlConn = new SqlConnection("server= ;database= ;uid= ;pwd=  ");
SqlCommand sqlCmd = new SqlCommand("select*from tb_command",sqlConn);
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = sqlCmd;
//创建一个Dataset对象
DataSet ds = new DataSet();
//使用SqlDataAdapter对象的Fill方法填充DataSet数据集
sda.Fill(ds,"cs");
dataGridView1.DataSource = ds.Tables[0];
}
}


(3)更新数据源

使用DataAdapter对象的Update方法,可以将DataSet中修改过的数据及时的更新到数据库当中。在调用Update方法之前要实例化一个CommandBuilder类,自动根据DataAdapter的SelcetCommand的SQL语句判断其他的InsertCommand、UpdateCommand和DeleteCommand。这样就不需要设置DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性。直接使用Update方法来更新DataSet、DataTable或DataRow数组即可。

示例程序:

public partial class Form1 : Form
{
SqlConnection conn;
DataSet ds;
SqlDataAdapter sda;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
conn = new SqlConnection("server= ; database= ;uid= ;pwd= ");
SqlCommand cmd = new SqlCommand("select*from tb_command",conn);
sda = new SqlDataAdapter();
sda.SelectCommand = cmd;
ds = new DataSet();
sda.Fill(ds,"cs");
dataGridView1.DataSource = ds.Tables[0];//设置这个控件的数据源
}

private void button1_Click(object sender, EventArgs e)
{
DataTable dt=ds.Tables["cs"];//创建一个table隶属于ds
sda.FillSchema(dt,SchemaType.Mapped);//把表的结构加载进入
DataRow dr = dt.Rows.Find(textBox1.Text);//创建一个datarow
dr["name"] = textBox2.Text.Trim();
dr["age"] = textBox3.Text.Trim();
dr["sex"] = textBox4.Text.Trim();
dr["money"] = textBox5.Text.Trim();

SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(sda);
sda.Update(dt);//调用其将dt更新到数据库中

}

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//在点击事件中实现单机某条数据从而显示详细信息
textBox1.Text = dataGridView1.SelectedCells[0].Value.ToString();
textBox2.Text = dataGridView1.SelectedCells[1].Value.ToString();
textBox3.Text = dataGridView1.SelectedCells[2].Value.ToString();
textBox4.Text = dataGridView1.SelectedCells[3].Value.ToString();
textBox5.Text = dataGridView1.SelectedCells[4].Value.ToString();
}
}


3、数据集:DataSet对象

DataSet也是ADO.NET的核心成员,支持ADO.NET断开式,分布式数据方案的核心对象。也是实现基于非连接的数据查询的核心组件。DataSet对象是创建在内存中的集合对象。相当于在内存中创建的一个小型关系数据库。

(1)DataSet对象概述

DataSet对象就像存放在内存中的一个小型数据库。可以包含数据表,数据列。数据行、视图、约束以及关系。通常DataSet的数据来源于数据库或者XML,为了从数据库中获取数据,需要使用数据适配器DataAdapter从数据库中查询数据。

语法如下:

sqlConn=new SqlConnection("server= ;database= ;uid= ;pwd= ");
DataSet ds=new DataSet();
SqlDataAdapter sda=new SqlDataAdapter("select*from tb_mrkj",conn);
sda.Fill(ds);


(2)使用DataSet合并数据

可以使用DataSet的Merge方法吧DataSet、DataTable 或者DataRow数组的内存并入现有的DataSet中。Merge方法将指定的DataSet及其框架和当前的DataSet合并,在此过程中,将根据给定的参数保留或者放弃在当前DataSet中的更改并且处理不兼容的架构。

语法:

public void Merge(DataSet dataset,bool presentChanges,MissingSchemaAction missingSchemaAction)
//dataset表示将被合并到当前数据集中的DataSet实例;若要保留当前DataSet中的更改,则presentChanges的值为true。否则为false。MissingSchemaAction的值为MissingSchemaAction的枚举值之一。


DataSet对象为null的时候,无法进行合并。

示例程序:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

SqlCommand sqlConn = null;

private void Form1_Load(object sender, EventArgs e)
{
sqlConn = new SqlCommand("server= ;database= ;uid= ;pwd= ");
DataSet ds = new DataSet();
DataSet ds1 = new DataSet();

SqlDataAdapter sda = new SqlDataAdapter("select*from tb_man",sqlConn);
sda.Fill(ds);
SqlDataAdapter sda1 = new SqlDataAdapter("select*from tb_man", sqlConn);
SqlCommandBuilder sb = new SqlCommandBuilder(sda1);
sda1.Fill(ds1);
ds1.Merge(ds,true,MissingSchemaAction.AddWithKey);
dataGridView1.DataSource=ds1.Tables[0];
}
}


4、数据浏览器:DataGridView

DataGridView控件通常用到的是数据浏览控件,操作简单而且灵活功能强大。

(1)概述

DataGridView提供一种强大而灵活的以表格形式显示数据的方式,可以使用DataGridView控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图。使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据。将数据绑定到DataGridView控件,只需要设置DataSource属性即可。DataGridView控件具有极高的可配置性和可扩展性,提供了大量属性方法和事件,可以用来对控件的外观和行为进行自定义。

(2)在DataGridView中显示数据

通过DataGridView控件是显示数据表中的数据,首先需要使用DataAdapter对象查询指定的数据,然后通过该对象的Fill方法填充DataSet,最后设置DataGridView的DataSource属性为DataSet的表格数据。

DataGridView的DataSource属性用于获取或设置DataGridView控件所显示数据的数据源。

public Object DataSource{get;set;}


具体事例见前面的示例程序。

注意:显示数据的时候,可以利用Columns[列的索引号]属性的Visible属性设置为false,从而隐藏指定的列。

(3)获取DataGridView中的当前单元格

如果需要获取当前单元格的信息,可以通过读取DataGridView控件的CurrentCell属性来实现,该属性用于获取当前还在活动状态的单元格。

public DataGridViewCell CurrentCell{get;set;}
//表示当前单元格的DataGridViewCell,如果没有单元格,那么就是空引用。默认值是第一列中的第一个单元格,如果控件中没有单元格,则为空引用。


注意:可以使用DataGridView控件中的SelectedCells集合属性来获取该控件中所有被选中的单元格信息。

示例程序:

string msg=String.Format("第{0}行,第{1}列",DataGridView1.CurrentCell.RowIndex,DataGridView1.CurrentCell.ColumnIndex);
label1.Text=msg;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 ado.net C#