#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