从 c# 到 vb.net 的转换函数无法正常工作

Converted function from c# to vb.net is not working properly

我有这个 c# 代码可以将动态 sql 查询转换为简单的 sql 查询

    using System;
    using System.Linq;
    using System.Text.RegularExpressions;
                        
    public class Program
    {
        public static void Main()
        {
            var sql = @"
exec sp_executesql N' select Blobdata from ES00Blob  where KeyID = @KeyID AND ObjectID = @ObjectID  ',N'@KeyID nvarchar(15),@ObjectID nvarchar(13),@TypeID int',@KeyID=N'100',@ObjectID=N'ES00DBPROFILE'
    ";
            Console.WriteLine(ConvertSql(sql));
        }
    
        public static string ConvertSql(string origSql)
        {
            var re = new Regex(@"exec*\s*sp_executesql\s+N'([\s\S]*)',\s*N'(@[\s\S]*?)',\s*([\s\S]*)", RegexOptions.IgnoreCase); // 1: the sql, 2: the declare, 3: the setting
            var match = re.Match(origSql);
            if (match.Success)
            {
                var sql = match.Groups[1].Value.Replace("''", "'");
                var setting = match.Groups[3].Value + ',';
        
                var re2 = new Regex(@"@[^',]*?\s*=");
                var variables = re2.Matches(setting).Cast<Match>().Select(m => m.Value).ToArray();
                var values = re2.Split(setting).Where(s=>!string.IsNullOrWhiteSpace(s)).Select(m => m.Trim(',').Trim().Trim(';')).ToArray();
                for (int i = variables.Length-1; i>=0; i--)
                {
                    sql = Regex.Replace(sql, "(" + variables[i].Replace("=", "")+")", values[i], RegexOptions.Singleline | RegexOptions.IgnoreCase);
                }
                return sql;
            }
        
            return @"Unknown sql query format.";
    
        }
    }

例如sql变量查询的结果如下

select Blobdata from ES00Blob  where KeyID = N'100' AND ObjectID = N'ES00DBPROFILE'

当我通过此站点 https://converter.telerik.com 将它转换为 vb.net 时,为了在 vb.net 项目中使用它,它被转换为如下所示

     Imports System
        Imports System.Linq
        Imports System.Text.RegularExpressions
        
        Public Class Program
            Public Shared Sub Main()
                Dim sql = "

exec sp_executesql N' select Blobdata from ES00Blob  where KeyID = @KeyID AND ObjectID = @ObjectID  ',N'@KeyID nvarchar(15),@ObjectID nvarchar(13),@TypeID int',@KeyID=N'100',@ObjectID=N'ES00DBPROFILE'
        
        "
                Console.WriteLine(ConvertSql(sql))
            End Sub
        
            Public Shared Function ConvertSql(ByVal origSql As String) As String
                Dim re = New Regex("exec*\s*sp_executesql\s+N'([\s\S]*)',\s*N'(@[\s\S]*?)',\s*([\s\S]*)", RegexOptions.IgnoreCase)
                Dim match = re.Match(origSql)
        
                If match.Success Then
                    Dim sql = match.Groups(1).Value.Replace("''", "'")
                    Dim setting = match.Groups(3).Value & ","c
                    Dim re2 = New Regex("@[^',]*?\s*=")
                    Dim variables = re2.Matches(setting).Cast(Of Match)().[Select](Function(m) m.Value).ToArray()
                    Dim values = re2.Split(setting).Where(Function(s) Not String.IsNullOrWhiteSpace(s)).[Select](Function(m) m.Trim(","c).Trim().Trim(";"c)).ToArray()
        
                    For i As Integer = variables.Length - 1 To 0
                        sql = Regex.Replace(sql, "(" & variables(i).Replace("=", "") & ")", values(i), RegexOptions.Singleline Or RegexOptions.IgnoreCase)
                    Next
        
                    Return sql
                End If
        
                Return "Unknown sql query format."
            End Function
        End Class

但尽管它在工作,但它不会替换动态值。

是return这个

select 来自 ES00Blob 的 Blob 数据,其中 KeyID = @KeyID AND ObjectID = @ObjectID

我注意到在转换过程中,sql 变量引号前的 @ 字符和函数的 return 命令中的 @ 字符丢失了。在 vb.net 中,它不允许我使用 @ 字符。

转换中可能有什么问题?

在您的 For 循环中,您缺少 Step -1

变化:

For i As Integer = variables.Length - 1 To 0

:

For i As Integer = variables.Length - 1 To 0 Step -1

ConvertSql:

Public Shared Function ConvertSql(ByVal origSql As String) As String
    Dim re = New Regex("exec*\s*sp_executesql\s+N'([\s\S]*)',\s*N'(@[\s\S]*?)',\s*([\s\S]*)", RegexOptions.IgnoreCase)
    Dim match = re.Match(origSql)

    If match.Success Then
        Dim sql = match.Groups(1).Value.Replace("''", "'")
        Dim setting = match.Groups(3).Value & ","c
        Dim re2 = New Regex("@[^',]*?\s*=")
        Dim variables = re2.Matches(setting).Cast(Of Match)().[Select](Function(m) m.Value).ToArray()

        Dim values = re2.Split(setting).Where(Function(s) Not String.IsNullOrWhiteSpace(s)).[Select](Function(m) m.Trim(","c).Trim().Trim(";"c)).ToArray()

        For i As Integer = variables.Length - 1 To 0 Step -1
            sql = Regex.Replace(sql, "(" & variables(i).Replace("=", "") & ")", values(i), (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
        Next

        Return sql
    End If

    Return "Unknown sql query format."
End Function