将 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.VisualBasicSyntaxVisitor
1.VisitXmlElement(XmlElementSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor
1 访问者) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node) at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.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](VisualBasicSyntaxVisitor
1 访问者) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node) at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.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__5
2.MoveNext() 在 System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.SeparatedList[TNode](IEnumerable
1 个节点) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList(ArgumentListSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.Visit(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode 节点) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitArgumentList(ArgumentListSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor
1 访问者) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitObjectCreationExpression(ObjectCreationExpressionSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.Visit(SyntaxNode 节点) 在 ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode 节点) 在 Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor
1 访问者) 在 ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitAssignmentStatement(AssignmentStatementSyntax 节点) 在 Microsoft.CodeAnalysis.VisualBasic.Syntax.AssignmentStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.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 注入安全问题,这样做是不妥的,如果我能看到周围的代码,那就更好了。我也很有可能将性能提高一个数量级。
请不要将此代码转换成任何东西!保持连接打开的时间很长。看在上帝的份上,代码甚至在连接打开时显示一个消息框。如果用户去吃午饭怎么办。重新开始吧。
【参考方案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#的主要内容,如果未能解决你的问题,请参考以下文章