我收到了一些像
这样的数据库异常 Database 'db_name' cannot be opened. It is in the middle of a restore
try
{
}
catch(Exception ex)
{
if(ex.Message.Contains("Database 'db_name' cannot be opened. It is in the middle of a restore")){
//show user friendly message
}
}
但问题是我们有大约10-15个数据库名称,我们将继续添加更多。
如何匹配带通配符的字符串?
是否有任何正则表达式匹配Database '{whatevercomes}' cannot be opened. It is in the middle of a restore
答案 0 :(得分:3)
您应该只处理SqlException
而不是所有例外。然后通过Number
property区分错误。您的错误 927 。
在这里您可以找到所有:http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx
try
{
// ...
}
catch(SqlException ex)
{
if(ex.Number == 927)
{
//show user friendly message
}
}
根据数据库的实际名称:似乎无法从SqlException
检索它。由于本地化消息也可能会发生变化,为什么您无法在打开连接的情况下处理此异常?然后你可以简单地使用SqlConnection.DataBase
-property。
例如:
using (var con = new SqlConnection("Connection-String"))
{
try
{
con.Open();
// ...
} catch (SqlException ex)
{
string database = con.Database;
if (ex.Number == 927)
{
//show user friendly message
string errorMessage = string.Format("Could not open database '{0}' since it's currently restoring. Please inform your database administrator."
, database);
MessageBox.Show( errorMessage );
}
}
}
答案 1 :(得分:1)
而不是正则表达式只需使用此
if(ex.Message.IndexOf("Database ") == 0 && ex.Message.Contains(" cannot be opened. It is in the middle of a restore") == true)
{
//user friendly message here
}
答案 2 :(得分:1)
试试这个正则表达式:Database '(.*?)' cannot be opened\. It is in the middle of a restore
用法:
var regex = @"Database '(.*?)' cannot be opened\. It is in the middle of a restore";
var match = Regex.Match(msg, regex);
if (match .Success)
{
var databaseName = match.Groups[1].Value;
// Show messgage
}
但是你不应该解析异常文本,而只能查看异常类型和另一个问题中提到的Number
属性。 (原因:如果您的应用程序在使用其他语言的操作系统上执行该怎么办?)
答案 3 :(得分:0)
不确定它会对您有所帮助。如果你使用两个单独的条件来实现那个
,那么不要尝试正则表达式try
{
}
catch(Exception ex)
{
if(ex.Message.StartsWith("Database") && ex.Message.Contains(" cannot be opened. It is in the middle of a restore")){
//show user friendly message
}
}