2011-08-08 3 views
1

ASP에서 로그 기능을 만들고이를 수행하여 UPDATE SQL 문을 구문 분석 할 수 있어야합니다. 내가 이런 SQL 문이있는 경우 : 내가 출력이 같은 필드와 값 말하는 배열하는 것입니다 으려고 원하는 것은UPDATE sql 문 디코딩/구문 분석

UPDATE mytable SET aaa='test',bbb=123 WHERE id=508 

: 내가 ASP에서이 작업을 수행 할 수있는 방법

FieldArray = aaa,bbb 
ValueArray = test,123 

또는 아마 SQL에서 직접?

답변

0

SQL 사용에 대해서는 잊어 버리십시오. 데이터베이스 서버에서 데이터를 사용, 액세스 및 수정하는 것이 그 역할입니다.

VB.NET에서는 Left, Mid, RightInStr 함수를 사용하여 SQL 문자열을 구문 분석 할 수 있습니다.

' Using your string : UPDATE mytable SET aaa='test',bbb=123 WHERE id=508 
strWithoutFirstPart = Mid(strSQL, InStr(strSQL, "SET")) ' Output : SET aaa='test',bbb=123 WHERE id=508 
strWithoutLastPart = Left(strWithoutFirstPart, InStr(strWithoutFirstPart, "WHERE")-1) ' OutPut : SET aaa='test',bbb=123 

This has more information on the functions.

'Global variables 
Dim parameters, values 
parameters = Array() 
values = Array() 

' Procedure for parsing an Update SQL Statement to get parameters and values. 
Sub parseSQLUpdate(ByVal strSQL) 
    ' Variables 
    Dim strParsed, intEqualPos, intCommaPos, intLastPos, regExStrCommaTest 

    ' Clearing the global variables. 
    ReDim parameters(0), values(0) 

    ' Parsing the string for the right section. 
    strParsed = Trim(Mid(strSQL, InStr(UCase(strSQL), "SET") + 4)) 
    strParsed = Trim(Left(strParsed, InStr(UCase(strParsed), "WHERE") - 2)) 

    ' Getting positions. 
    intEqualPos = InStr(strParsed, "=") 
    intCommaPos = InStr(strParsed, ",") 
    intLastPos = 0 

    ' Preparing the Reg. Ex. variable 
    Set regExStrCommaTest = new RegExp 
    regExStrCommaTest.Pattern = "('[^']*'$)|(^[^']+$)" 

    ' Looping for every parameter/value. 
    Do While (intEqualPos > 0) 
     ' Check if first loop. 
     If (intLastPos = 0) Then 
      parameters(UBound(parameters)) = Trim(Left(strParsed, intEqualPos - 1)) 

      ' Check if at last parameter/value. 
      If (intCommaPos > 0) Then 
       ' Check for commas in text. 
       Do While (regExStrCommaTest.Test(Trim(Mid(strParsed, intEqualPos + 1, intCommaPos - intEqualPos - 1))) = False) 
        ' Go to next comma. 
        intCommaPos = InStr(intCommaPos + 1, strParsed, ",") 

        ' Already at end, so take remaining characters. 
        If (intCommaPos <= 0) Then 
         values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1)) 
         Exit Sub 
        End If 
       Loop 

       values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1, intCommaPos - intEqualPos - 1)) 
      Else 
       values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1)) 
      End If 
     Else 
      ' Change arrays' size. 
      ReDim Preserve parameters(UBound(parameters) + 1), values(UBound(values) + 1) 

      parameters(UBound(parameters)) = Trim(Mid(strParsed, intLastPos + 1, intEqualPos - intLastPos - 1)) 

      ' Check if at last parameter/value. 
      If (intCommaPos > 0) Then 
       ' Check for commas in text. 
       Do While (regExStrCommaTest.Test(Trim(Mid(strParsed, intEqualPos + 1, intCommaPos - intEqualPos - 1))) = False) 
        ' Go to next comma. 
        intCommaPos = InStr(intCommaPos + 1, strParsed, ",") 

        ' Already at end, so take remaining characters. 
        If (intCommaPos <= 0) Then 
         values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1)) 
         Exit Sub 
        End If 
       Loop 

       values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1, intCommaPos - intEqualPos - 1)) 
      Else 
       values(UBound(values)) = Trim(Mid(strParsed, intEqualPos + 1)) 
      End If 
     End If 

     ' Remembering last position 
     intLastPos = intCommaPos 

     ' Ending Loop if last position is 0 
     If (intLastPos = 0) Then 
      Exit Sub 
     End If 

     ' Getting new positions. 
     intEqualPos = InStr(intLastPos, strParsed, "=") 
     intCommaPos = InStr(intEqualPos, strParsed, ",") 
    Loop 
End Sub 
+0

와우 ,, 감사합니다. 나는 그것을 바로 시도 할 것이다 :) –

+0

정말 잘 작동 :) 다시 한번 감사드립니다. –

0

DB를 MySQL을이고 당신이 SUPER 권한을 가지고, 당신은 사전에 업데이트됩니다 테이블을 알고 있다면, 당신은 변경된 항목을 식별하고 다른 테이블에서 그들을 로그인 할 수 MySQL의 트리거를 정의 할 수 있습니다

+0

당신은 내가 게시 된 예를 들어, SQL에이 트리거를 사용하는 방법의 예를 가지고 있습니까 : 여기

내가 당신의 문제를 위해 만들어진 절차입니다? –

+0

불행히도 아닙니다. 나는 테이블 구조를 읽는 업데이트 전에 트리거를 작성하여 어떤 필드가 변경 될지 확인하기 위해 필드를 쿼리하는 데 사용합니다 ... – perissf