维纳斯
在程序中寻找自由与成就感~~~~

前言:前几篇博客介绍了SqlDataReader、弱类型DataSet对数据的操作,现在讲述一下强类型DataSet(Typed DataSet)

1.弱类型DataSet的缺点

(1)只能通过列名引用,dataset.Table[0].Rows[0]["Age"],如果写错了列名编译时不会发现错误,因此开发时必须要记着列名。

(2)int age=Convert.ToInt32(dataset.Table[0].Rows[0]["Age"]),取到的字段的值是object类型,必须小心翼翼的进行类型转换,不仅麻烦,而且容易出错。

(3)将DataSet传递给其他使用者,使用者很难识别出有哪些可以供使用。

(4)运行时才能知道所有列名,数据绑定麻烦,无法使用WinForm、Asp.Net的快速开发功能。

2.正是因为这样,VS自动生成强类型DataSet:添加—新建项—数据集

(1)将表从服务器资源管理器拖放到DataSet中,注意拖放过程是自动根据表结构生成强类型DataSet等类,没有把数据也拖过来,程序还是连的那个数据库,自动将数据库连接字符写在了App.Config中。

(2)代码中使用DataSet示例:T_PersonsTableAdapter adapter=new T_PersonsTableAdapter();

下面写一个用强类型DataSet的登陆程序:

 1             T_LoginTableAdapter adapter = new T_LoginTableAdapter();
 2             强类型登陆.DataSetLogin.T_LoginDataTable tb = adapter.GetDataByUsername(txtUsername.Text);
 3             if (tb.Count <= 0)
 4             {
 5                 MessageBox.Show("用户名不存在");
 6                 return;
 7             }
 8             else
 9             {
10                 //取出满足条件的行
11                 强类型登陆.DataSetLogin.T_LoginRow user=tb[0];
12                 if (txtPassword.Text == user.password)
13                 {
14                     if (user.errortime >= 3)
15                     {
16                         MessageBox.Show("登陆错误次数过多,禁止登陆!!");
17                         return;
18                     }
19                     adapter.SuccUpdateErrortime(txtUsername.Text);
20                     MessageBox.Show("登陆成功");
21                 }
22                 else
23                 {
24                     adapter.FailUpdateErrortime(txtUsername.Text);
25                     MessageBox.Show("密码错误");
26                 }
27                 
28             }

常见问题:
 类名敲不对,表名+TableAdapter,表名+DataTable,表名+Row,然后用解析来填充类名。

类的内部定义的类要通过包含namespace的全名来引用,不能省略,类的内部定义的类就能避免同一个namespace下类不能重名的问题。

 3.更新DataSet

(1)调用Adapter的Update方法就可以将DataSet的改变保存到数据库,adapter.Update(datatable)

(2)要调用Update方法更新必须设置数据库主键,delete也是如此。

(3)常见错误:“当传递具有已修改行的DataRow集合时,更新要求有效的UpdateCommand ”,要为表设置主键。程序要通过设置主键来定位更新的行。忘了设主键怎么办?先到数据库中设置主键,然后在DataSet的对应DataTable上点击右键,选择“配置”,在对话框中点击【完成】。

(4)强类型DateSet的弱点:要修改字段就要重新配置生成,因此强类型DataSet不一定真的就是“强”,应该叫做类型化DataSet(Typed DataSet).

4.增加新的SQL语句

设计器中的Adapter中点右键,选择“添加查询”—“使用SQL语句”,就可以添加多种类型的SQL语句,如果是“select(返回行)”则SQL语句的类必须是DataSet类的父集合,生成两个方法:FillBy*和GetBy*,方法名根据查询语句的意义定,比如FillByAge,FillBy是将结果填充到现有DataSet,GetBy是将结果以DataSet方式返回,建议两个都生成,方便以后用,看着默认生成的GetData就明白了。

5.批量数据导入:

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             Stopwatch sw = new Stopwatch();
 4             sw.Start();
 5             T_LoginTableAdapter adapter = new T_LoginTableAdapter();
 6             //系统默认的在每次insert前都会打开连接,然后inset之后关闭连接,这样是非常耗时的。当批量导入数据是,不建议这样做。
 7             //for (int i = 0; i < 3000; i++)
 8             //{
 9             //    adapter.Insert(i.ToString(), i.ToString(), i);
10             //}
11             //下面这种方法只是打开了一个连接,批量操作时建议这样做,省时。
12             adapter.Connection.Open();
13             for (int i = 0; i < 3000; i++)
14             {
15                 adapter.Insert(i.ToString(),i.ToString(),i);
16  
17             }
18             adapter.Connection.Close();
19                 sw.Stop();
20             MessageBox.Show(sw.Elapsed.ToString());
21         }
22     }

 

posted on 2012-11-21 19:56  维纳斯  阅读(793)  评论(0编辑  收藏  举报