Syntaxunterschiede zwischen VBS und VB.Net

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Syntaxunterschiede zwischen VBS und VB.Net

    Hallo,

    ich stell mich mal wieder dähmlich an. Normalerweise schreibe ich nur in VBS. Da wir auf arbeit ne neue Software bekommen muss ich auf VB.NET umsteigen.
    Ich möchte eine Datenbankabfrage machen. Um das Ganze zu testen, habe ich alles kurz mit VBS durchgespielt und hatte Erfolg. Nun wollte ich den Code auf VB.NET anpassen.
    Wenn ich den Code ausführe bleibt er mir in einer Schleife hängen ohne einen Fehler auszuspucken.

    Im Detail bleibt er mir immer dann hängen wenn ich Ergebnis_SWPDM_WRITE("VALUETEXT") einsetze.!
    Wenn ich in der Schleife Do While Not Ergebnis_SWPDM_WRITE.eof alles, bis auf die Test MsgBox 2.8 auskommentiere läuft die Schleife durch. (hab ich mit Test MsgBox 3.4 kontrolliert)
    Ich hab schon überlegt ob ich bei der Deklaration von Dim Ergebnis_SWPDM_WRITE As Object etwas falsch mache.

    Naja jedenfalls hoffe ich, das Ihr mir die Augen öffnen könnt.

    VB.NET-Quellcode

    1. If poCmd.meCmdType = EdmCmdType.EdmCmd_Menu Then
    2. If poCmd.mlCmdID = 1 Then
    3. 'Für alle betroffenen Dateien
    4. Dim Zaehler As Long
    5. Zaehler = LBound(ppoData)
    6. Dim Letzter_Zaehler As Long
    7. Letzter_Zaehler = UBound(ppoData)
    8. Dim Dateiname As String
    9. Dim Datei_ID As Long
    10. Dim Ordner_ID As Long
    11. Dim arrayLine As EdmCmdData
    12. While Zaehler <= Letzter_Zaehler
    13. arrayLine = ppoData(Zaehler)
    14. Dateiname = arrayLine.mbsStrData1
    15. Datei_ID = arrayLine.mlObjectID1
    16. Ordner_ID = arrayLine.mlObjectID2
    17. MsgBox(Dateiname)
    18. Dim DBVerbindung_SWPDM_WRITE As Object
    19. Dim SQL_ABfrage_SWPDM_WRITE As String
    20. Dim Ergebnis_SWPDM_WRITE As Object
    21. Dim MSG_Text As String
    22. Const Verbindung_SWPDM_WRITE = "Provider=SQLOLEDB.1;Password=xyaqw;Persist Security Info=True;User ID=xyaqw;Initial Catalog=ITAB;Data Source=171DB1"
    23. DBVerbindung_SWPDM_WRITE = CreateObject("ADODB.Connection")
    24. DBVerbindung_SWPDM_WRITE.Open(Verbindung_SWPDM_WRITE)
    25. SQL_ABfrage_SWPDM_WRITE = "SELECT DOCUMENTID, VALUETEXT, VARIABLEID FROM VARIABLEVALUE WHERE VARIABLEID = '72' AND DOCUMENTID = '12901'"
    26. Ergebnis_SWPDM_WRITE = DBVerbindung_SWPDM_WRITE.Execute(SQL_ABfrage_SWPDM_WRITE)
    27. Ergebnis_SWPDM_WRITE.Movefirst
    28. 'MsgBox(Ergebnis_SWPDM_WRITE("VARIABLEID"))
    29. Do While Not Ergebnis_SWPDM_WRITE.eof
    30. MsgBox("2.8")
    31. MSG_Text = Ergebnis_SWPDM_WRITE("VALUETEXT")
    32. MsgBox(MSG_Text)
    33. ' MsgBox("3.0")
    34. Ergebnis_SWPDM_WRITE.Movenext
    35. Loop
    36. Ergebnis_SWPDM_WRITE.Close
    37. DBVerbindung_SWPDM_WRITE.Close
    38. MsgBox("3.3")
    39. Zaehler = Zaehler + 1
    40. End While
    41. MsgBox("3.4")
    42. End If
    43. End If

    @Bot-Like Mach mal einen Code, der mit C&P compiliert.
    Was fehlt: Deklaration der Variablen,
    ggf. erforderliche GUI-Controls,
    erforderliche Verweise.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich sehe grade, daß der code ja auch noch Strict Off programiert ist, auch das solltest du erstmal ändern.
    Wenn du zeitnah erfolgreich sein willst, ist der bessere weg es richtig zu machen, auf die schnelle sich was zusammenfuschen, führt meistens zu mehr Problemen und dann war es das mit zeitnah.

    edit: Visual Studio - Empfohlene Einstellungen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FormFollowsFunction“ ()

    @FormFollowsFunction willkommene in der Welt von VBS
    Und willkommen in der Realität vieler IT-Mitarbeiter. Da wird dann X Entschieden und durch geprügelt. Und die MA müssen da dann durch.

    @Bot-Like mich würde schon interessieren warum du dich ad-hoc umgewöhnen musst.
    Was ist das Ziel der obigen Abfrage? Könnte man vielleicht vorerst dein VbScript via VB.net aufrufen und du kümmerst dich dann um das Neu erlernen?
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron:
    Danke für die verteidigenden Worte! Das beschreibt meine Situation recht präzise.

    Ich bin "eigentlich" Konstrukteur und habe mir VBS nur nebenbei angelesen um unser derzeities PDM System (DBworks) etwas smarter zu machen. DBworks arbeitete intern mit VBS, deshalb fiel meine Wahl darauf. Nun haben die hohen Herren beschlossen uns ein neues System auf zu zwingen, das wir eigentlich nicht wollen.
    Jedenfalls bin ich der Glückliche, der es einrichten darf und bin nun um Schadensbegrenzung bemüht, in dem ich ein paar liebgewonnene Funktionen nachbauen will.
    Das neue System kann intern nur per API über VB.Net oder C# angesprochen werden.
    Auch hier fiel mir die Wahl nicht schwer, da ich mit VB.Net wenigstens noch bei Visual Basic bleiben kann.

    Nun zu deinem Vorschlag:
    Wenn ich im VB.Net mit einem Run eine VBS starte, müsste ich Ihr irgendwie mehrere Parameter (Dateiname, User, Dokument ID, etc.) mitgeben und diese dann in VBS auslesen. Keine Ahnung wie das geht.
    Dann könnte es noch sein, dass unser Gesamt-Konzern Vieren Programm mault. Das hatte ich bei manchen VBscripts mit run auch schon. Das gilt es halt zu prüfen.

    Der Gedanke klingt verlockend, fühlt sich aber eben wirklich nach Fusch an.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bot-Like“ ()

    Wenn es eine .net API ist sollte man diese auch in VBS einbinden können:
    CreateObject()
    Auf Dauer macht aber eine .net Sprache mehr Sinn.
    In deinem obigen Beispiel sehe ich keine API eingebunden.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Hier wie angekündigt der Ganze Code:
    (Das ist zur zeit nur der Test ob ich es hinbekomme im VB.Net mit SQL rumzuwurschteln. --> ich bekomms zur zeit halt nur mit VBS geregelt)

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Runtime.InteropServices
    3. Imports EdmLib
    4. <Guid("FA8ACE5A-9CC5-4DC3-7D35-A2EBADB9BB3F")> <ComVisible(True)>
    5. Public Class AddinStart
    6. Implements IEdmAddIn5
    7. Public Sub GetAddInInfo(ByRef poInfo As EdmAddInInfo, ByVal poVault As IEdmVault5, ByVal poCmdMgr As IEdmCmdMgr5) Implements IEdmAddIn5.GetAddInInfo
    8. ' Fill in the add-in's description
    9. poInfo.mbsAddInName = "Arbeitssatz"
    10. poInfo.mbsCompany = "XXXXXXXXX"
    11. poInfo.mbsDescription = "Addin reagiert auf Kontextmenueintrag:" & vbCrLf
    12. poInfo.mbsDescription = poInfo.mbsDescription & "'Arbeitssatz\Dateien hinzufügen'" & vbCrLf
    13. poInfo.mbsDescription = poInfo.mbsDescription & "und startet die Arbeitssatzfunktion" & vbCrLf & vbCrLf
    14. poInfo.mbsDescription = poInfo.mbsDescription & "Das Visual-Studio-Projekt um dieses Addin zu ändern liegt unter:" & vbCrLf
    15. poInfo.mbsDescription = poInfo.mbsDescription & "XXXXXXXXX"
    16. poInfo.mlAddInVersion = 1
    17. poInfo.mlRequiredVersionMajor = 18
    18. poInfo.mlRequiredVersionMinor = 2
    19. ' Register a menu command
    20. poCmdMgr.AddCmd(1, "Arbeitssatz\Dateien hinzufügen", EdmMenuFlags.EdmMenu_Nothing)
    21. End Sub
    22. Public Sub OnCmd(ByRef poCmd As EdmCmd, ByRef ppoData As Array) Implements IEdmAddIn5.OnCmd
    23. If poCmd.meCmdType = EdmCmdType.EdmCmd_Menu Then
    24. If poCmd.mlCmdID = 1 Then
    25. 'Für alle betroffenen Dateien
    26. Dim Zaehler As Long
    27. Zaehler = LBound(ppoData)
    28. Dim Letzter_Zaehler As Long
    29. Letzter_Zaehler = UBound(ppoData)
    30. Dim Dateiname As String
    31. Dim Datei_ID As Long
    32. Dim Ordner_ID As Long
    33. Dim arrayLine As EdmCmdData
    34. While Zaehler <= Letzter_Zaehler
    35. arrayLine = ppoData(Zaehler)
    36. Dateiname = arrayLine.mbsStrData1
    37. Datei_ID = arrayLine.mlObjectID1
    38. Ordner_ID = arrayLine.mlObjectID2
    39. MsgBox(Dateiname)
    40. Dim DBVerbindung_SWPDM_WRITE As Object
    41. Dim SQL_ABfrage_SWPDM_WRITE As String
    42. Dim Ergebnis_SWPDM_WRITE As Object
    43. Dim MSG_Text As String
    44. Const Verbindung_SWPDM_WRITE = "Provider=SQLOLEDB.1;Password=XXXXXXXXX;Persist Security Info=True;User ID=XXXXXXXXX;Initial Catalog=ITAB;Data Source=XXXXXXXXX"
    45. DBVerbindung_SWPDM_WRITE = CreateObject("ADODB.Connection")
    46. DBVerbindung_SWPDM_WRITE.Open(Verbindung_SWPDM_WRITE)
    47. SQL_ABfrage_SWPDM_WRITE = "SELECT DOCUMENTID, VALUETEXT, VARIABLEID FROM VARIABLEVALUE WHERE VARIABLEID = '72' AND DOCUMENTID = '12901'"
    48. Ergebnis_SWPDM_WRITE = DBVerbindung_SWPDM_WRITE.Execute(SQL_ABfrage_SWPDM_WRITE)
    49. Ergebnis_SWPDM_WRITE.Movefirst
    50. ' MsgBox(Ergebnis_SWPDM_WRITE("VARIABLEID"))
    51. Do While Not Ergebnis_SWPDM_WRITE.eof
    52. MsgBox("2.8")
    53. MSG_Text = Ergebnis_SWPDM_WRITE("VALUETEXT")
    54. MsgBox(MSG_Text)
    55. ' MsgBox("3.0")
    56. Ergebnis_SWPDM_WRITE.Movenext
    57. Loop
    58. Ergebnis_SWPDM_WRITE.Close
    59. DBVerbindung_SWPDM_WRITE.Close
    60. MsgBox("3.3")
    61. Zaehler = Zaehler + 1
    62. End While
    63. MsgBox("3.4")
    64. End If
    65. End If
    66. End Sub
    Definiere SQL etwas genauer. Ist es MySQL? SQL Server? Oracle? was ganz anderes? Für alles gibt es spezielle Klassen (entweder per zusaätzlicher DLL (MySQL, Oracle) oder direkt im Framework (SQL Server)), sodass du nicht mit ner "generischen" OleDB Verbindung arbeiten musst (wofür es jedoch auch eine spezielle Klasse im Framework gibt).
    Nun, das kommt darauf an, was dein Programm so machen soll.
    Wenn es nur darum geht Daten möglichst schnell aus der Datenbank in ein anderes Format zu bringen, dann geht nichts über den DataReader:
    VB.NET | Achtung! Code Converter

    VB.NET-Quellcode

    1. Private Sub OnCMD(ByRef poCmd As EdmCmd, ByRef ppoData() As EdmCmdData)
    2. If (poCmd.meComdType = EdmCmdType.EdmCmd_Menu) Then
    3. If (poCmd.mlCmdID = 1) Then
    4. Dim counter As Integer = ppoData.GetLowerBound(1)
    5. Dim lastCounter As Integer = ppoData.GetUpperBound(1)
    6. Dim filename As String = string.Empty
    7. Dim file_ID As Integer = 0
    8. Dim folder_ID As Integer = 0
    9. Dim arrayLine As EdmCmdData = Nothing
    10. Using sqlConn As SqlConnection = New SqlConnection("Data Source=XXXXXXXXX;User ID=XXXXXXXXX;Password=XXXXXXXXX;Initial Catalog=ITAB;Persist Security Info=True;")
    11. sqlConn.Open
    12. For i As Integer = counter To lastCounter
    13. arrayLine = ppoData(i)
    14. filename = arrayLine.mbsStrData1
    15. file_ID = arrayLine.mlObjectID1
    16. folder_ID = arrayLine.mlObjectID2
    17. Dim valuetext As String = String.Empty
    18. MessageBox.Show(filename)
    19. Using sqlComm As SqlCommand = New SqlCommand("SELECT DOCUMENTID, VALUETEXT, VARIABLEID FROM VARIABLEVALUE WHERE VARIABLEID = '72' AND DOCUMENTID = '12901'")
    20. Using sqleader As SqlDataReader = sqlComm.ExecuteReader
    21. While sqleader.Read
    22. MessageBox.Show("2.8")
    23. valuetext = sqleader.GetString(1)
    24. MessageBox.Show(valuetext)
    25. 'Do other stuff
    26. End While
    27. End Using
    28. MessageBox.Show("3.3")
    29. Next
    30. MessageBox.Show("3.4")
    31. End Using
    32. End If
    33. End If
    34. End Sub
    C# Original

    C#-Quellcode

    1. private void OnCMD(ref EdmCmd poCmd, ref EdmCmdData[] ppoData)
    2. {
    3. if (poCmd.meComdType == EdmCmdType.EdmCmd_Menu)
    4. {
    5. if (poCmd.mlCmdID == 1)
    6. {
    7. int counter = ppoData.GetLowerBound(1);
    8. int lastCounter = ppoData.GetUpperBound(1);
    9. string filename = string.Empty;
    10. int file_ID = 0;
    11. int folder_ID = 0;
    12. EdmCmdData arrayLine = null;
    13. using (SqlConnection sqlConn = new SqlConnection("Data Source=XXXXXXXXX;User ID=XXXXXXXXX;Password=XXXXXXXXX;Initial Catalog=ITAB;Persist Security Info=True;"))
    14. {
    15. sqlConn.Open();
    16. for (int i = counter; i < lastCounter; i++)
    17. {
    18. arrayLine = ppoData[i];
    19. filename = arrayLine.mbsStrData1;
    20. file_ID = arrayLine.mlObjectID1;
    21. folder_ID = arrayLine.mlObjectID2;
    22. string valuetext = string.Empty;
    23. MessageBox.Show(filename);
    24. using (SqlCommand sqlComm = new SqlCommand("SELECT DOCUMENTID, VALUETEXT, VARIABLEID FROM VARIABLEVALUE WHERE VARIABLEID = '72' AND DOCUMENTID = '12901'"))
    25. using (SqlDataReader sqleader = sqlComm.ExecuteReader())
    26. {
    27. while (sqleader.Read())
    28. {
    29. MessageBox.Show("2.8");
    30. valuetext = sqleader.GetString(1);
    31. MessageBox.Show(valuetext);
    32. //Do other stuff
    33. }
    34. }
    35. MessageBox.Show("3.3");
    36. }
    37. }
    38. MessageBox.Show("3.4");
    39. }
    40. }
    41. }


    Was jedoch noch interessant wäre, wäre wie die Daten übergeben werden. Ich bin jetzt einfach mal davon ausgegangen, dass diese Funktion direkt das Array mit dem richtigen Typ übergeben bekommt, wodurch ein paar Zeilen gespart werden können. Die sonst durch das Casting und die Nothing-Prüfung draufgehen würden (wobei man hier wirklich das Array auf Nothing prüfen sollte).

    Außerdem, ist das ByRef wirklich wichtig? Nimmst du innerhalb der MEthode Änderungen an den übergebenen Parametern vor?



    Zum Abschluss, wenn du die Daten jedoch in irgendeiner Form anzeigen möchtest (kenn mich bei Add-Ins nun nicht so sehr aus), dann solltest du besser mal hier anfangen:
    Datenverarbeitungs-Voraussetzungen

    Dadurch bekommst du einen guten Ausblick darauf, wie man in VB.NET mit Databinding umgeht, damit man sich nur noch wenig um die Datenbankbefehle kümmern muss.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    Ich will mit dem Programm streng genommen nur zwei Dinge tun.
    1. Select abfragen stellen und die Ergebnisse in Variablen übergeben.
    2. mit dem SQL Update Statement Werte in der DB ändern.

    Das mit dem SQLDatareader ist also schon mal die halbe Miete!
    (Dafür also schon mal Danke!)

    Ich gehe mal davon aus, wenn der Befehl schon DataREADER heißt,
    brauch ich sicher nicht versuchen damit ein "Update" zu executen.

    Wie sieht denn der Weg dafür aus?


    ..........................................


    Edit:
    Ich habe es trotzdem probiert ... Mann kann mit dem Datareader auch ein SQL Update Statement ausführen! Das beendet meine Suche an der Stelle!

    Danke an alle!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bot-Like“ ()

    Sag mal, kann es sein, daß du keine Haltepunkte zum debuggen nutzt ?
    Die vielen VB6 (!) Messageboxen lassen darauf schließen.

    Debuggen, Fehler finden und beseitigen
    Ok, dann verurteile ich dich dazu, dich zeitnah damit anzufreunden (ohne Bewährung) ! :D
    Du wirst es zu schätzen wissen !
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!