我正在尝试分析 vb.net 中的SQL命令文本并将其集成以与C#兼容。
我在将 SQL 命令文本从 vb.net 转换为 c# 时遇到问题。
我用了泰勒里克: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 的转换,请在 '(
at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.DefaultVisit(SyntaxNode node(at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
sql..."在字符 3141.VisitXmlElement(XmlElementSyntax node)
1 visitor(at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1.Visit(SyntaxNode node)
at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitXmlElement(XmlElementSyntax
node(
at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor)
1 visitor(
at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node)
at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor
at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.Visit(SyntaxNode node)
1.VisitSimpleArgument(SimpleArgumentSyntax node( at 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__5
2.MoveNext(( at System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() at Microsoft.CodeAnalysis.CSharp.SyntaxFactory.SeparatedList[TNode](IEnumerable
1 个节点( at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList(ArgumentListSyntax node( at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.Visit(SyntaxNode node( at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node( at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitArgumentList(ArgumentListSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor
1 visitor( at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node( at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.Visit(SyntaxNode node( at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node( at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor1.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor
1 visitor( at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.MethodBodyVisitor.VisitAssignmentStatement(AssignmentStatementSyntax node( at Microsoft.CodeAnalysis.VisualBasic.Syntax.AssignmentStatementSyntax.Accept[TResult](VisualBasicSyntaxVisitor1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor
1.Visit(SyntaxNode node( at ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.ConvertWithTrivia(SyntaxNode node( at ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.DefaultVisit(SyntaxNode node(
我最终正在尝试扩展具有以下命令文本的不同查询;我需要扩展它的原因是能够计算与 Num 关联的行总数(返回的行数,例如,如果超过 1(:
dbConnection.Open();
var sqlCmd = dbConnection.CreateCommand();
sqlCmd.CommandText = @"SELECT [ItemID], [Num]
FROM [Test].[dbo].[Invoices]
WHERE Num = '" + orderNumber.ToString() + "'";
好的,关于转换的第一部分,首先,您没有复制 VB.Net 的整个代码,它缺少许多部分为了正确转换为C# 代码,我做了一些实现并在您使用的同一网站中转换了它。VB.Net[应该如此],这并不意味着以正确的方式编写或不会产生错误。
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 代码需要重写。
考虑使用 [使用 ...结束使用]方法与数据库连接。