通过ODBC连接.NET运行分隔符语句

时间:2017-11-21 17:05:52

标签: mysql vb.net odbc

我有一个带脚本引擎的应用程序,它能够通过ODBC连接运行查询。

我们最近将其修改为允许分隔符语句

  • 在使用MySql.Data.MySqlClient.MySqlHelper.ExecuteDataset(conn,query)

  • 之前
  • 现在使用MySql.Data.MySqlClient.MySqlScript(conn, query)

这允许用户传递查询,如下所示:

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

正常情况下,ExecuteDataset会抛出异常,因为分隔符处理不当 - 而且MySqlScript可以完美地处理这些异常。

现在使用ODBC连接时会出现问题。用户可以指定类似DSN=testDB;的内容,它将在该数据库上运行查询 - 此时此工作非常完美,但是当想要使用分隔符语句运行上述块时出现问题 - 它们不会被处理正确地,这里是一个片段,显示我们如何运行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

我遗失了什么?我已经在网上搜索并空手而归,尝试了几种不同的方式w / Odbc类,尝试使用Transaction类等等。

1 个答案:

答案 0 :(得分:1)

DELIMITER永远不会发送到服务器。

DELIMITER的目的是告诉 client 代码当前语句分隔符是什么,以便客户端代码可以将脚本拆分为单独的语句并将语句发送到服务器,单独地,执行。

您需要编写代码来解析DELIMITER语句的内容并拆分分隔符...或者只是自己分隔每个语句并单独发送给服务器。

例如,您可以将整个过程主体作为单个语句发送到服务器。最后的END将被识别为结束过程声明 - 不需要//或其他分隔符。

服务器理解分隔符是一种常见的误解。实际上,如果正常/简单查询以;结尾,则服务器会忽略它。实际上并不需要用分隔符结束任何语句。