接上一节内容
4. 关系与约束
5. 向DataSet中的表添加约束
添加现有约束
使用数据适配器提供的方法一次性将被查询数据源目标表的约束一次性添加到DataSet的DataTable上。
sda.FillSchema(ds,SchemaType.Source,"users");
分页查询
通过对DataSet填充数据可以完成分页
sda.Fill(ds,currentIndex,pageSize,"users");//这个fill方法是自定义重载的
currentIdex:当前页
pageSize:面的尺寸
users:代表表名
以上分页方式属于伪分页,因为这种分页方式仍然是一次读取数据表的所有数据进来先,然后再分页,如果表的数据数十万条,效率也不是很高了。但总的来说还是有用的。
高效的分页是SQL语句完成的。即写在SQL存储过程中的语句来实现。但是此方法比较依赖于预先排序的整数类型的主键.并不是任意数据类型的列都可以用的。
--8.按每次显示20个员工信息进行分页
/*-------------------------------
1. 首先要先对员工表进行排序
2. 定义每页显示的数据为20条
3. 输入当前要显示的第几页
----------------------------------*/
--drop proc Splid_pages_display
create proc Splid_pages_display(
--@allPages int=1,--总页数
@PageNum int=1, --当前面
@PageSize int=20--每页显示的记录数
)
as
begin
declare @sql varchar(1000);
set @sql='select top '+cast(@PageSize as varchar)+' bh,xm,xb,xsfzh,dz,jn,byyx,jg,hf,ybm,bm,bmbh
from employee
where bh>all('+'select top '+cast(@PageSize*(@PageNum-1) as varchar)+' bh from employee order by bh asc' +')
order by bh asc' ;
exec(@sql)
end
go
6. 使用DataAdapter保存更改
调用DataAdapter的Update方法可以将DataSet中的更改解析回数据源
1. DataAdapter会分析已做的更改并执行相应的命令(INSERT, UPDATE或DELETE).
2. 当DataAdapter遇到对DataRow所做的更改时,它将使用InsertCommand, Updatecommand或DeleteCommand来处理该更改。
如:sda.Update(ds,"表名");
//一次性将被查询数据源目标表的约束添加进来
sda.FillSchema(ds,SchemaType.Source,"p");
//p为表名。
ds.Tables["p"].PrimaryKey[0].ColumnName;
//PrimaryKey相当于一个主键集合
sda.InsertCommand=new Sqlcommand(sql,conn);
//添加插入新数据的命令及其参数
如:
sda.InsertCommand.Parameters.Add(
"@id",sqlDbType.Int,4,"id"
);
7. 自动生成命令
主要是SqlCommandBuilder类的使用
即:SQL命令对象构造器
如:
sda=new SqlDataAdapter(sql,conn);
//下面仅一句就省去了频繁添加批量参数的麻烦
SqlCommandBuilder sb=new SqlCommandBuilder(sda)
ds=new DataSet();
sda.Fill(ds,"users");
dataGridView.DataSource=ds.Table["users"];
8. 使用VS访问数据
1. 向导创建数据集
2. 手工创建数据集项目
3. SqlHelper类的结构(这个微软官方出数据操作辅助类,牛人写的就是不一般,这个百度搜一下大把的可以下载,还有中文版的)
1. 公用成员
2. 处理SQL语句的方法
3. 处理存储过程的方法
学了这节课以后,我只能说前面的学的那些对数据的操作真的太复杂了,但是还是要学滴,没有因那有果呀。只有学了前的那些基础的入门的数据库操作方法,才能知道那些对数据库的高级便捷的操作原理是什么。对于我本人来说,原理才是想追求的,知道了原理,感觉这些便捷的操作用着很舒心,至少它出了问题我还有个笨笨的解决方法来替代它吧。呵呵。。。。。。
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 WF32
{
public partial class Form1 : Form
{
//连接字符串
string strCon = "server=.; database=hrms; uid=sa; pwd=123123";
SqlDataAdapter sda;
DataSet ds;
SqlConnection conn;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 窗口加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
//根据老师的思路,先将对表的增删改查相关语句创建齐备
//1. 查
string sqlSelect = "select bh,xm,xb,dz,bm from employee order by bh";
#region SqlDataAdapter与其方法Fill和FillSchema的使用 --已注释
增 (SqlCommandBuilder类中用不到了)
//string sqlInsert = "insert into employee(bh,xm,xb,dz,bm) values(@bh,@xm,@xb,@dz,@bm)";
改 (SqlCommandBuilder类中用不到了)
//string sqlUpdate = "update employee set xm=@xm,xb=@xb,dz=@dz,bm=@bm where bh=@bh";
删 (SqlCommandBuilder类中用不到了)
//string sqlDelete = "delete from employee where bh=@bh";
//conn = new SqlConnection(strCon);
//sda = new SqlDataAdapter(sqlSelect, conn);//初始化命令对象为检索命令
//ds = new DataSet();
//sda.Fill(ds, "p");//百度上搜的实例或讲解说是先架再填充,这里是先填充再架
//sda.FillSchema(ds, SchemaType.Source, "p");//将表架构匹配到数据集(表名,关键字,约束等)
看看先架再填充,必须使用检索字符串中的表名哦
//sda.FillSchema(ds, SchemaType.Source, "employee");
//sda.Fill(ds, "employee");
数据集匹配了数据表架构就可以调用表的关键字名了
MessageBox.Show(ds.Tables["p"].PrimaryKey[0].ColumnName);//可行
MessageBox.Show(ds.Tables["employee"].PrimaryKey[0].ColumnName);//同样可行
//sda.InsertCommand = new SqlCommand(sqlInsert, conn);//初始化命令对象为插入命令
//sda.InsertCommand.Parameters.Add("@bh", SqlDbType.Int, 10, "bh");
//sda.InsertCommand.Parameters.Add("@xm", SqlDbType.Char, 8, "xm");
//sda.InsertCommand.Parameters.Add("@xb", SqlDbType.Char, 2, "xb");
//sda.InsertCommand.Parameters.Add("@dz", SqlDbType.Char, 100, "dz");
//sda.InsertCommand.Parameters.Add("@bm", SqlDbType.Char, 40, "bm");
//sda.UpdateCommand = new SqlCommand(sqlUpdate, conn);//初始化命令对象为更新命令
//sda.UpdateCommand.Parameters.Add("@bh", SqlDbType.Int, 10, "bh");
//sda.UpdateCommand.Parameters.Add("@xm", SqlDbType.Char, 8, "xm");
//sda.UpdateCommand.Parameters.Add("@xb", SqlDbType.Char, 2, "xb");
//sda.UpdateCommand.Parameters.Add("@dz", SqlDbType.Char, 100, "dz");
//sda.UpdateCommand.Parameters.Add("@bm", SqlDbType.Char, 40, "bm");
//sda.DeleteCommand = new SqlCommand(sqlDelete, conn);//初始化命令对象为删除命令
//sda.DeleteCommand.Parameters.Add("@bh", SqlDbType.Int, 10, "bh");
dataGridView1.DataSource = ds.Tables["p"];
#endregion
#region 使用SqlCommandBuilder类可以同样实现上面复杂操作,这就是命令对象构造器
conn = new SqlConnection(strCon);//创建数据连接对象
sda = new SqlDataAdapter(sqlSelect, conn);//创建数据适配器
SqlCommandBuilder sb = new SqlCommandBuilder(sda);//创键命令对象构造器
ds = new DataSet();
sda.Fill(ds, "p");
#endregion
}
/// <summary>
/// 加载数据按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnLoad_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = ds.Tables["p"];
//dataGridView1.DataSource = ds.Tables["employee"];
}
/// <summary>
/// 更新数据按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnUpdate_Click(object sender, EventArgs e)
{
if (sda != null && ds !=null)
{
sda.Update(ds, "p");
//sda.Update(ds, "employee");
}
}
}
}
这里就不用贴图了,一个DataGridView控件,两个按钮就可以进行测试了。希望对观光的朋友有帮助。