Преобразованная функция из c# в vb.net не работает должным образом

#c# #vb.net #function

Вопрос:

У меня есть код на 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_executesqls N'([sS]*)',s*N'(@[sS]*?)',s*([sS]*)", 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'
 

Когда я преобразую его в vb.net через этот сайт https://converter.telerik.com , для того, чтобы использовать его в 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_executesqls N'([sS]*)',s*N'(@[sS]*?)',s*([sS]*)", RegexOptions.IgnoreCase)
                Dim match = re.Match(origSql)
        
                If match.Success Then
                    Dim sql = match.Groups(1).Value.Replace("''", "'")
                    Dim setting = match.Groups(3).Value amp; ","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, "(" amp; variables(i).Replace("=", "") amp; ")", values(i), RegexOptions.Singleline Or RegexOptions.IgnoreCase)
                    Next
        
                    Return sql
                End If
        
                Return "Unknown sql query format."
            End Function
        End Class
 

но, несмотря на то, что он работает, он не заменяет динамические значения .

Он возвращает это

выберите Blob-данные из ES00Blob, где KeyID = @KeyID И ObjectId = @ObjectId

Я заметил, что при преобразовании символ @ перед кавычками переменной sql и в команде возврата функции отсутствует. В vb.net это не позволит мне использовать символ@.

Есть какие-нибудь идеи, что может быть не так в преобразовании ?

Комментарии:

1. Попробуйте другой конвертер; вероятно, быстрее, чем работать и исправлять себя. Мне нравится icsharpcode один — codeconverter.icsharpcode.net

2. ваша sql переменная-это не одна и та же строка в c# и vb. Версия vb не возвращает никаких совпадений регулярных выражений. Вы можете протестировать его в онлайн-инструменте регулярных выражений.

3. @Anu6is это была ошибка копирования в первые минуты публикации. Я немедленно исправил это. Строка одинакова в обоих случаях.

4. Зачем вообще его преобразовывать? Почему бы не ссылаться на библиотеку dll C#из vb.net проект?

5. Я предлагаю вообще не использовать онлайн-конвертеры. Некоторые из них лучше других, но у всех у них есть проблемы. Я рекомендую загрузить Instant VB из осязаемых программных решений. Бесплатной версии достаточно для большинства людей, и она постоянно обновляется для поддержки новых языковых функций.

Ответ №1:

В твоей For петле ты пропал Step -1 .

Изменить:

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

Для:

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

Конвертирует SQL:

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

    If match.Success Then
        Dim sql = match.Groups(1).Value.Replace("''", "'")
        Dim setting = match.Groups(3).Value amp; ","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, "(" amp; variables(i).Replace("=", "") amp; ")", values(i), (RegexOptions.Singleline Or RegexOptions.IgnoreCase))
        Next

        Return sql
    End If

    Return "Unknown sql query format."
End Function