2016-07-13 7 views
1

나는이 데이터베이스 예외 메시지추출 텍스트

참조 제약 조건 "FK_dbo.MyApprovals_dbo.My_ApproverMyId"와 충돌 DELETE 문이있다. 데이터베이스 "DatabaseDev", 테이블 "dbo.DatabaseTable", 열 'ApproverPositionId'에서 충돌이 발생했습니다.
명세서가 종료되었습니다.

은 내가 특정 질문에 대해 정규 표현식

var result = Regex.Match("The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.MyApprovals_dbo.My_ApproverMyId\". The conflict occurred in database \"DatabaseDev\", table \"dbo.DatabaseTable\", column 'ApproverPositionId'.\r\nThe statement has been terminated.").Groups[1].Value; 
+0

좀 더 일반적인 버전을 찾고 계십니까? 아니면'DELETE'와'DatabaseTable' 만 추출할까요? –

+0

@SebastianLenartowicz 난 그냥 DELETE 및 DatabaseTable을 추출해야합니다. 물론 더 일반적인 방법이 있다면 더 나은 – ove

+0

누구나 아이디어가 있습니까? – ove

답변

0

아래를 사용하여 노력하고 있어요 두 가지 구성 요소

DELETE 
DatabaseTable 

을 추출 할 필요가 원하는 정규식 (DELETE).+database "(.+?)"이며, 두 개의 캡처 그룹에는 원하는 내용이 포함됩니다. 다음과 같이 (로깅 오류에 대한 더 나은)

보다 일반적인 버전은 다음과 같습니다

The (.+?) statement.+the(.+?)\". The conflict.+(database ".+?", table ".+?", column '.+?')

캡처 그룹 (순서대로) 문 (등 SELECT를, DELETE) 뱉어, 제약 DB, 테이블 및 컬럼에 대한 정보를 제공합니다. 당연히이 기능은이 특정 구조의 오류 메시지에 대해서만 작동합니다.

전체 코드는 다음과 같이 보입니다 :

Match m = Regex.match(errorString, @"The (.+?) statement.+the(.+?)""\. The conflict.+(database "".+?"", table "".+?"", column '.+?')"); 
Console.WriteLine(m.Groups[1].value); 

내가 C#을 사람 (필자는 정규식 질문에 대답했다) 아니에요 주목해야한다을, 그래서 이것은 문제가 발생할 수 있습니다.

0

Regex.Match()에는 적어도 2 개의 인수, 문자열 및 정규식 패턴 (정규식 패턴 파트가 누락되었습니다)이 필요합니다.

정규식 일치를 실행할 때 가장 먼저 일치하는 항목이 Match.Success인지 확인해야합니다. 그렇지 않으면 예외가 생길 수 있습니다.- 만들 수있는 만일 Singleline 수정

  • (?s) :

    var str = "The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.MyApprovals_dbo.My_ApproverMyId\". The conflict occurred in database \"DatabaseDev\", table \"dbo.DatabaseTable\", column 'ApproverPositionId'.\r\nThe statement has been terminated."; 
    var m = Regex.Match(str, @"(?s)(?<delete>[A-Z]+)\s+statement.*?,\s+table\s+""\w+\.(?<table>[^""]+)"); 
    if (m.Success) { 
        Console.WriteLine(m.Groups["delete"].Value); // => DELETE 
        Console.WriteLine(m.Groups["table"].Value); // => DatabaseTable 
    } 
    

    this IDEONE demo

    정규식 일치를 참조하십시오

    당신은 당신이 그룹으로해야 할 두 값을 캡처하는 간단한 정규식을 사용할 수 있습니다 .은 개행 문자를 포함한 모든 문자와 일치합니다 (두 그룹 사이의 문자열에 개행 문자가있는 경우에 한함)

  • (?<delete>[A-Z]+)\s+statement - 첫번째 ,
  • \s+까지 어떤 0+ 문자 - 1+ ASCII 대문자 "삭제"그룹에 촬영 된 문자 ([A-Z]+), 1+ 공백 (\s+)는 statement 문자열
  • .*?,로 이어 - 1 개 이상의 공백
  • table\s+ - ", 1+ 단어 문자 및 문자- table 문자열은 1+ 공백
  • ""\w+\.에 따라
  • (?<table>[^""]+) - "이 아닌 1 이상의 문자와 일치하는 그룹 '테이블'.