SADataAdapter 会将结果集检索到一个 DataSet 中。DataSet 是表以及这些表之间的关系和约束的集合。DataSet 内置在 .NET Framework 中,与用于连接数据库的数据提供程序无关。
使用 SADataAdapter 时,必须连接到数据库以填充 DataSet 并使用对 DataSet 的更改更新数据库。不过,填充 DataSet 后,可以在 DataSet 与数据库断开的情况下对其进行修改。
如果不希望立即将更改应用到数据库,可以使用 WriteXML 方法将 DataSet(包括数据和/或模式)写入 XML 文件。这样,以后就可以通过使用 ReadXML 方法装载 DataSet 来应用更改。
有关详细信息,请参见 .NET Framework 文档中 WriteXML 和 ReadXML 的部分。
调用 Update 方法将 DataSet 的更改应用于数据库时,SADataAdapter 会对已经做出的更改进行分析,然后根据需要调用相应的 INSERT、UPDATE 或 DELETE 语句。使用 DataSet 时,只能对一个表中的数据进行更改(插入、更新或删除)。不能更新基于连接的数据集。如果其他用户锁定了您试图更新的行,则将抛出异常。
对 DataSet 所做的所有更改都是在断开连接的情况下完成的。这意味着应用程序未锁定数据库中的这些行。如果在您的更改应用到数据库之前其他用户更改了您正修改的数据,则在将 DataSet 的更改应用到数据库时,会出现一些冲突。您的应用程序必须设计为能够解决这样的冲突。
使用 SADataAdapter 时,不会锁定数据库的行。这意味着将来自 DataSet 的更改应用到数据库时可能会引起冲突。应用程序中应包含解决或记录产生的冲突的逻辑。
应用程序逻辑应解决的一些冲突如下:
唯一主键 如果两个用户向一个表中插入新行,则每个行都必须有一个唯一的主键。对于包含自动增量主键的表,DataSet 中的值可能与数据源中的值不同步。
有关获取自动增量主键的主键值的信息,请参见获取主键值。
对同一值的更新 如果两个用户修改同一值,则应用程序应包含用于决定哪个值正确的逻辑。
模式更改 如果某个用户修改已在 DataSet 中更新的表的模式,则在将更改应用于数据库时,更新会失败。
数据并发 并发应用程序应看到一致的数据集。SADataAdapter 不会锁定其读取的行,因此在您检索了 DataSet 并且脱机工作时,其他用户可以更新数据库中的值。
许多这样的潜在问题都可通过使用 SACommand、SADataReader 和 SATransaction 对象将更改应用到数据库来避免。建议使用 SATransaction 对象,因为它允许您设置事务的隔离级别,并将行锁定,这样其他用户便无法修改这些行。
有关使用事务将更改应用于数据库的详细信息,请参见使用 SACommand 对象插入、更新和删除行。
若要简化冲突解决过程,可以自行设计 INSERT、UPDATE 或 DELETE 语句作为存储过程调用。通过在存储过程中包含 INSERT、UPDATE 和 DELETE 语句,可以捕获操作失败时的错误。除了语句外,还可以在存储过程中添加错误处理逻辑,以便在操作失败时采取适当行动,例如将错误记录到日志文件,或再次尝试操作。
声明并初始化一个 SAConnection 对象。
SAConnection conn = new SAConnection( c_connStr ); |
打开该连接。
conn.Open(); |
创建一个新的 SADataAdapter 对象。
SADataAdapter adapter = new SADataAdapter(); adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.Add; |
创建必需的 SACommand 对象并定义所有必需的参数。
以下代码创建一条 SELECT 和一条 INSERT 语句,并定义 INSERT 语句的参数。
adapter.SelectCommand = new SACommand( "SELECT * FROM Departments", conn ); adapter.InsertCommand = new SACommand( "INSERT INTO Departments( DepartmentID, DepartmentName ) VALUES( ?, ? )", conn ); adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; SAParameter parm = new SAParameter(); parm.SADbType = SADbType.Integer; parm.SourceColumn = "DepartmentID"; parm.SourceVersion = DataRowVersion.Current; adapter.InsertCommand.Parameters.Add( parm ); parm = new SAParameter(); parm.SADbType = SADbType.Char; parm.SourceColumn = "DepartmentName"; parm.SourceVersion = DataRowVersion.Current; adapter.InsertCommand.Parameters.Add( parm ); |
用 SELECT 语句的结果填充 DataTable。
DataTable dataTable = new DataTable( "Departments" ); int rowCount = adapter.Fill( dataTable ); |
将新行插入到 DataTable 并将更改应用于数据库。
DataRow row1 = dataTable.NewRow(); row1[0] = 600; row1[1] = "Eastern Sales"; dataTable.Rows.Add( row1 ); DataRow row2 = dataTable.NewRow(); row2[0] = 700; row2[1] = "Western Sales"; dataTable.Rows.Add( row2 ); recordsAffected = adapter.Update( dataTable ); |
显示更新的结果。
dataTable.Clear(); rowCount = adapter.Fill( dataTable ); dataGrid.DataSource = dataTable; |
关闭该连接。
conn.Close(); |
声明并初始化一个 SAConnection 对象。
SAConnection conn = new SAConnection( c_connStr ); |
打开该连接。
conn.Open(); |
创建一个新的 SADataAdapter 对象。
SADataAdapter adapter = new SADataAdapter(); adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.Add; |
创建 SACommand 对象并定义其参数。
以下代码创建一条 SELECT 和一条 UPDATE 语句,并定义 UPDATE 语句的参数。
adapter.SelectCommand = new SACommand( "SELECT * FROM Departments WHERE DepartmentID > 500", conn ); adapter.UpdateCommand = new SACommand( "UPDATE Departments SET DepartmentName = ? WHERE DepartmentID = ?", conn ); adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; SAParameter parm = new SAParameter(); parm.SADbType = SADbType.Char; parm.SourceColumn = "DepartmentName"; parm.SourceVersion = DataRowVersion.Current; adapter.UpdateCommand.Parameters.Add( parm ); parm = new SAParameter(); parm.SADbType = SADbType.Integer; parm.SourceColumn = "DepartmentID"; parm.SourceVersion = DataRowVersion.Original; adapter.UpdateCommand.Parameters.Add( parm ); |
用 SELECT 语句的结果填充 DataTable。
DataTable dataTable = new DataTable( "Departments" ); int rowCount = adapter.Fill( dataTable ); |
使用行的更新值更新 DataTable,并将更改应用到数据库。
foreach ( DataRow row in dataTable.Rows ) { row[1] = ( string ) row[1] + "_Updated"; } recordsAffected = adapter.Update( dataTable ); |
将结果绑定到屏幕上的网格。
dataTable.Clear(); adapter.SelectCommand.CommandText = "SELECT * FROM Departments"; rowCount = adapter.Fill( dataTable ); dataGrid.DataSource = dataTable; |
关闭该连接。
conn.Close(); |
声明并初始化一个 SAConnection 对象。
SAConnection conn = new SAConnection( c_connStr ); |
打开该连接。
conn.Open(); |
创建 SADataAdapter 对象。
SADataAdapter adapter = new SADataAdapter(); adapter.MissingMappingAction = MissingMappingAction.Passthrough; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; |
创建必需的 SACommand 对象并定义所有必需的参数。
以下代码创建一条 SELECT 和一条 DELETE 语句,并定义 DELETE 语句的参数。
adapter.SelectCommand = new SACommand( "SELECT * FROM Departments WHERE DepartmentID > 500", conn ); adapter.DeleteCommand = new SACommand( "DELETE FROM Departments WHERE DepartmentID = ?", conn ); adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; SAParameter parm = new SAParameter(); parm.SADbType = SADbType.Integer; parm.SourceColumn = "DepartmentID"; parm.SourceVersion = DataRowVersion.Original; adapter.DeleteCommand.Parameters.Add( parm ); |
用 SELECT 语句的结果填充 DataTable。
DataTable dataTable = new DataTable( "Departments" ); int rowCount = adapter.Fill( dataTable ); |
修改 DataTable 并将更改应用到数据库。
for each ( DataRow in dataTable.Rows ) { row.Delete(); } recordsAffected = adapter.Update( dataTable ) |
将结果绑定到屏幕上的网格。
dataTable.Clear(); rowCount = adapter.Fill( dataTable ); dataGrid.DataSource = dataTable; |
关闭该连接。
conn.Close(); |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |