我需要UNIQUE通过我正在开发的C#应用程序以特殊方式捕获对约束的违反.可以安全地假设它Error 2627总是对应于这种违规行为,以便我可以使用
if (ThisSqlException.Number == 2627)
{
// Handle unique constraint violation.
}
else
{
// Handle the remaing errors.
}
Run Code Online (Sandbox Code Playgroud)
?
注意:请注意,下面的代码基本上没有意义,仅用于说明目的.
基于这样一个事实,即在将赋值分配给左侧变量之前必须始终对赋值的右侧进行求值,并且在评估之后始终执行诸如++和--之后的递增操作,我不会期望以下代码工作:
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp] = newArray1[IndTmp++];
}
Run Code Online (Sandbox Code Playgroud)
相反,我希望newArray1[0]被分配到newArray2[1],newArray1[1]对newArray[2]等多达扔的地步System.IndexOutOfBoundsException.相反,令我惊讶的是,抛出异常的版本是
string[] newArray1 = new[] {"1", "2", "3", "4"};
string[] newArray2 = new string[4];
int IndTmp = 0;
foreach (string TmpString in newArray1)
{
newArray2[IndTmp++] = newArray1[IndTmp];
}
Run Code Online (Sandbox Code Playgroud)
因为,在我的理解中,编译器首先评估RHS,将其分配给LHS,然后才增加这对我来说是一个意外的行为.或者它真的是预期的,我显然错过了什么?
关于"可能存在多个枚举"的SO有一个问题,但这个问题更具体.
请考虑以下方法,该方法接受IEnumerable<string>输入并对其每个元素执行给定方法:
public static bool SomeMethod(IEnumerable<string> enumerable)
{
if (enumerable.IsNullOrEmpty())
{
// throw exception.
}
else
{
return (enumerable.All(SomeBooleanMethod));
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,IsNullOrEmpty只是一个运行的扩展方法
return (!ReferenceEquals(enumerable, null) || enumerable.Any());
Run Code Online (Sandbox Code Playgroud)
问题是ReSharper警告我"IEnumerable的可能的多个枚举",我真的不知道这是否真的是一个问题.
我理解警告的含义,但是如果你真的需要在无效或空洞的情况下检查并抛出异常,你在这种情况下真的可以做些什么?
我正在开发一个与SQL Server 2005数据库通信的应用程序来执行一些存储过程.我的客户端要求所有事务都在C#端管理,而不是由SQL Server管理,因此我System.Transactions.TransactionScope在访问数据库时使用.但是,我刚看到System.Transactions.Transaction数据类型,我很困惑......每种类型的主要优点/缺点是什么?我应该使用哪一个?
请注意,我还必须使用Enterprise Library的数据访问应用程序块.
虽然在表格中INSERT INTO SELECT插入单行时没有理由(除了美学),但是使用它和INSERT INTO VALUES?之间有什么区别吗?
IEnumerable在您不需要实际添加或删除内容但仅枚举它们时,使用应用程序范围是一个好习惯吗?
侧问题:你曾经有返回任何问题,IEnumerable<T>从WCF服务?这会给客户端应用程序带来问题吗?毕竟,我认为这将序列化为一个数组.
想象一下,你有一个应用程序,它是你所有业务逻辑的某种前端.这个前端有很多依赖它的DLL,并且这些DLL中的方法可能在前端单次执行给定方法时重复调用.如果您的应用程序的用户不直接访问这些DLL,您应该......
1)冒险(小)性能命中并验证每种方法中的参数,即使您最终可以验证相同的参数大约5次; 要么
2)风险意外行为并假设,当您验证输入参数时,传入和传出内部代码的所有其他可能参数都是有效的(例如,既不为null也不为空)?
编辑:举个例子,假设你有一个正则表达式RegexA和一个方法
internal bool Matches(string expression)
{
return RegexA.IsMatch(expression);
}
Run Code Online (Sandbox Code Playgroud)
IsMatch将在null参数上抛出异常,但不在空字符串上抛出异常.如果您事先知道空字符串永远不会与该正则表达式匹配,那么您if (String.IsNullOrEmpty(expression))以前是否应该使用它,即使知道它可能在IsMatch框架方法中被验证为无效?在这种情况下,您显然正在重复验证,但重复它还是冒风险更好?
请考虑以下代码,它会抛出三个不同的异常(即System.Configuration.ConfigurationErrorsException,System.FormatException和System.OverflowException):
int SomeInt = Convert.ToInt32(ConfigurationManager.AppSettings["SomeIntValue"]);
Run Code Online (Sandbox Code Playgroud)
异常是不同的,因此在实践中我应该有三个不同的catch块来处理每个特定的异常.但是,在这种特殊情况下,所有异常都以相同的方式处理:将日志写入,例如,EventViewer,并显示一条消息,通知配置错误......在这个特定的原因中,使用它太糟糕了
try
{
int SomeInt = ConfigurationManager.AppSettings["SomeIntValue"];
}
catch (Exception ThisException)
{
/* Log and display error message. */
}
Run Code Online (Sandbox Code Playgroud)
或者我应该使用这三个catch块并在每个块中重复代码?
我有3-4个存储过程 - 如果需要我可以修改 - RAISERROR用于通知我的应用程序在数据库端的一些致命错误.其中一些存储过程是从C#端ExecuteNonQuery执行的,而其他存储过程是用ExecuteReader.目前,我将这些命令包装在一个try { ... } catch (SqlException ThisSqlException) { ... }块中,但问题是这个异常将至少抛出两个我必须单独处理的场景:
1)连接本身的错误,或者出现故障或类型不匹配的参数; 和
2)我RAISERROR明确使用时出现的错误.
由于这是一个WCF应用程序,我必须根据异常的性质(无论是否由于RAISERROR命令)返回客户端应用程序的不同反馈.那么,我怎样才能区分这两种情况呢?
我知道命名约定实际上并没有说明任何内容,但我只是很想知道...当你为给定方法声明一个本地变量时,你PascalCase或camelCase它吗?
c# ×7
.net ×2
ienumerable ×2
wcf ×2
insert ×1
raiserror ×1
resharper ×1
sql ×1
sqlexception ×1
transactions ×1
validation ×1