接上上一篇!
五、数据绑定:简单数据绑定和复杂数据绑定
1.简单数据绑定
(1).使用C#语法:
textBox1.DataBindings.Add ( “Text” , dataSet , “字段名" ) ;
(2). 多数情况直接为“Text” 属性赋值
textBox1.Text=dataSet1.Tables[1].Rows[0][1].ToString();
2.复杂数据绑定:ListBox\ComboxBox\DataGridView
ListBox和ComboBox使用DisplayMember属性和ValueMemeber属性绑定DataTable的列 ;
DisplayMemeber属性:将控件绑定到特定数据元素,该数据显示在控件中 ;
ValueMember属性:用来将控件绑定到特定数据元素,该数据不会显示。
3.使用C#语法:
(1).绑定一列数据:
combobox1.DataSource=dataset;
combobox1.DisplayMember="name";//表的字段名
combobox1.ValueMember="id";//表的字段名
(2).绑定多列数据:
dataGridView1.DataSource=dataset1;
六、DataGridView
1.数据绑定:
(1).直接设置DataSource属性即可
(2).绑定的数据包含多个列表或表的数据源时,需用DataMember属性设置为指定要绑定的列表或表的字符串即可。
(3).示例:
DataSet ds=GetDataSet();//返回一个DataSet对象
DataGridView1.DataSource=ds;
DataGridView1.DataMember="Customers";
或 DataGridView1.DataSource=ds.Tables[0];
2.DataGridView的一些默认设置:
(1).允许就地编辑
(2). 支持自动排序
(3).允许不同类型选择
(4). 支持自动调整大小功能
(5).允许互换列的 基本的
3.DataGridView 显示遵循以下几项简单的规则:
(1). 为数据源中的每个字段创建一列。
(2). 使用字段名称创建列标题。
4.DataGridView简单操作
(1).对当前单元格的内容的读取和修改
dataGridView1.CurrentCell.Value //获取当前单元格的值
dataGridView1.CurrentCell.ColumnIndex //获取当前单元格所在列索引
dataGridView1.CurrentCell.RowIndex //获取当前单元格行索引
dataGridView1.CurrentRow.Cells[0].Value//获取当前选中行的第0列数据(以0开始)
(2).设定DataGridView单元格表现形式
<1>.设置只读属性,ReadOnly属性
DataGridView1.ReadOnly=true; //使DataGridView不允许修改
DataGridView1.Columns[1].ReadOnly=true;//使第2列不允许修改
<2>.设置选择形式,SelectionMode属性
//这是整行选中,还有一些其他的选择形式,可以自己测试一下
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
(3).改变行头和列头文本
DataGridView1.Columns[0].HeaderCell.Value="第一列";
DataGridView1.Rows[0].HeaderCell.Value="第一行";
DataGridView1.TopLeftHeaderCell.Value?="左上";
(4).DataGridView行列的隐藏和删除
//行和列的隐藏
DataGridView1.Columns[0].Visible=false;
DataGridView1.Rows[0].Visible?=false;
//行头和列头的隐藏
this.dataGridView1.ColumnHeadersVisible = false;
this.dataGridView1.RowHeadersVisible = false;
(5).行和列的删除
DataGridView1.Columns.Remove("Column1");
DataGridView1.Columns.RemoveAt(0);
DataGridView1.Rows.RemoveAt(0);
//删除选中的行,代码:
foreach (DataGridViewRow r in this.dataGridView1.SelectedRows)
{
if (!r.IsNewRow)
{
this.dataGridView1.Rows.Remove(r);
}
}
(6).设置各列标题(方法不唯一,只提供一个参考) (其中gridHead可以一个列长度相等的数组)
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
dataGridView1.Columns[i].HeaderText = gridHead[i];//设置列标题
if (i == 7)
{
dataGridView1.Columns[i].DefaultCellStyle.Format = "d";//设置行显示格式
}
}
(7).DataGridView隔行显示不同的颜色,使用DefaultCellStyle属性和DataBindingComplete事件, 如在事件中编写:(方法不唯一,只是提供一个参考)
if (this.dataGridView1.Rows.Count != 0)
{
for (int i = 0; i < this.dataGridView1.Rows.Count; )
{
this.dataGridView1.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.Pink;
i += 2;
}
}
(8).向DataGridView中添加combobox列
<1>.删除自动生成的 CategoryID 列:
DataGridView1.Columns.Remove("CategoryID");
<2>. 为 CategoryID 创建列表列:
DataGridViewComboBoxColumn List =New DataGridViewComboBoxColumn();
List.DisplayIndex = 0; //设置显示位置
List.HeaderText = "Category"; //设置列标题
<3>.将此列绑定至 Products.CategoryID 字段:
List.DataPropertyName = "CategoryID";
<4>. 该列表将从 Categories 表获得数据:
List.DataSource = ds.Tables("Categories");
List.DisplayMember = "CategoryName";
List.ValueMember = "CategoryID";
<5>. 向DataGridView添加该列:
DataGridView1.Columns.Add(List);
七、ADO事务---本地事务和分布式事务
对于数据库有数据库的事务操作,基本通过这些命令完成:BEGIN TRAN,COMMIT TRAN, ROLLBACK TRAN!
对于ADO也有事务操作:
1.ADO事务分类:
(1).本地事务:同一连接同一数据库中的事务处理。
(2).分布式事务:分布式应用中不同数据库中的事务处理。
2.本地事务
(1).操作步骤:
<1>.调用Connection 对象的BeginTransaction 方法来标记事务的开始。
<2>.将Transaction 对象分配给要执行的Command的Transaction 属性。
<3>.执行所需的命令。
<4>.调用Transaction 对象的Commit方法来完成事务,或调用Rollback方法来取消事务。
(2).简单示例:
try{
SqlTransaction tran = cn.BeginTransaction();
...
cmd.ExecuteNonQuery();
tran.Commit();
Console.WriteLine(“事务提交!\n)";
}
catch (SqlException ex)
{
tran.Rollback();
Console.WriteLine(“错误,事务回滚!" );
}
(3).本地事务优点:
<1>.简单性;
<2>. 和数据库事务差不多的快;
<3>.独立于数据库,不同数据库的专有代码被隐藏了。
(4).本地事务缺点:
<1>.事务不能跨越多个数据库连接;
<2>. 事务执行在数据库连接层上;
<3>.需要在事务过程中维护一个数据库连接。
3.分布式事务
(1).分布式事务特点:
<1>. 本地事务必须在同一个数据库内,这样出现错误的时才能回滚到初始状态;
<2>. 在分布式应用程序中,我们往往需要同时操作多个数据库;
<3>.本地事务很难满足多个数据库对事务控制的要求;
<4>. 分布式事务很容易处理多个数据库对事务控制。
(2).System.Transactions。
<1>.System.Transactions 它是一种处理分布式事务的新方式。
<2>.System.Transactions 使得在WINFORM与ASP.NET 应用程序中编程和部署分布式应用程序变得十分简单。
<3>.System.Transactions能够检测到某个分布式事务何时针对宿主在一个SQL Server 2008 实例上的两个不同数据库运行。
<4>.它能够将该分布式事务提升为一个本地事务
<5>.可避免与分布式事务登录/两阶段提交相关的全部开销,从而极大地提高性能。 (3).使用TransactionScope处理分布式事务:
using(TransactionScope scope = new TransactionScope())
{ //Perform transactional work here //No errors - commit transaction
scope.Complete();
}
补充信息:
一、介绍连接的和断开连接的环境
1.连接环境
(1)连接的环境是用户或应用程序持续连接到数据源的环境;
(2). 连接的环境提供以下优势:
<1>.数据并发性问题更容易控制;
<2>. 数据是当前的和更新的;
(3).连接的环境具有以下限制:
<1>.续的网络连接有时可能导致网络流量阻塞 ;
<2>.应用程序中的可扩展性和性能问题 ;
2、断开环境
(1).断开连接的环境是在其中用户或应用程序不是直接连接到数据源的环境。
(2). 断开连接的环境提供以下优势:
<1>.允许多个应用程序同时与数据源进行交互;
<2>.提高可扩展性和应用程序的性能;
(3). 断开连接的环境具有以下限制:
<1>.由于没有与数据源建立连接,数据不是总保持最新;
<2>.当多个用户向数据源更新数据时,可能会发生数据并发性问题;
二、对于类型化数据集和非类型化数据集
1、类型化数据集
(1).特点:
<1>.类型化数据集来自于 DataSet 类,具有关联的 XML 模式,其在创建数据集时创建;
<2>. XML 模式包含关于数据集结构的信息,如表、列和行;
<3>. XML 模式定义 (XSD) 语言用来定义 XML 文档的元素和属性;
<4>. 类型化数据集的结构在其创建时所决定;
<5>.当类型化数据集创建时,通过使用来自数据源的列名自动生成数据命令。
(2).优缺点:
<1>. 开发人员编写的代码少且容易编写代码;
<2>. 编译期间检测错误,减少了运行错误;
(3).在创建、填充和访问需要更多的时间。
2、非类型化数据集
(1).特点:
<1>.非类型化数据集没有相关的 XML 模式;
<2>. 在非类型化数据集中,表和列表示为集合;
<3>. 因为没有为非类型化数据集创建 XML 模式,非类型化数据集的结构在编译期间是未知的;
<4>.非类型化数据集用在编译期间没有决定模式的结构或使用的数据没有明确的结构的情况。
3、 如何选择呢?
(1). 如果应用程序的性能和控制绝对是最先考虑的事项,那么应当仅使用非类型化dataSet对象和sqlDataAdpter;
(2).如果牺牲一部分性能来节省开发时间,那么就考虑使用强类型dataSet。
三、我们常把与数据库建立连接的字符串放入应用程序配置文件!
步骤如下:
1、添加应用程序配置文件 app.config
2.编辑app.config,添加数据库连接串如:
<connectionStrings>
<add name="conStr" connectionString="data source=.;initial catalog=studentdb;integrated security=true"/>
</connectionStrings>
3.添加System.Configuration 程序集的引用
4.添加System.Configuration名称空间
5.读取连接串:
ConfigurationManager.ConnectionStrings["conStr"].ToString(); //“conStr”是app.config文件中add元素的name属性
前几天,帮一个网友,做了一个小程序,写着写着就停下来了!给他把程序做完后,又继续写完的!本来昨晚就会发上来的,可是学校到点,停电、停网,只能这时候发出来的!我们通常在使用ADO.NET时,通常写一个SqlHelper类,数据访问层,封装好对应的操作,便于调用与维护,我想还是别把我常用的SqlHelper类往外贴了写的不是很好,赫赫! 在网上搜了一下,有不少人写过博客来写SqlHelper类,自己找了一个比较好的,或许你能找到更好的,他人写的好东西,我们多多学习吧!
(题外话:其实感觉,你如果对某一个对象、某一个类的常用属性和方法,不记得或不太熟悉,实例化一个对象实体,然后对象点去查找。感觉微软的VS做的还是挺好的,很好的智能提示,我们可以查找到对应的属性和方法,也可以查看对应的功能,当然我们不能过分的依赖与这些,这会让我们思维变懒的。基础就是微软给的那些对象,感觉主要的是如何灵活调用,适当使用,还有很多的方法需我们自己去写,自己组织,短小精悍的方法(函数)才是一个程序员正真能力的体现!)
这是链接:(感兴趣的话,可以看一下啊!)
MSSQL数据库C#操作类(SQLHELPER类的修改版) :
ACCESS数据库C#操作类(SQLHELPER修改版):
http://www.gisera.com/(S(4i1smiuui4wozjuyutxqfoie))/Blog/article.aspx?id=67