将 SQL 命令从 vb .net 转换为 C#

Posted

技术标签:

【中文标题】将 SQL 命令从 vb .net 转换为 C#【英文标题】:Converting SQL command from vb .net to C# 【发布时间】:2020-05-29 16:50:00 【问题描述】:

我正在尝试分析 vb.net 中的 SQL 命令文本并将其集成以与 C# 兼容。

我在将 SQL 命令文本从 vb.net 转换为 c# 时遇到问题。

我使用 Telerik:http://converter.telerik.com/

并得到了这些结果(如下所示)。我想知道是否有熟悉 VB.NET 和 C# 的人可以帮助我重新编写完整的 SQL 命令文本。

vb.net 原命令文本:

Dim r As SqlDataReader = sqlCommand.ExecuteReader()

Do While True
    If r.Read() Then
         SQL2 = "SELECT * from Invoices "
         SQL2 = SQL2 & " WHERE Num = '" & r("Num") & "'"

         conPubs2 = New SqlConnection(<ConnectionString>)
         sqlCommand2 = New SqlCommand(SQL2, conPubs2)
         conPubs2.Open()

         Dim r2 As SqlDataReader = sqlCommand2.ExecuteReader()

         Do While True
             If r2.Read() Then
                 MsgBox(RTrim(r("Num")) & ": " & RTrim(r2("ItemID")))
             Else
                 Exit Do
             End If
         Loop

    Else
        Exit Do
    End If
Loop

conPubs.Close()
conPubs2.Close()

End Sub

这是我在使用 Telerik 的在线转换器时在 C# 中得到的:

SqlDataReader r = sqlCommand.ExecuteReader();

while (true)

    if (r.Read())
    
        SQL2 = "SELECT * from Invoices ";
        SQL2 = SQL2 + " WHERE Num = '" + r("Num") + "'";

/* 无法转换AssignmentStatementSyntax,转换错误:未实现XmlElement 转换,请在')中报告此问题 sql...' 在字符 314

在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.DefaultVisit(SyntaxNode 节点) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitXmlElement(XmlElementSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 访问者) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node) at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitXmlElement(XmlElementSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 访问者) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node) at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitSimpleArgument(SimpleArgumentSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.<>c__DisplayClass83_0.<ConvertArguments>b__0(ArgumentSyntax a, Int32 i) at System.Linq.Enumerable.<SelectIterator>d__52.MoveNext() 在 System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.SeparatedList[TNode](IEnumerable1 个节点) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList(ArgumentListSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode 节点) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitArgumentList(ArgumentListSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 访问者) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitObjectCreationExpression(ObjectCreationExpressionSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode 节点) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 访问者) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitAssignmentStatement(AssignmentStatementSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.AssignmentStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.ConvertWithTrivia(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode 节点)

我最终会尝试扩展具有以下命令文本的不同查询;我需要扩展它的原因是能够计算与 Num 关联的总行数(返回的行数,例如,如果超过 1):

dbConnection.Open();
var sqlCmd = dbConnection.CreateCommand();
sqlCmd.CommandText = @"SELECT [ItemID], [Num]
                       FROM [Test].[dbo].[Invoices]
                       WHERE Num = '" + orderNumber.ToString() + "'";

【问题讨论】:

New SqlConnection(&lt;ConnectionString&gt;) 甚至不是 VB.NET 的有效语法,因此请修复它(为此目的传递 "" 就足够了)并重试转换。但是,这是非常糟糕的 VB.NET 代码,因此您将从转换中得到同样糟糕的 C# 代码。您最好弄清楚该代码的最终目标并从头开始重写 C# 代码。 同意。看起来&lt;ConnectionString&gt; 是一个占位符,在代码中被替换为某种预编译步骤。 天哪!我需要考虑一下你在告诉我什么。我会考虑一下并很快回来。谢谢。 请张贴整个方法。然后@我让我知道这一切都在那里。我相信我可以转换它,但是如果不同时修复疯狂的 sql 注入安全问题,这样做是不妥的,如果我能看到周围的代码,那就更好了。我也很有可能将性能提高一个数量级。 请不要将此代码转换成任何东西!保持连接打开的时间很长。看在上帝的份上,代码甚至在连接打开时显示一个消息框。如果用户去吃午饭怎么办。重新开始吧。 【参考方案1】:

好的,关于转换的第一部分,首先,你没有复制VB.Net的整个代码,它缺少很多部分为了正确转换 转换为 C# 代码,我做了一些实现并将其转换到您使用的同一个网站中。 VB.Net [As it should be],这并不意味着它以正确的方式编写或不会产生错误。

Sub Hello()
        Dim conPubs As SqlClient.SqlConnection = New SqlClient.SqlConnection With .ConnectionString = "Your_ConnectionString"
        conPubs.Open()
        Dim ThisCommand1 As New SqlClient.SqlCommand 'This line was missing from the example you copied this from.
        Dim r As SqlClient.SqlDataReader = ThisCommand1.ExecuteReader
        Do While True
            If r.Read() Then
                Dim SQL2 As String = "SELECT * from Invoices WHERE Num = '" & r("Num") & "'"
                Dim conPubs2 = New SqlClient.SqlConnection("")
                Dim sqlCommand2 = New SqlClient.SqlCommand(SQL2, conPubs2)
                conPubs2.Open()
                Dim r2 As SqlClient.SqlDataReader = sqlCommand2.ExecuteReader()
                Do While True
                    If r2.Read() Then
                        MsgBox(RTrim(r("Num")) & ": " & RTrim(r2("ItemID")))
                    Else
                        Exit Do
                    End If
                Loop
                conPubs2.Close()       'Is a second SqlServer Connection
            Else
                Exit Do
            End If
        Loop
        conPubs.Close()      'Is SqlServer Connection
    End Sub

向 C# 的转换:

public void Hello()

    SqlClient.SqlConnection conPubs = new SqlClient.SqlConnection()  ConnectionString = "Your_ConnectionString" ;
    conPubs.Open();
    SqlClient.SqlCommand ThisCommand1 = new SqlClient.SqlCommand(); // This line was missing from the example you copied this from.
    SqlClient.SqlDataReader r = ThisCommand1.ExecuteReader;
    while (true)
    
        if (r.Read())
        
            string SQL2 = "SELECT * from Invoices WHERE Num = '" + r("Num") + "'";
            var conPubs2 = new SqlClient.SqlConnection("");
            var sqlCommand2 = new SqlClient.SqlCommand(SQL2, conPubs2);
            conPubs2.Open();
            SqlClient.SqlDataReader r2 = sqlCommand2.ExecuteReader();
            while (true)
            
                if (r2.Read())
                    MsgBox(RTrim(r("Num")) + ": " + RTrim(r2("ItemID")));
                else
                    break;
            
            conPubs2.Close();       // Is a second SqlServer Connection
        
        else
            break;
    
    conPubs.Close();      // Is SqlServer Connection

再次提醒:

这回答了您的转换问题,但并不意味着 VB .Net 代码不会产生错误。

在 VB.Net 中:

VB.Net代码需要重写。

考虑对数据库连接使用 [Using ... End Using] 方法。

【讨论】:

以上是关于将 SQL 命令从 vb .net 转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 转换为 vb.net 后,它显示错误

如何将 C# 多维列表转换为 VB.Net

如何将带有枚举的 VB.net 接口转换为 C#

需要帮助将 c# 中的 opencv 转换为 vb.net

VB,如何将字符串型转化为日期型?

C# 到 VB.Net:为啥转换为 VB 时编译失败?