2014-08-18 2 views
0

Я получаю некоторое исключение базы данных какC# строка матч на основе групповых символов

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

+2

Там, где определенно, вы пытались написать какие-либо? Разве исключение не дает числовой код, который вы можете проверить? – CodeCaster

+2

Если вы можете, посмотрите, можете ли вы поймать более конкретный тип «Исключение», вместо разбора сообщения. Сообщения об исключении могут отличаться для систем, работающих на другом языке. –

+0

Вы искали "регулярное выражение между апострофами"? Я сомневаюсь, что http://stackoverflow.com/questions/5662834/c-sharp-regular-expressions-string-between-single-quotes –

ответ

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 
    } 
} 
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 
} 
3

Вы должны обращаться только SqlException вместо всех исключений. Затем проведите различие между ошибками через Number property. Ваша ошибка .

Здесь вы найдете все: 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

Попробуйте это регулярное выражение: 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 как упомянуто в другом вопросе. (Причина: что, если ваше приложение выполнено в операционной системе с другим языком?)

+0

Это хорошо. Но как насчет того, что строка сообщения происходит где-то посередине. Как я могу использовать этот reg ex для Contain, вместо того, чтобы всегда начинать строку 'Database'? – Billa

+0

Запустить и закончить регулярное выражение '. *?', Но '.' не соответствует строке –

Смежные вопросы