Преобразование команды SQL из vb. net в C# - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь проанализировать текст команды SQL в vb. net и интегрировать его для совместимости с C#.

У меня возникают проблемы с преобразованием текста команды SQL из vb. * От 1046 * до 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

Вот что я получил в C#, когда использовал онлайн-конвертер Telerik:

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.VisualBasi c .VisualBasicSyntaxVisitor 1.VisitXmlElement(XmlElementSyntax node)<br> at Microsoft.CodeAnalysis.VisualBasic.Syntax.XmlElementSyntax.Accept[TResult](VisualBasicSyntaxVisitor 1 посетитель)
в Microsoft.CodeAnalysis.VisualBasi c .VisualBasicSyntaxVisitor 1.Visit(SyntaxNode node)<br> at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node)<br> at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor 1.VisitXmlElement (XmlElementSyntaxVisitor)
в Microsoft.CodeAnalysis.VisualBasi XmlElementSyntax.Accept [TResult] (VisualBasicSyntaxVisitor 1 visitor)<br> at ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitSimpleArgument(SimpleArgumentSyntax node)<br> at Microsoft.CodeAnalysis.VisualBasic.Syntax.SimpleArgumentSyntax.Accept[TResult](VisualBasicSyntaxVisitor 1 посетитель)
в Microsoft.CodeAnalysis.VisualBasi c .VisualBasicSyntaxVisitor 1.Visit(SyntaxNode node)<br> at ICSharpCode.CodeConverter.CSharp.CommentConvertingNodesVisitor.DefaultVisit(SyntaxNode node) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor 1.VisitSimpl eArgument (узел SimpleArgumentSyntax) в узлах Microsoft.CodeAnalysis.VisualBasi c .Syntax.SimpleArgumentSyntax.Accept [TResult] (VisualBasicSyntaxVisitor 1 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 *. CodeConverter.CSharp.VisualBasicConverter.NodesVisitor.VisitArgumentList (узел ArgumentListSyntax) в Microsoft.CodeAnalysis.VisualBasi c .Syntax.ArgumentListSyntax.Accept [ICSYNTAX.ArgumentListSyntax.Accept [ICSyntax.ArgumentListSyntax. CommentConvertingNodesVisitor.DefaultVisit (узел SyntaxNode) в Microsoft.CodeAnalysis.VisualBasi c .VisualBasicSyntaxVisitor 1.VisitArgumentList(ArgumentListSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ArgumentListSyntax.Accept[TResult](VisualBasicSyntaxVisitor 1 посетитель) в ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.CSharp.VisualBasicConverter.CSharp.VisualBasicConverter.CSharp.VisualBasicConverter.Nodes Syntax.ObjectCreationExpressionSyntax.Accept [TResult] (VisualBasicSyntaxVisitor 1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor 1.Visit (узел SyntaxNode) в ICSharpCode.CodeConverter.CSharp.CommentConv ertingNodesVisitor.DefaultVisit (узел SyntaxNode) в Microsoft.CodeAnalysis.VisualBasi c .VisualBasicSyntaxVisitor 1.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) at Microsoft.CodeAnalysis.VisualBasic.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](VisualBasicSyntaxVisitor 1 посетитель) в ICSharpCode.CodeConverter.CSharp.VisualBasicConverter.CodeConverter.CSharp.VisualBasicConverter. Syntax.AssignmentStatementSyntax.Accept [TResult] (VisualBasicSyntaxVisitor 1 visitor) at Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxVisitor 1.Visit (узел SyntaxNode) в узле ICSharpCode.CodeConverter.CSharp.CommentConvertingMethodBodyVisitor.ConvertWithTrivia (atConvertingMethodBodyVisitor.ConvertWithTrivia) ICConvertWithTrivia (на узле SyntaxSharispode) *

Я пытаюсь, в конечном итоге, расширить другой запрос, который имеет следующий текст команды; причина, по которой мне нужно расширить его, - это возможность подсчитать общее количество строк, связанных с Num (возвращенные строки, например, если их больше 1):

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

1 Ответ

1 голос
/ 29 мая 2020

Хорошо, что касается первой части, касающейся преобразования , во-первых, вы не копировали весь код VB. Net, в нем отсутствовало много частей ДЛЯ правильного преобразования Код в C#, я выполнил некоторые реализации и преобразовал его на том же веб-сайте, который вы использовали. The 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 код необходимо переписать.

  • Рассмотрите возможность использования метода [Использование ... Завершить использование] с подключением к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...