Auf MSSQL DB zugreifen

  • VB.NET

Es gibt 80 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Auf MSSQL DB zugreifen

    Hi,

    bis jetzt habe ich die Daten meiner Programme lokal als .xml abgespeichert. Beim Start wird die Datei gelesen & das vorhandene DataSet aktualisiert.
    Jetzt soll ein Programm allerdings von beliebig vielen Pcs auf die gleichen Daten zugreifen und ich habe eine MS SQL 2012 DB bereitgestellt bekommen.
    Nun stehe ich vor der Herrausforderung auf diese DB zuzugreifen und die Funktionalität so hinzubekommen, wie es auch mit der xml war.
    Also DB auslesen und DataSet füllen und beim schließen das DataSet in die DB schreiben. Bis jetzt hatte ich noch nichts mit SQL am Hut, ich hab jetzt
    zwar schon ein paar Artikel & Posts dazu gelesen aber bis jetzt versteh ich noch nicht wirklich viel. Ich habe ein Codebeispiel gefunden, dass mir schlüssig
    erscheint:

    VB.NET-Quellcode

    1. Dim conn As SqlClient.SqlConnection
    2. Try conn = New SqlClient.SqlConnection
    3. conn.ConnectionString = "server= Pxxx797;" _
    4. & "user id= et_user;" _
    5. & "password= M2014" _
    6. & "database= Etfg"
    7. conn.Open()
    8. MsgBox("OK")
    9. Catch myerror As SystemException
    10. MsgBox("Keine Verbindung zur Datenbank : " & myerror.Message.ToString)
    11. End Try


    Der Compiler hat kein Problem mit dem Quelltext. Allerdings kommt keine Verbindung zustande. Ich hab folgende Meldung erhalten: Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: Named Pipes Provider, error: 40 - Verbindung mit SQL Server konnte nicht geöffnet werden)

    Die Zugangsdaten hab ich 3mal kontrolliert. Meint ihr der Fehler liegt bei meinem Zugriffsversuch oder bei der DB?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    es gibt viele Internet-"MySql"-Datenbanken, die gar keinen Zugriff per DbConnection zulassen, sondern nur iwas über Php. (Imo sollte man diese "Php-Datenbank" nennen, nicht MySql ;) )

    auf DbGenerator ist ein lauffähiges Sample dabei, was auf eine wirkliche MySql auf kassaserver.com zugreift.
    Damit kannste üben, und hast auch eine Vorlage, die funktioniert.
    das ist keine Internet-DB sondern eine DB, die für Versuchszwecke für mich aufgesetzt wurde. Von daher sollte eine Verbindung auch außerhalb PHP möglich sein. Gibt es im Internet
    eine MS SQL DB mit der man testen kann? Das verlinkte Programm ist mir zumindest momentan noch zu unübersichtlich.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    ErfinderDesRades schrieb:

    es gibt viele Internet-"MySql"-Datenbanken, die gar keinen Zugriff per DbConnection zulassen, sondern nur iwas über Php. (Imo sollte man diese "Php-Datenbank" nennen, nicht MySql ;) )

    "MS SQL 2012 DB" != MySQL. ;)

    Der Hostname alleine reicht nicht, um eine Verbindung herzustellen - du musst immer den Namen der SQL Instanz mit angeben.
    In meinem Fall "SQLExpress".

    Hier mal mein Vorschlag mit ADO.NET
    (Die auskommentierte Zeile würde sich mit Windows Credentials anmelden.)

    VB.NET-Quellcode

    1. Imports System.Data.SqlClient
    2. Dim conString As String
    3. 'conString = "Server=PC\SQLExpress;database=MSSQL;Integrated Security=true"
    4. conString = "Server=PC\SQLExpress;database=MSSQL;User ID=User1;Pwd=Password1+;Application Name=MyApp"
    5. Dim con As SqlConnection = Nothing
    6. Try
    7. con = New SqlConnection(conString)
    8. con.Open()
    9. MessageBox.Show("Offen")
    10. Catch ex As Exception
    11. MessageBox.Show(ex.Message)
    12. Finally
    13. If con.State <> ConnectionState.Closed Then con.Close()
    14. End Try
    15. con.Dispose()
    16. End Sub

    ich hab jetzt sowohl die auskommentierte Zeile als auch die andere Probiert. Beide Male erhalte ich folgenden Fehler:
    Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)

    Der Compiler zeigt keinen Fehler an.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    ErfinderDesRades schrieb:

    es gibt viele Internet-"MySql"-Datenbanken, die gar keinen Zugriff per DbConnection zulassen, sondern nur iwas über Php. (Imo sollte man diese "Php-Datenbank" nennen, nicht MySql ;) )


    Selten so einen Quatsch gehört! Nur weil die Tabelle anders angesteuert wird, ist es immernoch eine Mysql Tabelle. Ein Auto mit einen Dieselmotor ist doch immer noch ein Auto oder?

    Nils_Kr schrieb:

    conn.ConnectionString = "server= Pxxx797;" _
    & "user id= et_user;" _
    & "password= M2014" _
    & "database= Etfg"
    lass mal die Leerzeichen weg!

    VB.NET-Quellcode

    1. ​conn.ConnectionString = "Server=Pxxx797;User Id=et_user;Password=M2014;Database=Etfg"


    Ich hoffe ja, die Datenbank ist nicht besonders wichtig oder die Daten sind genügend verfälscht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    In der Datenbank befindet sich momentan nicht ein Eintrag. Aber auch abgesehen davon sind die Zugangsdaten natürlich andere als hier gepostet.
    Die von der IT würden mich killen, wenn ich irgendwas aus unsrem Netzwert hier posten würde. Aber danke dafür, dass du das hier anmerkst,
    weil es gibt genügend Leute, die über sowas nicht nachdenken und dann aus Versehen sensible Daten für jeden erreichbar machen.

    Ps: Das mit den Leerzeichen hab ich gleich zu Beginn versucht, hat aber keinen Unterschied gemacht. Der Fehler liegt woanders.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    das ist keine Internet-DB sondern eine DB, die für Versuchszwecke für mich aufgesetzt wurde. Von daher sollte eine Verbindung auch außerhalb PHP möglich sein. Gibt es im Internet
    eine MS SQL DB mit der man testen kann? Das verlinkte Programm ist mir zumindest momentan noch zu unübersichtlich.
    Tja, Pech. Im dortigen Download ist ja eine (leere) SqlServer-Db mit dabei.
    Von daher weiss ich jetzt nicht, warum du noch sonstwo im Internet eine suchst, und inwiefern das übersichtlicher wäre.

    Der DBGenerator generiert auf meinem System für die genannte SqlServer-Db folgenden Connectionstring:
    Data Source=.\SQLEXPRESS2008;Integrated Security=True;Connect Timeout=30;User Instance=True;AttachDbFilename="C:\Users\Account1\Downloads\DbGenerator00\DbGenerator\DbGenerator\SampleDatabases\SqlServer.MDF"
    Damit kann er die DB öffnen (Punkt Database-Viewer) und reingucken und sehen, dass keine Tabellen drinne sind (aber alles mögliche annere ist noch drin, zb Procedures)
    Beachte, dass auf deinem System nicht nur der Pfad anners ist, sondern auch deine SqlServer-Instanz wird anners heißen als ".\SQLEXPRESS2008".

    Aber imo, wenn dir die IT eine DB bereitstellt, dann müssen sie dir logisch auch einen funktionierenden Connectionstring sagen - alles annere ist ja Quatsch, odr?
    Und imo wirst du den DbGenerator eh noch brauchen, denn in deiner Db willst du ja die Tabellen so anlegen, wie du sie im Dataset hast.
    (Oder macht das die IT für dich, und wenn ja - macht sie es richtig??)

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

    Also ist wirklich so, dass du denen jede Spalte genauestens beschreiben musst, und die machen die dann in die DB?
    a) haben die sonst nix zu tun?
    b) ist annähernd ausgeschlossen, dass die das auf Anhieb richtig hinkriegen
    c) Es kommt nicht vor, dass eine Db im Verlauf einer Anwendungs-Entwicklung nicht mehrmals geändert werden muss - wollt ihr da jedesmal das Theater von vorn durchziehen?
    d) au backe!

    Also bis eure Bürokratie das gemahlen bekommen hat, so lange kannst du doch versuchen, dir selbst eine lokale Db aufzusetzen.
    Vlt. probierstes erstmal auf einem privaten Rechner, weil wenn man so wichtige IT im Haus hat (oder im Urlaub ;) ) - die unterbinden möglicherweise alle möglichen Dienste, aus Sicherheitsgründen.
    Aber solch kann man ja erst feststellen, wenn mans auf einem anneren System mal ans Laufen gekriegt hat.
    Das ganze auf einem privaten Rechner zu testen hab ich mir auch schon überlegt. Mein Konto auf dem Firmen-Pc ist schon ziemlich eingeschränkt.

    Meine Zugangsdaten für die DB sind einfach unvollständig, da ich den Namen der SQL-Instanz nicht kenne. Mit der DB selbst darf ich dann machen was ich will,
    sobald ich den Zugang dazu habe. Derjenige, der die DB erstellt hat ist im Moment nicht da und da es sich nicht um ein akutes Problem handelt ist die Priorität
    zu niedrig, als das sich direkt darum gekümmert wird.

    Da ich das Programm später nicht selbst warten werde, es aber bei Abschluss des Projekts Produktionsrelevant wird, ist die Zusammenarbeit mit der IT wichtig.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    So, ich hab jetzt SQL-Server 2008 auf dem Pc und mein Programm verbindet sich mit meiner lokalen Datenbank. Jetzt möchte ich, dass das Programm beim Start die DataSets mit dem SQL-Server synchronisiert und beim Schließen
    die Daten aus den Sets dann auf den Server schreibt(so wie es jetzt gerade mit meiner XML passiert).

    In dem Beispielprogramm ist bestimmt eine entsprechende Funktion integriert, nur ist da jede Menge Quelltext ohne Kommentare drinne. Kann mir jmd einen Tipp geben, wo ich suchen soll?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    in welchem Beispielprogramm?
    Meinst du beim DBGenerator?

    Naja, guck immer einfach ins MainForm - alles annere brauchst du nicht zu verstehen - sind üblicherweise kaum mehr als 10 Zeilen - und sind selbsterklärend bzw. werden durch Intellisense erklärt.

    Das gilt für die Sample-Projekte, der DBGenerator selbst ist natürlich wesentlich aufwändiger gecodet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hi Nils,
    ich glaub du unterschätzt die Aufgabe etwas, es sei denn ich hab was überlesen.
    Wenn nun meherer User in irgendeinen pool greifen, um eine xml datei in ein dataset zu laden, dann muss irgenwie sichergestellt werden, dass nun nicht zweimal dasselbe gespeichert wird. Das würde zwar der Server verhindern (wenn entspr keys gesetzt sind), aber dem User jedesmal eine errormessag vorsetzten ist wahrsch nicht das was du vorhast?

    Für das simple Speichern brauchst du nicht viel SQL, per "SELECT * FROM DeienTabelle" kannst du alle Tabellen vom sever in dein Dataset ziehen und dann via DatatAdapter.Update(...) die daten aus den XML zurückschreiben.
    JonDonym
    Eine Anonymisierung-Tool, das nicht nur deine IP verdeckt, sondern deine History, BrowserTyp, Windows-Version etc.
    Das Tool hat ca. 5 FreeKaskaden und ca. 10 Premium. Minimum 5 EUR für ein Volumen von 650MB.
    Die Gefahr ist eigentlich gering. Bei einer normalen Anwendung werden nämlich nur Daten gelesen. Zum Schluss wird eine einzelne Zeile in einer zweiten Datenbank eingefügt.
    Das sollte nicht länger als wenige Millisekunden dauern und da ist es doch recht unwahrscheinlich, dass zwei Personen genau gleichzeitig auf speichern drücken. Aber ich werd
    auf jeden Fall mal gucken, welche Fehlermeldung generiert werden würde um mein Programm entsprechend darauf reagieren zu lassen.
    Option strict = on

    If it's stupid and it works it ain't stupid.