这个,在MSDN那个示例的代码中,写得很清楚,你可以看看。 ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkHandlingConcurrencyException.htm 大体如下: 引发该异常之后,即可确定这一行纪录发生了并发异常,你已经可以确定它已经被修改了。如果进一步要判断是被删除还是被修改,这样子: 假如初始版本的关键字为“张三” 捕获到并发异常之后,Select * From xx Where Pname=“张三”。 得到数据库中当前版本。
这个,在MSDN那个示例的代码中,写得很清楚,你可以看看。 ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkHandlingConcurrencyException.htm 大体如下: 引发该异常之后,即可确定这一行纪录发生了并发异常,你已经可以确定它已经被修改了。如果进一步要判断是被删除还是被修改,这样子: 假如初始版本的关键字为“张三” 捕获到并发异常之后,Select * From xx Where Pname=“张三”。 得到数据库中当前版本。
{
Response.Write(e.ToString());
}
兄弟,不是asp.net啊!using System.Windows.Forms;try
{
//your code............
}
catch(SqlException e)
{
MessageBox.Show(e.ToString());
}看看是什么错误,然后修改代码
我的意思是说如何分辨出这个错误是并发的错误
比如说:在客户端选择一个座位,同时在另一个客户端也对这个作为进行了选择,这时会返回这个SqlException的异常,但是我如何分辨这个异常是由于并发问题引起的呢?
而且,使这两个客户端都将收到这个异常吗?这个好像是数据库的东西,嘿嘿,我忘记了,顺便问了吧
谢谢
1 10 上次升级的版本日期: 10/11/90.
21 10 警告:严重错误 %1! 发生于 %2!。请记下错误和时间,然后与系统管理员联系。
102 15 在 ''%1!'' 附近有语法错误。
103 15 以 ''%2!'' 开头的 %1! 太长。最大长度为 %4!。
104 15 如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。
105 15 字符串 ''%1!'' 之前有未闭合的引号。
106 16 查询中的表名太多。允许的最大数目为 %1!。
107 15 列前缀 ''%1!'' 与查询中所用的表名或别名不匹配。
108 15 ORDER BY 子句中的位置号 %1! 超过了选择列表中项数目。
109 15 INSERT 语句中列的数目大于 VALUES 子句中指定的值的数目。VALUES 子句中值的数目必须与 INSERT 语句中指定的列的数目匹配。
110 15 INSERT 语句中列的数目小于 VALUES 子句中指定的值的数目。VALUES 子句中值的数目必须与 INSERT 语句中指定的列的数目匹配。
111 15 ''%1!'' 必须是批查询中的第一条语句。
112 15 %1! 语句中不允许有变量。
113 15 缺少注释的结尾标记 '*/'。
114 15 对于将值赋给变量的语句,浏览模式无效。
116 15 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
117 15 %1! 名称 ''%2!'' 包含的前缀数目超过了最大值。最大值为 %4!。
118 15 只有 sysadmin 角色的成员才能指定 %2! 语句的 %1! 选项。
119 15 必须传递参数个数 %1!,并以 '@name = value' 的形式传递后续的参数。一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递。
120 15 INSERT 语句的选择列表包含的项少于插入列表中的项。SELECT 语句中值的数目必须与 INSERT 语句中列的数目匹配。
121 15 INSERT 语句的选择列表包含的项多于插入列表中的项。SELECT 语句中值的数目必须与 INSERT 语句中列的数目匹配。
122 15 %1! 选项只允许用于 %2! 语法。
123 15 批/过程超过了 %1! 个字符的最大长度。
124 15 CREATE PROCEDURE 不包含任何语句。
125 15 Case 表达式只能嵌套到 %1! 层。
128 15 在此上下文中不允许使用名称 ''%1!''。此处只允许使用常量、表达式或变量。不允许使用列名。
129 15 填充因子 %1! 是无效百分比;填充因子必须介于 1 到 100 之间。
130 16 不能对包含聚合或子查询的表达式执行聚合函数。
131 15 赋予 %2! ''%3!'' 的大小(%1!)超过了任意数据类型的最大允许值(%5!)。
132 15 标签 ''%1!'' 已声明。标签名称在批查询或存储过程内部必须唯一。
133 15 GOTO 语句指向了标签 ''%1!'',但该标签尚未声明。
134 15 变量名 ''%1!'' 已声明。变量名在批查询或存储过程内部必须唯一。
135 15 不能在 WHILE 语句的作用域之外使用 BREAK 语句。
136 15 不能在 WHILE 语句的作用域之外使用 CONTINUE 语句。
137 15 必须声明变量 ''%1!''。
138 15 不允许在子查询中使用相关子句。
139 15 不能向局部变量赋予默认值。
140 15 只能在 CREATE TRIGGER 语句内部使用 IF UPDATE。
141 15 向变量赋值的 SELECT 语句不能与数据检索操作结合使用。
142 15 约束 ''%1!'' 的定义中有错误语法。
143 15 在排序依据列表中没有找到 COMPUTE BY 子句中的某一项。计算依据列表中的所有表达式也必须同时出现在排序依据列表中。
144 15 在用于 GROUP BY 子句分组依据列表的表达式中,不能使用聚合或子查询。
145 15 如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。
146 15 未能为子查询分配辅助表。超出了查询中表数目的最大值(%1!)。
147 15 聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
148 15 WAITFOR 所用的时间字符串 ''%1!'' 中时间语法有误。
149 15 WAITFOR 所用的时间值 ''%1!'' 是无效值。请检查日期/时间语法。
150 15 外联接的两项都必须包含列。
151 15 ''%1!'' 是无效 money 值。
153 15 在 %3! 语句中有 %1! 选项的无效使用。
154 15 在 %2! 中不允许使用 %1!。
155 15 ''%1!'' 不是可以识别的 %3! 选项。
156 15 在关键字 ''%1!'' 附近有语法错误。
157 15 聚合不应出现在 UPDATE 语句的集合列表中。
159 15 对于 DROP INDEX,必须以 tablename.indexname 的形式同时给出表名和索引名。
160 15 规则不包含变量。
161 15 规则包含多个变量。
163 15 计算依据列表与排序依据列表不匹配。
164 15 GROUP BY 表达式必须引用出现在选择列表中的列名。
165 16 不能授予或废除特权 %1!。
166 15 ''%1!'' 不允许将数据库名称指定为对象名前缀。
167 16 不能在临时对象上创建触发器。
168 15 %1! ''%2!'' 超出了计算机表示范围(%4! 字节)。
169 15 在排序依据列表中多次指定了某一列。排序依据列表中的列必须是唯一的。
170 15 第 %1! 行:在 ''%1!'' 附近有语法错误。
171 15 不能在浏览模式中使用 SELECT INTO。
172 15 不能在浏览模式中使用 HOLDLOCK。
173 15 列 ''%1!'' 的定义中必须包括数据类型。
174 15 %1! 函数要求有 %2! 个参数。
177 15 仅当 SELECT 语句中有 INTO 子句时,才能使用 IDENTITY 函数。
178 15 在此上下文中不能使用带有返回值的 RETURN 语句。
179 15 向存储过程传递常量时不能使用 OUTPUT 选项。
180 15 此 %1! 语句中参数太多。参数最大数目为 %2!。
181 15 不能在 DECLARE 语句中使用 OUTPUT 选项。
182 15 必须为 READTEXT 或 WRITETEXT 实用工具提供表名和列名。
183 15 列 ''%2!'' 的小数位数(%1!)必须介于 %4! 到 %5! 之间。
185 15 数据流在大容量形式下的 WRITETEXT 语句中无效。
186 15 WRITETEXT 语句中缺少数据流。
188 15 在 CREATE DATABASE 语句中,如果不同时指定至少一个非日志设备,就不能指定日志设备。
189 15 %1! 函数要求有 %2! 到 %3! 个参数。
191 15 SQL 语句的某些部分嵌套过深。请重写查询或将其分解为若干较小的查询。
192 16 小数位数必须小于或等于精度。
193 15 以 ''%1!'' 开头的对象名或列名太长。最大长度为 %3! 个字符。
194 15 SELECT INTO 语句不能包含向变量赋值的 SELECT 语句。
195 15 ''%1!'' 不是可以识别的 %3!。
196 15 SELECT INTO 必须是包含 UNION 运算符的 SQL 语句中的第一个查询。
197 15 无法在向表插入变量时将 EXECUTE 用作源。
198 15 浏览模式对于包含 UNION 运算符的语句无效。
199 15 INSERT 语句不能包含向变量赋值的 SELECT 语句。
是查询分析器吗?
谢谢
UP
catch(SqlException e)
{
MessageBox.Show(e.ToString());
}
{
throw ex;
}这样捕捉并发异常。一般包括两种情形:
1、你要修改的,在数据库中已经被删除(若关键字被修改,也一样)。
2、非关键字段被修改。处理起来是非常复杂的,没有成例。一般考虑以下几点:
1、提示用户数据的版本:你载入的数据、你准备将其修改为什么样子、目前数据库中是怎样的。
2、用户决定:覆盖数据库中的数据,或者使用数据库中的数据刷新本地
3、ex.row[x,版本号]能够得到不同版本的数据,但当前数据库中的数据必须用新的查询获得。懒惰的方式,取决于你的策略,比如:
1、无条件覆盖数据库中当前的数据,这样用户并不会知道其修改期间的变化
2、分辨:若仅修改了非关键字段,则由用户回到维护界面修改。总之相当复杂,做好3天时间演练的打算。参考下面的内容:
ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkHandlingConcurrencyException.htm
谢谢
很感谢你的回答,我还想问一下的就是,我其实就是想捕捉到这个异常后判断一下他已经被修改就成了,这个如何用DBConcurrencyException判断呢?
谢谢
很感谢你的回答,我还想问一下的就是,我其实就是想捕捉到这个异常后判断一下他已经被修改就成了,这个如何用DBConcurrencyException判断呢?
ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkHandlingConcurrencyException.htm
大体如下:
引发该异常之后,即可确定这一行纪录发生了并发异常,你已经可以确定它已经被修改了。如果进一步要判断是被删除还是被修改,这样子:
假如初始版本的关键字为“张三”
捕获到并发异常之后,Select * From xx Where Pname=“张三”。
得到数据库中当前版本。
ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbwlkHandlingConcurrencyException.htm
大体如下:
引发该异常之后,即可确定这一行纪录发生了并发异常,你已经可以确定它已经被修改了。如果进一步要判断是被删除还是被修改,这样子:
假如初始版本的关键字为“张三”
捕获到并发异常之后,Select * From xx Where Pname=“张三”。
得到数据库中当前版本。