(摘自奇猫居-神游天地间)
数据源:通常指的是一个关系数据库,如SQLserver等
提供者对象:
____________________________________________________________________________________________________________________
1、Connection:连接对象,主要用于连接数据源,建立一个页面程序与数据库驱动的通信管道。 通过Open()方法打开连接字符串中的连接
>> 连接字符串包含3各部分的信息:
>> 第一部分指定要使用的供应程序或驱动程序的种类 //server=localhost
>> 第二部分指定要使用的数据库 //database=Mydatabase
>> 第三部分通常包含安全信息,包括用户名,密码等 //uid=foolboy;pwd=Mypasswd
数据库连接:
SQL Server数据库:
SqlConnection thisConnection = new SqlConnection(@"Data Source=(local);Integrated Security=SSPI;Initial Catalog=数据库名");
thisConnection.Open();
//中间代码
thisConnetion.Close();
更通用的方法:
string MySqlConnection="user id=sa;password=sinofindb;Database =test;data source=127.0.0.1;Connect Timeout=30";
SqlConnection myConnection = new SqlConnection(MySqlConnection);
myConnection.Open();
Access数据库:
OleDbConnection thisConnection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=数据库地址");
thisConnection.Open();
//中间代码
thisConnetion.Close();
连接Oracle(也可通过OracleConnection连接)
string MySqlConnection="Provider=MSDAORA;Data Source=db; user id=sa;password=sinofindb";
____________________________________________________________________________________________________________________
2、Command:命令对象,一个包含读写数据指令的工具
使用Command参数
Connection 包含数据仓库连接的细节
CommandText 要运行的命令
CommandType 命令的类型 Sql字符或存储过程的名称
Text 表示文本字符串sql
TableDirect 表示表名
StoredProcedure 表示存储过程的名称
Parameters Parameters对象的一个集合
______________________
ExecuteReader
返回一行或多行
ExecuteNonQuery
对 Connection 执行 Transact-SQL 语句并返回受影响的行数(int)
ExecuteScalar
返回单个值(如一个聚合值).返回结果集中第一行的第一列。忽略额外的列或行
ExecuteXmlReader
将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。
______________________
SqlCommand
Ⅰ属性
①CommandText: 要执行的 Transact-SQL 语句或存储过程。默认为空字符串。
②CommandTimeOut: 等待命令执行的时间(以秒为单位)。默认为 30 秒。
③CommandType: CommandType 值之一。默认值为 Text。
④Connection: 与数据源的连接。默认值为空引用
⑤Parameters: Transact-SQL 语句或存储过程的参数。默认为空集合。
⑥Transaction:指定用于查询的事务处理
⑦UpdateRowSource:如果通过调用DataAdapter对象的Update方法来使用Command,那么该属性就用于控制影响当前DataRow的查询结果(默认值为Both)
Ⅱ方法
①Cancel: 试图取消SqlCommand的执行。如果没有要取消的内容,则什么都不会发生。但如果有命令正在执行,而取消尝试失败,则不会生成异常。Cancel方法还会导致Command对象删除DataReader对象上所有未读的行。
②CreateParameter:为查询创建一个新参数。
③ExecuteNonQuery:对连接执行Transact-SQL语句并返回受影响的行数。对于 Update、Insert 和 Delete 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。
④ExecuteReader:将CommandText发送到Connection并生成一个SqlDataReader。public SqlDataReader ExecuteReader(CommandBehavior);
⑤ExecuteScalar:执行查询,并返回查询所返回的结果集中第一行的第一列。忽略额外的列或行。
⑥ExecuteXmlReader:将CommandText发送到Connection并生成一个XmlReader。
⑦PrePare:在 SQL Server 的实例上创建命令的一个准备版本。在调用 Prepare 之前,应指定要准备的语句中的每个参数的数据类型。
⑧ResetCommandTimeOut:将CommandTimeout属性设置为默认值30秒。
________________________________________________________________________________________
oleDbCmd.CommandText = "Select FirstName,LastName FROM Employees Where (LastName LIKE @Find)";
oleDbCmd.Parameters["@Find"].Value="张三";
ExecuteScalar()方法:
Command中的ExecuteScalar()方法执行查询时,结果仅返回一个标量的SQL命令(标量即单一值,相对于ExecuteReader()所返回的多行,即只返回一条记录),如下
SqlCommand thisCommand=thisConnection.CreateCommand();
thisCommand.CommandText="select count(*) from 表";
Object countResult=thisCommand.ExecuteScalar();
Console.WriteLine("记录数为{0}条",countResult);
ExecuteNonQuery()方法:
Command中的ExecuteScalar()方法执行查询时,根本不返回任何数据的命令,只返回执行命令后数据库受影响的行数,如下
SqlCommand thisCommand=thisConnection.CreateCommand();
thisCommand.CommandText="update 表 set 字段=值 where .... ";
int rowsAffected=thisCommand.ExecuteNonQuery();
Console.WriteLine("更新的记录(受影响的记录)有{0}条",rowsAffected);
____________________________________________________________________________________________________________________
3、CommandBuilder对象:CommandBuilder --与DateAdapter配套,用于自动生成SQL
OleDbCommandBuilder objBuilder = new OleDbCommandBuilder(DataAdapter)
表示告诉命令生成器可以在哪儿取到SelectCommand,以建立其他的命令.
DataAdapter.UpdateCommand = objBuilder.GetUpdateCommand();
DataAdapter.InsertCommand = objBuilder.GetInsertCommand();
DataAdapter.DeleteCommand = objBuilder.GetDeleteCommand();
注意在这种情况下,SelectCommand必需带有一个主键字段
____________________________________________________________________________________________________________________
4、DateReader对象:从数据源中读取仅能前向和只读的数据流
Command主要用于运行命令
DataAdapter主要用于为多个命令提供一个存储空间,在数据仓库和DataSet之间提供双向交互。
一个Command对象只能处理查询,添加,删除,修改中的一种
因此 DataAdapter用四个属性存储四种Command对象
属性如下 SelectCommand,UpdateCommand,InsertCommand,DeleteCommand
如果已经完成读取来自DataReader的数据,但仍然有大量挂起的未读结果,就在调用DataReader的Close之前先调用Command的Cancel。调用DataReader的Close会导致在关闭游标之前检索挂起的结果并清空流。调用Command的Cancel会放弃服务器上的结果,这样,DataReader在关闭的时候就不必读这些结果。如果要从Command返回输出参数,还要调用Cancel放弃它们。如果需要读取任何输出参数,不要调用Command的Cancel,只要调用DataReader的Close即可。
______________________
SqlDataReader
Ⅰ属性
①Depth:获取一个值,该值指示当前行的嵌套深度。最外层表的深度为零。SQL Server .NET Framework 数据提供程序不支持嵌套并总是返回零值。
②FieldCount:获取当前行中的列数。如果未放在有效的记录集中,则为 0;否则为当前行中的列数。默认值为 -1。执行不返回行的查询后,FieldCount 返回 0。
③HasRows:如果SqlDataReader包含一行或多行,则为true;否则为false。
④IsClosed:如果SqlDataReader已关闭,则为true;否则为false。
⑤Item:获取以本机格式表示的列的值。
⑥RecordsAffected:已更改、插入或删除的行数;如果没有任何行受到影响或语句失败,则为 0;-1 表示 Select 语句。
Ⅱ方法
①Close:关闭SqlDataReader对象。如果返回值和查询影响的记录的数量不重要,则可以在调用Close方法前调用关联的SqlCommand对象的Cancel方法,从而减少关闭SqlDataReader所需要的时间。
②GetName:获取指定列的名称。
③GetOrdinal:在给定列名称的情况下获取列序号。
④GetValue:获取以本机格式表示的指定列的值。
⑤GetValues:获取当前行的集合中的所有属性列。
⑥IsDBNull:获取一个值,该值指示列中是否包含不存在的或缺少的值。如果指定的列值与DBNull等效,则为true;否则为false。
⑦NextResult:当读取批处理 Transact-SQL 语句的结果时,使数据读取器前进到下一个结果。如果存在多个结果集,则为 true;否则为 false。
⑧Read:使SqlDataReader前进到下一条记录,如果存在多个行,则为true;否则为false。必须调用Read来开始访问任何数据。在某一时间,每个关联的SqlConnection只能打开一个SqlDataReader,在上一个关闭之前,打开另一个的任何尝试都将失败。
Ⅲ事件
SqlParameter
Ⅰ属性
①DbType:获取或设置参数的DbType。默认值为String。
②Direction:获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。默认值为 Input。
③IsNullable:获取或设置一个值,该值指示参数是否接受空值。如果接受空值,则为 true;否则为 false。默认为 false。
④ParameterName:获取或设置 SqlParameter 的名称。
⑤Size:获取或设置列中数据的最大大小(以字节为单位)。默认值是从参数值推导出的。
⑥SqlDbType:获取或设置参数的SqlDbType。默认为NVarChar。SqlDBType和DbType是相互连接的。设置DBtype会将SqlDbType更改为支持的SqlDbType。
⑦Value:获取或设置该参数的值。默认为空。
____________________________________________________________________________________________________________________
5、DateAdapter:用于执行针对数据源的各种操作,包括更新变动的数据,填充数据集以及其他操作,用于结果从Connection传给Dataset。Fill()方法把数据拷贝到DataSet中, Update()方法把DataSet中的数据烤回数据源。
如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。
多次调用Fill方法
刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。
1、属性
①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。
②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。
2、方法
①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
3、事件
①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
②RowUpdated:向数据库提交一个修改的行之后被触发。
③RowUpdating:向数据库提交一个修改的行之前被触发。
DataAdapter.Update(DataSet,"表名");
查看调用SqlDataAdapter.Fill创建的结构
da.Fill(ds,"Orders");
DataTable tbl = ds.Table[0];
foreach(DataColumn col in tbl.Columns)
Console.WriteLine(col.ColumnName);
********************************************************************************************************************
用户对象:
____________________________________________________________________________________________________________________
1、DataSet:将相关表读取到内存中,存储已读出或写入数据的地方, DataSet表示数据库中的数据,与DataReader不同它可以存储几个表和他们之间的关系。核心对象,建立多表之间的adhoc关系,可以一表中的一行和另一表的一行关联起来。
创建DataSet对象:DataSet ds = new DataSet("DataSetName");
①、属性
CaseSensitive:用于控制DataTable中的字符串比较是否区分大小写。
DataSetName:当前DataSet的名称。如果不指定,则该属性值设置为"NewDataSet"。如果将DataSet内容写入XML文件,DataSetName是XML文件的根节点名称。
DesignMode:如果在设计时使用组件中的DataSet,DesignMode返回True,否则返回False。
HasErrors:表示DataSet中的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的 ContinueUpdateOnError属性设置为True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。
NameSpace和Prefix:指定XML命名空间和前缀
Relations:返回一个DataRelationCollection对象。
Tables:检查现有的DataTable对象。通过索引访问DataTable有更好的性能。
②、方法
AcceptChanges和RejectChanges:接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged.任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。
Clear:清除DataSet中所有DataRow对象。该方法比释放一个DataSet然后再创建一个相同结构的新DataSet要快。
Clone和Copy:使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。
GetChanges:返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。
GetXml和GetXmlSchema:使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。
HasChange:表示DataSet中是否包含挂起更改的DataRow对象。
Merge:从另一个DataSet、DataTable或现有DataSet中的一组DataRow对象载入数据。
ReadXml和WriteXml:使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。
Reset:将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet,使用Reset方法比创建一个DataSet的新实例好。
③、事件
MergeFailed:在DataSet的Merge方法发生一个异常时触发。
____________________________________________________________________________________________________________________
2、DataTable:代表在DataSet中的一个表,DataTable对象只能存在于至多一个DataSet对象中。如果希望将DataTable添加到多个DataSet中,就必须使用Copy方法或Clone方法。Copy方法创建一个与原DataTable结构相同并且包含相同行的新DataTable;Clone方法创建一个与原DataTable结构相同,但没有包含任何行的新DataTable。
①、属性
②、方法
③、事件
ColumnChanged:在列的内容被改变之后触发
ColumnChangding:在列的内容被改变之前触发
RowChanged,RowChanging,RowDeleted,RowDeleting。
______________________
将DataTable添加到DataSet对象的Table集合
DataSet ds = new DataSet();
DataTable tbl = new DataTable("Customers");
ds.Tables.Add(tbl);
DataSet ds = new DataSet();
DataTable tbl = ds.Tables.Add("Customers");
____________________________________________________________________________________________________________________
3、DataRow:代表来自表的关联数据的一行
①、属性
HasError:确定行是否包含错误。
Item:通过指定行的列数,列的名称或DataColumn对象本身,访问列的内容。
ItemArray:获取或设置行中所有列的值。
RowError:返回一个包含行错误信息的字符串。
RowState:返回DataRowState枚举中的值来表示行的当前状态。
Table:返回DataRow对象所在的DataTable。
②、方法
AcceptChanges和RejectChanges:提交和放弃挂起更改。
BeginEdit、CancelEdit、EndEdit
ClearErrors:清除DataRow中所有的错误。
Delete:Delete方法实际上并不从DataRow表的Row集合中删除该DataRow。当调用DataRow对象的Delete方法时,ADO.NET将该行标记为删除,之后调用SqlDataAdapter对象的Update方法来删除其在数据库中对应的行。如果希望彻底删除DataRow,可以调用Delete方法,接着再调用它的AccepteChanges方法,还可以使用DataRowCollection对象的Remove方法完成相同的任务。
DataTable tbl = ds.Table[0];
DataRow row = tbl.Row[0];
Console.WriteLine(ros["OrderID"]);
DataTable tbl = row.Table;//row是行,row.Table返回的是row所在的表
foreach(DataColumn col in tbl.Columns)
Console.WriteLine(row[col]);
______________________
添加新DataRow
DataRow row = ds.Tables["Customers"].NewRow();
row["CustomerID"] = "ALFKI";
ds.Tables["Customers"].Rows.Add(row);
______________________
修改当前行
修改行的内容逼供内不会自动修改数据库中相应的内容,对行所做的修改被视为是随后将使用SqlDataAdapter对象来提交交给数据库的待定的更改。
DataRow rowCustomer;
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");
if(rowCustomer == null)
//没有查找客户
else
{
rowCustomer["CompanyName"] ="NewCompanyName";
rowCustomer["ContactName"] ="NewContactName";
}
//推荐使用这种方式
DataRow rowCustomer;
rowCustomer = ds.Tables["Custoemrs"].Rows.Find("ANTON");
if(rowCustomer == null)
//没有查找客户
else
{
rowCustomer.BeginEdit();
rowCustomer["CompanyName"] ="NewCompanyName";
rowCustomer["ContactName"] ="NewContactName";
rowCustomer.EndEdit();
}
//null表示不修改该列的数据
obejct[] aCustomer ={null,"NewCompanyName","NewContactName",null}
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
③、处理DataRow的空值
//查看是否为空
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
if(rowCustomer.IsNull("Phone"))
Console.WriteLine("It's Null");
else
Console.WriteLine("It's not Null");
//赋予空值
rowCustomer["Phone"] = DBNull.Value;
④、删除DataRow
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.Delete();
⑤、清除DataRow
DataRow rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
da.Tables["Customers"].Remove(rowCustomer);
或者
ds.Tables["Customers"].RemoveAt(intIndex);
____________________________________________________________________________________________________________________
4、DataColumn:代表表中的一列
①、为DataTable添加列
DataTable tbl = ds.Tables.Add("Orders");
DataColumn col =tbl.Columns.Add("OrderID",typeof(int));
col.AllowDBNull = false;
col.MaxLength = 5;
col.Unique = true;
tbl.PrimaryKey = new DataColumn[]{tbl.Columns["CustomersID"]};
②、处理自动增量列
DataSet ds = new DataSet();
DataTable tbl = ds.Tables.Add("Orders");
DataColumn col = tbl.Columns.Add("OrderID",typeof(int));
col.AutoIncrement = true;
col.AutoIncrementSeed = -1;
col.AutoIncrementStep = -1;
col.ReadOnly = true;
③、添加基于表达式的列
tbl.Columns.Add("ItemTotal",typeof(Decimal),"Quantity*UnitPrice");
____________________________________________________________________________________________________________________
5、DataRelation:代表通过共享列而发生关系的两个表之间的关系
____________________________________________________________________________________________________________________
6、DataView: 表示DataSet中存储的DataTables的特定视图, 其中DataViewRowState数据视图的操作属性 包括Deleted, ModifiedCurrent,Added,Unchanged等
foreach (DataRowView myrowview in myview)
{
for (int i = 0; i < myview.Table.Columns.Count; i++)
Console.Write(myrowview [i] + "/t");
Console.WriteLine();
}
____________________________________________________________________________________________________________________
7、DataGrid: 等的DataSource最终只绑定到某具体DataView上