ADO.Net基础篇——3类型化DataSet

前言:前几篇博客介绍了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     }

 

你可能感兴趣的:(.net)