从 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
我有这个 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