下面的函数旨在确定查询是否会返回任何行。传入的SQL是查询语句。如果出现错误,函数应返回false。但是当SQL = 时,该函数会抛出一个异常,因为它缺少必要的参数。要解决这个问题,可以添加检查以确保SQL中有足够的参数。
该函数错误地返回了true,因为没有检测到错误。然而,在SQL Management Studio中执行相同的查询会导致错误:
Msg 232, Level 16, State 3, Line 3 Arithmetic overflow error for type int, value = -1000000000000000000000000000000.000000.
显然,该函数应该返回false,因为一个值超出了int数据范围,但错误处理没有检测到错误。为什么呢?从其他帖子中,我理解
SELECT TOP 1 [AU_ID]
FROM [dat].[model_80av2_v1_2941]
WHERE [AU_ID] IS NOT NULL AND convert(int, [AU_ID]) <> [AU_ID]
该函数错误地返回了true,因为没有检测到错误。然而,在SQL Management Studio中执行相同的查询会导致错误:
Msg 232, Level 16, State 3, Line 3 Arithmetic overflow error for type int, value = -1000000000000000000000000000000.000000.
显然,该函数应该返回false,因为一个值超出了int数据范围,但错误处理没有检测到错误。为什么呢?从其他帖子中,我理解
SqlDataReader reader = cmd.ExecuteReader()
应该会导致错误。private bool GetIfExists(string SQL, out int ErrorNumber, out bool Exists)
{
bool IsSuccess = true;
ErrorNumber = 0;
Exists = false;
try
{
using (SqlConnection cnn = new SqlConnection(_connectionString))
{
try
{
cnn.Open();
using (SqlCommand cmd = cnn.CreateCommand())
{
cmd.CommandText = SQL;
cmd.CommandTimeout = _commandTimeout;
try
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
Exists = reader.HasRows;
}
}
catch (SqlException ex)
{
if (ex.Errors.Count > 0) ErrorNumber = ex.Errors[0].Number;
throw;
}
catch
{
throw;
}
}
}
catch
{
throw;
}
finally
{
cnn.Close();
}
}
}
catch
{
IsSuccess = false;
}
return IsSuccess;
}
cnn.Close();
-using
语句会为你处理这个。 - mjwillsExists = reader.HasRows;
之后添加reader.NextResult();
会引发错误(http://www.dbdelta.com/the-curious-case-of-undetected-sql-exceptions/)。让我知道,我会用答案详细说明。 - Dan Guzman