set nocount NO|OFF(default)
SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。
下表描述了可用于调整连接池行为的 ConnectionString 值。
名称 | 默认值 | 说明 |
---|---|---|
Connection Lifetime | 0 | 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。 如果值为零 (0),则将使池连接具有最大的超时期限。 |
Connection Reset | 'true' | 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程,但必须注意的是连接状态(如数据库上下文)不会被重置。 |
Enlist | 'true' | 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。 |
Max Pool Size | 100 | 池中允许的最大连接数。 |
Min Pool Size | 0 | 池中维护的最小连接数。 |
Pooling | 'true' | 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。 |
自动递增列
如果来自数据源的表包含自动递增列,则可以使用由数据源生成的值填充 DataSet 中的列,方法是通过以存储过程输出参数的形式返回自动递增值并将其映射到表中的一列,或者使用 DataAdapter 的 RowUpdated 事件。有关示例,请参阅检索“标识”或“自动编号”值。
但是,DataSet 中的值可能会与数据源中的值不同步并导致意外的行为。例如,请考虑一个包含自动递增主键列 CustomerID
的表。如果在该 DataSet 中添加两个新客户,它们将收到自动递增的 CustomerId
值 1
和 2
。在向 DataAdapter 的 Update 方法传递第二个客户行时,新添加的行会收到数据源中的自动递增 CustomerID
值 1
,该值与 DataSet 中的值 2
不匹配。当 DataAdapter 使用返回值填充 DataSet 中的行时,由于第一个客户行的 CustomerID
已经是 1
,因此将发生约束冲突。
为了避免这种行为,建议在使用数据源中的自动递增列和 DataSet 中的自动递增列时,在 DataSet 中创建 AutoIncrementStep 为 -1 且 AutoIncrementSeed 为 0 的列,并确保数据源生成从 1 开始并以正步长值递增的自动递增标识值。这样,DataSet 将为自动递增值生成负数,这些负数不会与数据源所生成的正自动递增值发生冲突。另一种方法是使用 Guid 类型的列而不是自动递增列。生成 Guid 值的算法在 DataSet 中生成的 Guid 从不会与数据源生成的 Guid 相同。有关定义 DataTable 中的列的更多信息,请参阅定义数据表的架构。
插入、更新和删除的排序
在许多情况下,以何种顺序向数据源发送通过 DataSet 作出的更改是相当重要的。例如,如果已更新现有行的主键值并且添加了具有新主键值的新行,则务必要在处理插入之前处理更新。
可以使用 DataTable 的 Select 方法来返回仅引用具有特定 RowState 的 DataRow 数组。然后可以将返回的 DataRow 数组传递到 DataAdapter 的 Update 方法来处理已修改的行。通过指定要更新的行的子集,可以控制处理插入、更新和删除的顺序。
例如,以下代码确保首先处理表中已删除的行,然后处理已更新的行,然后处理已插入的行。
[Visual Basic]
Dim updTable As DataTable = custDS.Tables("Customers")
' First process deletes.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Deleted))
' Next process updates.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent))
' Finally, process inserts.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Added))
ForeignKeyConstraint
ForeignKeyConstraint 强制了有关如何对相关表所做更新和删除进行传播的规则。例如,如果更新或删除了一个表格中的某行中的值,并且一个或多个相关的表中也使用了这个相同的值,ForeignKeyConstraint 将会决定相关表中发生的操作。
ForeignKeyConstraint 的 DeleteRule 和 UpdateRule 属性定义在用户试图删除或更新相关表中某行时采取的操作。下表描述可用于 ForeignKeyConstraint 的 DeleteRule 和 UpdateRule 属性的不同设置。
规则 | 说明 |
---|---|
Cascade | 删除或更新相关行。这是默认设置。 |
SetNull | 将相关行中的值设置为 DBNull。 |
SetDefault | 将相关行中的值设置为默认值。 |
None | 指定不对相关行采取任何操作。 |
ForeignKeyConstraint 可以限制并传播对相关列的更改。根据为列的 ForeignKeyConstraint 设置的属性,并且如果 DataSet 的 EnforceConstraints 属性是 true,对父行执行某些特定操作将会导致异常。例如,如果 ForeignKeyConstraint 的 DeleteRule 属性是 None,那么在父行有子行的情况下,则无法删除父行。
可以通过使用 ForeignKeyConstraint 构造函数创建单列间或一组列间的外键约束。将结果的 ForeignKeyConstraint 对象传递给该表的 Constraints 属性的 Add 方法,该方法是一个 ConstraintCollection。还可以将构造函数参数传递给 ConstraintCollection 的 Add 方法的几个重载以创建 ForeignKeyConstraint。
AcceptRejectRule
可使用 AcceptChanges 方法接受对行的更改,或者使用 DataSet、DataTable 或 DataRow 的 RejectChanges 方法取消对行的更改。DataSet 包含 ForeignKeyConstraints 时,调用 AcceptChanges 或 RejectChanges 方法会导致强制 AcceptRejectRule。ForeignKeyConstraint 的 AcceptRejectRule 属性决定了对父行调用 AcceptChanges 或 RejectChanges 时要对子行采取的操作。
下表列出了 AcceptRejectRule 可以设置的值。
操作 | 说明 |
---|---|
Cascade | 接受或拒绝对子行的更改。 |
None | 指定不对子行采取任何操作。这是默认值。 |
UniqueConstraint
UniqueConstraint 对象(可分配给 DataTable 中的单独一列或一组列)确保指定的某列或多个列中的所有数据对于每行都是唯一的。通过使用 UniqueConstraint 构造函数,可以为一列或一组列创建唯一的约束。将结果的 UniqueConstraint 对象传递给该表的 Constraints 属性的 Add 方法,该方法是一个 ConstraintCollection。还可以将构造函数参数传递给 ConstraintCollection 的 Add 方法的几个重载以创建 UniqueConstraint。为一列或多列创建 UniqueConstraint 时,可以选择是否将此列或这些列指定为主键。
还可以通过将列的 Unique 属性设置为 true,为某列创建唯一约束。或者,通过将单列的 Unique 属性设置为 false,可移除可能存在的任何唯一约束。此外,定义一列或多列作为表的主键会自动为一个或多个特定列创建唯一的约束。如果从 DataTable 的 PrimaryKey 属性中移除一列,则 UniqueConstraint 也被移除。
分页查询:
orderSQL = "SELECT TOP " & pageSize & " * FROM Orders WHERE OrderID > " & lastRecord & " ORDER BY OrderID"