2017-11-21 1 views
0

ODBC 연결을 통해 쿼리를 실행할 수있는 스크립팅 엔진이있는 응용 프로그램이 있습니다. ODBC 연결을 통한 실행 구분 문 .NET

우리는 최근이 MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn,query)

  • 을 사용하기 전의 지금이 사용자가 쿼리로 전달할 수 있습니다 MySql.Data.MySqlClient.MySqlScript(conn, query)

  • 사용 구분 문을

    • 수 있도록 수정 그래서 :

      DELIMITER // 
      CREATE PROCEDURE HelloWorld() 
      SELECT "Hello World!"; 
      // 
      DELIMITER ; 
      CALL HelloWorld(); 
      

      일반적으로 ExecuteDataset은 구분 기호가 올바르게 처리되지 않으므로 예외를 throw하고 MySqlScript가이를 완벽하게 처리합니다.

      이제 ODBC 연결을 사용할 때 문제가 발생합니다. 사용자는 DSN=testDB;과 같은 것을 지정할 수 있으며 해당 DB에 대한 쿼리를 실행합니다. - 단 한 번에 완벽하게 작동하지만 구분 기호를 사용하여 위의 블록을 실행하려고 할 때 문제가 발생합니다. 제대로 처리되지 않습니다. 여기에 스 니펫이 있습니다. 우리가 실행하는 방법 ODBC :

      Case ScriptIssuedDatabaseQuery.QueryTypes.OdbcQuery 
      Try 
          Using odbcConn As New Data.Odbc.OdbcConnection(qtw.ScriptQuery.OdbcConnectionString) 
           odbcConn.Open() 
           If odbcConn.State = Data.ConnectionState.Open Then 
            Using oc As New Data.Odbc.OdbcCommand(qtw.ScriptQuery.SqlQueryData, odbcConn) 
             qtw.ScriptQuery.QueryScalarResult = oc.ExecuteScalar().ToString() ' this fails, using ExecuteNonQuery same 
             qtw.ScriptQuery.IsResultGood = True ' If didn't throw exception - assume good 
            End Using 
           End If 
           odbcConn.Close() 'redundant? 
          End Using 
      Catch ex As Exception 
          myHost.LogErrorMessage("Script Engine: Error in ODBC query: " & ex.Message) 
      End Try 
      

      나는 무엇이 있습니까? 나는 웹을 샅샅이 뒤지고 빈 손으로 왔으며, Odbc 클래스를 사용하여 몇 가지 다른 방법을 시도했다. 트랜잭션 클래스를 사용하여 시도했다.

    +0

    정확히 어떤 방식으로 올바르게 처리되지 않습니까? –

    +0

    @AndrewMorton 그것은 그것을 보이는 여러 문장으로 처리하고; (SQL 문에 대해 유효하지 않은 구문이 있음) 오류가 발생합니다. 이 동일한 쿼리는 SQLYog에서 잘 작동하거나 MySqlScript 클래스를 사용합니다. – Poat

    답변

    1

    DELIMITER은 절대로 서버로 보내지지 않는다.

    DELIMITER의 목적은 클라이언트 코드에게 무엇 현재 문 구분 기호, 클라이언트 코드가 각 문에 스크립트를 분할하고 실행을 위해 개별적으로, 서버에 문을 보낼 수 있도록.

    DELIMITER 문에 대한 내용을 분석하고 구분 기호로 분리하는 코드를 작성하거나 각 문을 직접 분리하고 서버에 개별적으로 전송해야합니다.

    예를 들어 전체 프로 시저 본문을 단일 문으로 서버에 보낼 수 있습니다. 끝에있는 END은 프로 시저 선언을 끝내는 것으로 인식됩니다. no // 또는 다른 구분 기호가 필요합니다.

    서버가 구분 기호를 이해한다는 것은 일반적인 오해입니다. 실제로 정상/간단한 쿼리가 ;으로 끝나면 서버는이를 무시합니다. 구분 기호가있는 명령문을 실제로 끝낼 필요는 없습니다.

    +0

    흠 있습니다. 이 글을 살펴보면 "파서"에 대해서도 언급하고 있습니다 : http://alextsilverstein.com/programming-and-development/mysql/mysql-the-reason-for-using-the-delimiter-statement-in-mysql -routines-stored-procedures-functions-triggers/ 내가 언급 한 경로를 따라 가야 할 것 같습니다. – Poat

    관련 문제