我有一个问题,这不是问题。 我的数据库有一些限制,作为唯一名称(存储必须唯一的名称的列) 插入或更新时,db会验证我们是否没有覆盖某个名称,如果是,则返回一个可转换为SqlException的错误,代码为2627
我的问题是......如果存在某些表格或某些我可以咨询的内容,以便向最终用户表明该怎么做?
在这种情况下..存在具有相同名称的用户....
答案 0 :(得分:2)
我想,你应该看一下SqlExceptions Errors property并查看errors number,它应该指向master.dbo.sysmessages表中的一条消息。
答案 1 :(得分:1)
不要假设特定的错误代码总是指同一个问题。
select * from master.dbo.sysmessages where description like '%timeout%'
这将为您提供以下所有可能的错误消息 - 全部包含代码1033
:
为超时提供的值无效。超时必须是介于0和2147483647之间的有效整数.1033
等待latch时发生超时:类'%ls',id%p,类型%d,任务0x%p:%d,等待时间%d秒,标志0x%I64x,拥有任务0x%p。继续等待。 1033
与远程服务器实例'%。* ls'的通信在超时之前未能完成。 ALTER DATABASE命令可能尚未完成。重试该命令。 1033
数据库镜像超时值%d超过最大值32767. 1033 由于锁定超时,未检查数据库ID(%d)中的元数据高速缓存条目%d:%d的一致性。 1033
标记的交易“%。* ls”失败。尝试通过提交标记的事务在日志中放置标记时发生超时。这可能是由与Microsoft分布式事务处理协调器(MS DTC)事务或其他1033
的争用引起的SQL Server Destination的批量插入操作已超时。请考虑在数据流中增加SQL Server目标上的Timeout属性的值。 1033
......所有语言中都有很多错误。
因此可以安全地假设1033
意味着某种超时?不幸的是,即使这不是真的:
select description from master.dbo.sysmessages where msglangid=1033
警告:%S_DATE发生致命错误%d。请注意错误和时间,并与系统管理员联系。
在Waitfor中不允许查询。
'%。* ls'附近的语法不正确。
以'%。* ls'开头的%S_MSG太长。最大长度为%d。 如果语句包含UNION,INTERSECT或EXCEPT运算符,则ORDER BY项必须出现在选择列表中。
ORDER BY位置编号%ld超出了选择列表中项目数的范围。
以及许多与非超时相关的错误。
所以我坚持:
IsSqlTimeout = ((ex as SqlException).Message.ToUpper().Contains("TIMEOUT");
所以要真正回答你的问题 - 这取决于你的用户实际上能够理解或应该被告知的内容。
我建议您记录一段时间内的所有错误(代码和消息),将它们分组并查看哪些错误最适合您的环境。
答案 2 :(得分:0)
此处报告了各种错误代码的含义:https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-ver15。确保在左侧选择正确的数据库版本。