关于webform的数据访问的学习小结 (转载)

学习了一段时间的基于webform的数据库编程(其实windowform也差不多),还是个新手.在此作一个大概的总结,为的是加深理解,找到不足的地方,继续学习。同时希望这篇文章能对一个跟我一样也是新手的朋友学习这方面的知识起到积极的作用。
所讨论的范围非常限制于我这方面的知识,希望大家多多指出差异之处。
在总结的过程中,引用了一部分网上的代码,同时加入了一些我对他们的理解。


基于webform的数据访问的原理简单的讲就是两步:
一.将数据从数据库中取出来作为数据源。
数据源的分类: dataview,dataset,sqldatareader,oledbdatareader,数组,数组列表,其它属于System.collection的类.
二.将数据源绑定到数据控件上去显示出来和作其它用途.
数据控件分类: datagrid,datalist,repeater...

详细说明:
一.从数据库取数据的方法:
1.sqldatareader(oledbdatareader类似):
 (1).简要说明:sqldatareader提供一种从数据库读取只进的行流的一种方式.关于此类的msdn的说明如下:
    若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不直接使用构造函数。
当正在使用 SqlDataReader 时,关联的 SqlConnection 在忙于服务 SqlDataReader,而且除了关闭以外不能对 SqlConnection 执行其他任何操作。除非调用 SqlDataReader 的 Close 方法,否则会一直处于此状态。例如,在调用 Close 之前,无法检索输出参数。
    在数据读取过程中由另一个进程或线程对结果集所作的更改可能对于 SqlDataReader 的用户可见。但是,确切的行为与执行时间有关。
    当 SqlDataReader 关闭后,只能调用 IsClosed 和 RecordsAffected 属性。尽管可以在 SqlDataReader 存在时随时访问 RecordsAffected 属性,但始终应该在返回 RecordsAffected 的值之前调用 Close,以确保正确的返回值。
    为了获得最佳性能,SqlDataReader 会避免创建不必要的对象或复制不必要的数据。结果,对 GetValue 等方法的多次调用将返回对相同对象的引用。如果正在修改由 GetValue 等方法返回的对象的基础值,请使用警告。
  (2).取数据的方法:
   * String  CONstr= "workstation id=计算机的网络标识或IP;packet size=4096;user id=sa;initial

catalog=数据库名;persist security info=True;password=密码"; //连接用的字符串
   * sqlConnection1 = new SqlConnection(str);//创建一个sqlConnection1对象
   * String SQLstr="要执行的sql语句";
   * SqlCommand sqlCommand1= new SqlCommand(SQLstr,sqlConnection1);
   * sqlConnection1.Open();//打开数据库连接
   * SqlDataReader reader1=sqlCommand1.ExecuteReader();//调用 SqlCommand 对象的 ExecuteReader

方法以创建一个sqlDataReader对象。
   * reader1.Read()//逐条读取记录
   * sqlConnection1.Close();//关闭连接。


2.dataset.
  (1).简要说明:离线数据集.它是为解决DataReader的缺陷设计的,DataReader数据处理速度快,但它是只读的, 而且一旦移

到下一行,就不能查看上一行的数据,DataSet则可以自由移动指针。DataSet还可用于多层应用程序中,如果应用程序运行在中

间层的业务对象中来访问数据库,则业务对象需将脱机数据结构传递给客户应用程序。
 DataSet的功能:浏览、排序、搜索、过滤、处理分级数据、缓存更改等。还可以与XML数据互换。DataSet中可包括多个Da

taTable,可将多个查询结构存到一个DataSet中,方便操作,而DataTable中又包括多个DataRow、DataColumn,可通过这些Data

Row、DataColumn来查看、操作其中的数据,而需将操作结果返回给数据库的话,则可以调用DataAdapter的Update方法。


 (2).取数据的方法vs.net提供全程图形化向导“数据适配器”,可以轻松从数据库取出数据。


 (3).关于dataset的详细说明和使用方法:
     * dataset的结构: 一个dataset可以由多个表(dataset)数据表组成,一个数据表又包含多个行和列,约束,关系等。
       我的理解是: 1*DataSet----n*DataTable----n*n*DataRow/DataColumn/Constraint/Relation

     *常用属性及方法:
DataTable常用属性:
屬性                                                   說明
AllNull                              傳回或設定DataColumn是否接受Null值
AutoIncrement                  傳回或設定當加入DataRow時,否要自動增加欄位值
AutoIncrementSeed          傳回或設定DataColumn的遞增種子
AutoIncrementSupported   傳回DataColumn是否支援自動遞增
Caption                            傳回或設定DataColumn的標題
ColumnName                   傳回或設定在DataColumns集合中欄位的名稱
DataType                         傳回或設定DataColumn的資料型態
DefaultValue                    傳回或設定DataColumn的預設值
Ordinal                            傳回欄位集合中DataColumn的順序
ReadOnly                        傳回或設定DataColumn是否為唯讀
Table                              傳回DataColumn所屬DataTable物件的參考
Unique                            傳回或設定DataColumn是否不允許重複的資料

DataTable常用方法:
方法                                                  說明
AcceptChanges                        確定DataTable所作的改變
Clear                                      清除DataTable內所有的資料
NewRow                                  增加一筆新的記錄

DataColumn常用属性:
屬性                                                  說明
AllNull                              傳回或設定DataColumn是否接受Null值
AutoIncrement                  傳回或設定當加入DataRow時,否要自動增加欄位值
AutoIncrementSeed          傳回或設定DataColumn的遞增種子
AutoIncrementSupported   傳回DataColumn是否支援自動遞增
Caption                            傳回或設定DataColumn的標題
ColumnName                   傳回或設定在DataColumns集合中欄位的名稱
DataType                         傳回或設定DataColumn的資料型態
DefaultValue                    傳回或設定DataColumn的預設值
Ordinal                            傳回欄位集合中DataColumn的順序
ReadOnly                        傳回或設定DataColumn是否為唯讀
Table                              傳回DataColumn所屬DataTable物件的參考
Unique                            傳回或設定DataColumn是否不允許重複的資料

DataRow常用属性:
屬性                                                 說明
Item                                傳回或設定DataRow內DataColumn的資料
ItemArray                       以陣列的方式傳回或設定所有DataColumn內容
RowState                       傳回或設定DataRow的狀態


   *.在程序运行过程中,一个已填充的dataset,可以通以以下方式去访问其中的任意一个元素:
     DataSet.Table.Rows(i),i是一个变量,通过改变其值来访问不同的元素。
     dataSet.表名[行号].字段名   或                 
     dataSet.Tables["表名"].Rows[行号]["列名"]

//向dataset中添加一个dataTable
DataSet ds=new DataSet();
DataTable dt=new DataTable("newTable");
ds.Tables.Add(dt);DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTable");

//向一个dataTable中添加一个列,并指定一些属性
DataSet ds=new DataSet();
DataTable dt=ds.Tables.Add("newTables");
DataColumn col=dt.Columns.Add("newColumn",typeof(int));
col.AllowDBNull=false;
col.MaxLength=4;
col.Unique=true;

//向一个dataTable中添加一个或多个主键
dt.PrimaryKey=new DataColumn[]{dt.Columns["ID"]}
dt.PrimaryKey=new DataColumns[]{dt.Columns["OrderID"],dt.Columns["ProductID"]}

//向一个dataTable添加外键
ForeignKeyConstraint fk;
fk=new

ForeignKeyConstraint(ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
ds.Tables["Orders"].Constraints.Add(fk);

//修改DataRow的方法:
以下代码通过Row集合的Find方法来在DataTable中的行进行定位,找到"ANTON"行,再修改"ANTON"行中CompanyName列和ContactName列的值,注意此datarow的FIND操作相当于在主键列寻找值为"ANTON"的行。通过BeginEdit和EndEdit来缓存对行的修改,还可调用 CancelEdit为取消修改。
DataRow dr=ds.Tables["Customer"].Rows.Find("ANTON");
if(dr==null)
else
{
dr.BeginEdit();
dr["CompanyName"]="newValue";
dr["ContactName"]="newValue2";
dr.EndEdit();
}


//删除DataRow的方法:
有两种方法可以删除DataRow,Delete方法和Remove方法和RemoveAt方法。其区别是Delete方法实际上不是从DataTable中删除掉一行,而是将其标志为删除,仅仅是做个记号,而Remove方法则是真正的从DataRow中删除一行,RemoveAt方法是根本行的索引来删除。示例如下(dr 为"a"所在的行,查出后将其删除,index为 "a"所在的索引号):
DataRow dr=ds.Tables["table"].Rows.Find("a");
ds.Tables["table"].Remove(dr);

ds.Tables["table"].Remove(index);


//关于dataset的更新
(1).创建一个新的用于暂存修改数据的dataset集合:dataset

changedataset=ds(原数据集).GetChanges(DataRowState.Modified)
                ---------检测DataSet中的HasErrors属性,无错返回执行下一步,有错则继续检查此DataSet中各DataTable的

HasErrors属性,无错返回检查其它DataTable,有错则检查DataTable中的每一个datarow对象的RowError属性。
(2).将修改后的dataset合并入原来的DataSet中:ds.Merge(changedataset);
                 --------确认修改:       dataset.AcceptChanges
(3).最后使用数据适配器将dataset的数据写入原数据库中:
sqlDataaDapter.UpDate(DataSet)

//杂
当在vs.net编辑器中拖动一个sqlDataAdapter至窗口时,系统会自动生成其insert,select,update.delete语句,以用于对数据

库进行操作,例如可以通过以下方式来存取数据库:
string mm=DateTime.Now .ToString ();
string co="server=prgserver;user id=prg;password=prg;database=aq";
SqlConnection sqlConnection1=new  SqlConnection (co );
string ins="insert into T_DfEmployeeHistory (id,C_EmpName,C_CorpName,

c_DepartmentName,c_bookId,C_checkOrg,C_checkDate,C_Class,C_show) values('"+mm+"','"+TextBox1.Text

.Trim()+"','"+TextBox2.Text .Trim()+"','"+TextBox3.Text .Trim()+"','"+TextBox4.Text .Trim()+"','"+TextBox5.Text

.Trim()+"','"+TextBox6.Text+"','"+TextBox7.Text .Trim()+"','"+TextBox8.Text .Trim()+"')";
SqlDataAdapter sqlDataAdapter1=new SqlDataAdapter (ins,sqlConnection1);
sqlDataAdapter1.InsertCommand =new SqlCommand (ins,sqlConnection1);

二.将数据源绑定到数据控件
有了以上取出的数据源就可以作下一步工作数据绑定了,下面两句就可以将一个已存在的数据源绑定到datagrid中去:
datagrid.DataSource = someDataSource
datagrid.DataBind()  
   当将数据源绑定至Datagrid时:
(1).若数据源是DataTable则绑定此DataTable的DefaultView。           
(2).若数据源是dataSet时,是将DataGrid的DataMember属性设置为dataSet中的一个表,再将此表的DefaultView绑定到DataGrid.

posted @ 2005-09-29 15:32  E℃空间  阅读(695)  评论(1编辑  收藏  举报