【问题标题】:Parse command line from a third party program scheduler in VB.NET从 VB.NET 中的第三方程序调度程序解析命令行
【发布时间】:2019-08-29 15:04:32
【问题描述】:

我在创建在 Oracle 数据库中执行存储过程的控制台 vb.net 程序时遇到问题。如果存储过程将在代码中进行硬编码,我可以这样做。问题是,存储过程需要放在供应商程序的参数中。目前,我们使用 VB6 程序来执行此操作。现在,他们想将此 vb6 程序转换为 .NET,但我不知道该怎么做。我尝试了下面的方法,但它没有从 3rd 方程序传递命令参数。

示例。这是第3方程序的截图:

PLSQLSUB.exe 程序是一个调用存储过程 CNC_UNLOCK_USERS 的 vb6。

这是VB6代码,目前正在运行,但我不知道如何在VB.NET中传递外部参数

Private Sub Form_Load()
  Dim cnTrecs As New ADODB.Connection
  Dim QY As New ADODB.Command

  Dim I As Integer

  Dim Procedures(10) As String

  Dim ColonPos As Integer

  Dim CommLine As String
  Dim CommLength As Integer
  Dim StartPos As Integer
  Dim FileName As String
  Dim CheckForFile As String
  Dim User As String
  Dim Pass As String
  Dim Userid As String
  Dim Password As String

  Dim PLSCount As Integer

  PLSCount = 0

  CommLine = Command()
  CommLength = Len(Trim(CommLine))

  If Trim(CommLine) <> "" Then
    StartPos = 1
    For I = 1 To 10
      ColonPos = InStr(StartPos, Trim(CommLine), ";")

      If ColonPos > 0 Then
        Procedures(I) = Mid(CommLine, StartPos, ColonPos - StartPos)
        PLSCount = PLSCount + 1
        StartPos = ColonPos + 1
      ElseIf I > 1 Then
        If (CommLength - StartPos) > 0 Then
          Procedures(I) = Mid(CommLine, StartPos, CommLength - StartPos)
          MsgBox (Procedures(I))
          PLSCount = PLSCount + 1
          Exit For
        Else
          Exit For
        End If
      Else
        Procedures(I) = Trim(CommLine)
        PLSCount = PLSCount + 1
        Exit For
      End If
    Next
    Exit Sub
  Else
    Unload Me
    Exit Sub
  End If

  CheckForFile = Dir("C:\VB\vbtext1.txt")
  If CheckForFile <> "" Then FileName = "d:\VB\vbtext1.txt"
    Open FileName For Input As #5   ' Open UserID and Password file.
      Line Input #5, Userid
      Line Input #5, Password
    Close #5
  End If
  User = Mid(Userid, 1) ' Set database userID
  Pass = Mid(Password, 1) ' Set database password

  cnTrecs.Open "DSN=PLSQLSUB;" _
                & "Uid=" _
                & Trim$(User) & ";PWD=" _
                & Trim$(Pass)

  For I = 1 To PLSCount ' Loop until end of plsql procedures
    Print #1, "The Stored Procedure " & Procedures(I) & " was submitted for execution     
on/at "; Format(Now, "dd-mmm-yyyy hh:mm:ss")

    Set QY.ActiveConnection = cnTrecs
    QY.CommandType = adCmdStoredProc
    QY.CommandText = Procedures(I)
    QY.Execute
    Print #1, "The Stored Procedure " & Procedures(I) & " completed execution on/at ";   
    Format(Now, "dd-mmm-yyyy hh:mm:ss")
    Print #1, " "
  Next I

  If cnTrecs.State = adStateOpen Then
    cnTrecs.Close
  End If
End Sub

一位朋友告诉我使用以下代码,但我无法通过存储过程。任何帮助将不胜感激。

Dim CommandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Application.CommandLineArgs

For i As Integer = 0 To CommandLineArgs.Count - 1
   MessageBox.Show("The stored procedure is: " + CommandLineArgs(i))
Next

【问题讨论】:

  • 上面的 VB6 代码产生了一些输出,您想在 VB.NET 中捕获这些输出 - 对吗?
  • 没错。我希望 VB.NET 以相同的方式运行,即从参数命令(屏幕截图中的基础)运行存储过程。
  • 在我格式化代码后 - 很明显,从 CheckForFile = Dir("C:\VB\vbtext1.txt") 开始的所有内容都不会运行。这是因为If Trim(CommLine) &lt;&gt; "" Then 子句在两个执行路径上都调用Exit Sub。上面的 VB6 代码似乎从来没有工作过。如果我错了,请纠正我。
  • vb6 代码目前可以使用。我没有粘贴整个代码,我只是粘贴了需要在 .NET 中转换的代码,它正在传递命令行或参数。
  • @AllanTolentino 在您的 .net 代码中的 for 语句中放置一个断点。查看CommandLineArgs 包含的内容,并将结果添加到您的问题中。

标签: vb.net vb.net-2010 vb6-migration


【解决方案1】:

如果我理解正确,您想将现有的 VB6 转换为 VB.NET,即从 VB.NET 运行存储过程。因为你的 SP 没有参数,所以使用下面的代码:

Using conn As New OracleConnection("Server=YourOracle;Uid=uid;Pwd=pwd")
  conn.Open()
  Dim cmd As New OracleCommand
  cmd.Connection = conn
  cmd.CommandType = CommandType.StoredProcedure
  cmd.CommandText = "CNC_UNLOCK_USERS"
  Try
    cmd.ExecuteNonQuery()
  Catch ex As OracleException
    'do something
  End Try
End Using

基于Executing stored procedure in vb.net(如果以后需要参数,请参考此链接)。根据您的 VB6 代码,用户 ID 和密码存储在d:\VB\vbtext1.txt 中。不知道为什么它会检查 C: 上的类似位置,并且从不分配 FileName

如果需要通过命令行传递存储过程的名称,则需要将Startup object切换为Sub Main(项目属性->应用程序选项卡),然后将类似代码放入一个新类中:

Public Class Class1
  Shared Sub Main(args() As String)
    'parse args and save it somewhere
    Form1.ShowDialog()
  End Sub
End Class

在显示表单之前,请确保将 args(0) 保存为要执行的存储过程的名称。或者你可以在表单上有一个自定义的ShowDialog,它接受String 类型的参数,然后调用它。我建议您转换为控制台应用程序,因为它现在无论如何都会显示其 UI。然后你只需在Sub Main 中执行上面的代码,改变这一行:

cmd.CommandText = "CNC_UNLOCK_USERS"

到这里:

cmd.CommandText = args(0)

【讨论】:

  • 这是我最初的解决方案,但他们希望从命令行参数执行存储过程。 (见上面的屏幕截图)。假设 PLSQLSUB.exe 是 .NET 程序,那么 CNC_UNLOCK_USERS 是存储过程。存储过程不能从代码中硬编码。顺便感谢您的回复。
  • @AllanTolentino:我很困惑。您说 PLSQLSUB.exe 是 VB6,而不是 .NET。所以转换对你不起作用,你想从 .NET 运行 PLSQLSUB?请确认。
  • 抱歉给您带来了困惑。 PLSQLSUB.exe 目前是 VB6,我目前正在转换为 .NET
  • @AllanTolentino:我想我现在明白你的意思了。请查看我的编辑。
  • @MarkHall:如果第 3 方软件调用 OP 的实用程序并通过命令行将参数传递给它 - 这是一个故事。如果您的程序启动并从该第 3 方软件中窃取某些内容 - 那是另一个。在继续之前,我们需要确定谁打电话给谁。换句话说,应该澄清事件的顺序。
【解决方案2】:

您可以使用Environment.GetCommandLineArgs 方法来检索命令行参数。在进一步查看您的问题时,您已经在做类似的事情,我的问题是您尝试导入 StoredProcedure 或要运行的 StoredProcedure 的名称。

【讨论】:

  • 名字,从我得到的。
  • @Neolisk 然后是你的方法,甚至是他在问题中展示的方法,它与我发布的方法等效。
  • 马克,这就是我正在尝试使用的,但我猜不知道如何使用它。是的,我试图从供应商程序的文本框中导入存储过程的名称。请帮忙。
  • @AllanTolentino 您是说您正在尝试从供应商程序的文本框中导入存储过程名称,您用于启动程序的命令行如何/是什么?或者您是否尝试从第 3 方程序中读取或提取数据。
  • @AllanTolentino 在查看 VB6 命令方法时声明它返回程序名称之后的所有内容,这是第一个命令行参数。所以看起来你的程序是用一些命令行参数调用的。帮我一个忙,列出GetCommandLIneArgs 返回的内容。我们在这里有点盲目,看不到到底发生了什么。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 2017-01-31
  • 2011-10-18
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多