【发布时间】: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)1 访问者)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor
在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node)1.VisitXmlElement(XmlElementSyntax 节点)
at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
在 Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor)1 访问者)
at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor
在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node)1.VisitSimpleArgument(SimpleArgumentSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor
at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.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(<ConnectionString>)甚至不是 VB.NET 的有效语法,因此请修复它(为此目的传递 "" 就足够了)并重试转换。但是,这是非常糟糕的 VB.NET 代码,因此您将从转换中得到同样糟糕的 C# 代码。您最好弄清楚该代码的最终目标并从头开始重写 C# 代码。 -
同意。看起来
<ConnectionString>是一个占位符,在代码中被替换为某种预编译步骤。 -
天哪!我需要考虑一下你在告诉我什么。我会考虑一下并很快回来。谢谢。
-
请张贴整个方法。然后@我让我知道这一切都在那里。我相信我可以转换它,但是如果不同时修复疯狂的 sql 注入安全问题,这样做是不妥的,如果我能看到周围的代码,那就更好了。我也很有可能将性能提高一个数量级。
-
请不要将此代码转换成任何东西!保持连接打开的时间很长。看在上帝的份上,代码甚至在连接打开时显示一个消息框。如果用户去吃午饭怎么办。重新开始吧。
标签: c# sql vb.net vb.net-to-c#