C# SQL-Abfrage bzw. Connection herstellen

NichtExpert

Bekanntes Mitglied
Hallo,

ich bin gerade so ziemlich am verzweifeln und auch jegliche Google-suchen haben mir nicht wirklich weitergeholfen.
Ich programmiere momentan mit c# und wollte nun eine sql verbindung machen und dann eine Konsolenausgabe bestimmter Werte/Spalten.
Mein Problem, ich benutze Heidisql und eine mySQL-Datenbank.
Ich finde jedoch keine Google-suche, in der eine Verbindung hergestellt wird.
Einzig mit sql Server finde ich Lösungen.
Trotzdem dürfte das doch auch mit heidisql gehen?
 

temi

Top Contributor

NichtExpert

Bekanntes Mitglied
Hast du jetzt Probleme mit dem Zugriff über Heidisql oder mit C#? Was genau ist das Problem? Fehlermeldungen?
Das Problem liegt an C#.
Ich füge den Namespace "using SQL_connection;" hinzu, jedoch wird weiter unten im Code der Namespace nicht verwendet.

Compilerfehler: CS0118 SQL-connection ist "Namespace" wird aber wie "Typ" verwendet
 

NichtExpert

Bekanntes Mitglied
Hast du jetzt Probleme mit dem Zugriff über Heidisql oder mit C#? Was genau ist das Problem? Fehlermeldungen?
In Java wäre das quasi so.
Ich importiere " import java.sql.*; " und kann trotzdem nicht die Befehle verwenden wie Connection, Statement oder ResultSet.
Das würde mir dann rot markiert werden. Dasselbe Problem habe ich eben nur in C#
 
K

kneitzel

Gast
Also irgendwie bin ich da immer etwas verwirrt: HeidiSQL ist nur ein Frontend für eine Datenbank. Und da es mit vielen Datenbanken genutzt werden kann, besagt diese Information rein gar nichts!

Daher ist die wichtige Frage: Welche Datenbank nutzt du denn nun? Auf welche Datenbank willst du zugreifen?

Und dann finden sich zu der Datenbank auch entsprechende Dokumentation.

By MySQL gibt es den Connector/Net nur um ein Beispiel zu nennen.
Das Problem liegt an C#.
Ich füge den Namespace "using SQL_connection;" hinzu, jedoch wird weiter unten im Code der Namespace nicht verwendet.

Compilerfehler: CS0118 SQL-connection ist "Namespace" wird aber wie "Typ" verwendet
Was soll das denn auch für ein Namespace sein? wie bist Du auf den gekommen? Sorry, aber manche Sachen verstehe ich nicht wirklich ...

Wenn Du C# entwickeln willst, dann schau dir die MSDN Library an! Microsoft hat alles super dokumentiert! Und wenn Du Dir keinen Überblick verschaffen willst, dann lerne Google zu nutzen, damit Du Dokumentation zu Klassen findest!

Du willst die Klasse SqlConnection nutzen? Dann solltest Du die Dokumentation finden können. Probiere es aus!
Dann findest Du schnell:

Ganz oben findet sich dann direkt:
Namespace:System.Data.SqlClient
Assembly:System.Data.SqlClient.dll
Damit weist Du, welchen Namespace Du einbinden musst und welche Assembly im Projekt eingebunden wird (falls noch nicht drin!)

Sorry, wenn es etwas hart klingt, aber das sind Basics, die sitzen sollten. Wenn Du Klassen eines Frameworks nutzen willst, dann sollte man die Dokumentation des Frameworks zumindest finden und lesen können ...
 
K

kneitzel

Gast
Wobei die Dokumentation vom Mysql Connector/Net ja auch sehr gut ist und alles erläutert .... https://dev.mysql.com/doc/connector-net/en/

Ich bin ein großer Fan, immer erst direkt beim Anbieter zu schauen. Das mag als Tutorial nicht immer taugen (In diesem konkreten Fall wäre es aber super), aber man hat eine gute Grundlage und kann bei allen weiteren Quellen prüfen, ob es noch überein stimmt oder evtl. überholt ist.
 

NichtExpert

Bekanntes Mitglied
Und dann finden sich zu der Datenbank auch entsprechende Dokumentation.

Damit weist Du, welchen Namespace Du einbinden musst und welche Assembly im Projekt eingebunden wird (falls noch nicht drin!)
Die Dokumentation habe ich gefunden und mir auch angeschaut. (Also schon vorher)
Erstmal vielen Dank für die Rückmeldung. Ich bin jetzt einen Schritt weiter.
Jetzt muss ich noch den Projektverweis machen.
Da hakt es wieder 😅
Ich gehe in den Verweis-manager und dort finde ich aber nicht den entsprechenden Assembly (System.Data.SQLClient).
Dort finde ich nur unter "COM/Typbibliothek" Inhalte.
Dort finde ich aber nicht den Assembly

Bitte erneut um Hilfe🙏
C#_projekt-verweis.JPG
 
K

kneitzel

Gast
Was für ein Projekt hast Du erstellt und was für eine IDE nutzt Du?

Du willst keine COM Komponente einbinden - das ist was Anderes als die typischen Frameworks / Libraries, die eingebunden werden können.

Im Augenblick weiss ich nicht, was Du für ein Projekt erstellt hast - das Bildschirmfoto sieht erst einmal nicht nach einer typischen .Net Applikation aus. (Du kannst z.B. in Visual Studio Community Edition eine Desktop App in .Net erstellen. Also keine UWP App oder so - das nennt sich dann z.B. Windows Forms Applikation oder so. UWP ist in so fern problematisch, als das es da spezielle Regeln bezüglich Rechte gibt und so ... also ähnlich wie bei der Android Entwicklung ...)

In dem Projekt kannst Du dann auf Verweise klicken und da dann per Rechtsklick "Verweis hinzufügen ..." sagen. Dann öffnet sich ein Fenster ähnlich wie dein Screenshot nur mit erstem Punkt: Assemblies (Das sind die Libraries. Assemblies in .Net sind sowas wie jar Files in Java)

Da kann man dann in Ruhe schauen ob da im Unterpunkt Framework das Gesuchte (System.Data.SqlClient) vorhanden ist. Je nach ausgewähltem Framework dürfte es aber dann nicht zu finden sein:
.Net Abhängigkeiten.png

Hintergrund ist, dass Microsoft viele Dinge ausgelagert hat. Das ist dann ähnlich wie bei Maven/Gradle erst einzubinden, nur gibt es da kein Maven Central Repository sondern hier heißt es schlicht anders - ist aber grob das Gleiche: Das Tool NuGet besorgt Abhängigkeiten. dazu wieder Rechtsklick auf Verweise und "NuGet Pakete verwalten" auswählen.

Dann:
1. Auf Durchsuchen.
2. Suchbegriff eingeben (SqlClient)
3. Suchergebnis auswählen
4. Version auswählen und installieren.
NuGetPackageAuswählen.png

Dann hat man die notwendige Abhängigkeit und man kann es nutzen (mit entsprechendem using auf den Namespace).
 

NichtExpert

Bekanntes Mitglied
Was für ein Projekt hast Du erstellt und was für eine IDE nutzt Du?
- konsolenanwendung, Visual Studio
In dem Projekt kannst Du dann auf Verweise klicken und da dann per Rechtsklick "Verweis hinzufügen ..." sagen. Dann öffnet sich ein Fenster ähnlich wie dein Screenshot nur mit erstem Punkt: Assemblies (Das sind die Libraries. Assemblies in .Net sind sowas wie jar Files in Java)

Da kann man dann in Ruhe schauen ob da im Unterpunkt Framework das Gesuchte (System.Data.SqlClient) vorhanden ist. Je nach ausgewähltem Framework dürfte es aber dann nicht zu finden sein:
Anhang anzeigen 15738
Wie du diesen Projektverweis hinbekommen hast weiß ich immer noch nicht.
ist aber egal. Ich musste mit dem "NuGet" Das framework hinzufügen.
Jetzt klappt es auch.
Vielen Dank 🙏
 
K

kneitzel

Gast
Ok, ich kann jetzt aber nachvollziehen, was Du gemacht hast. Du hast eine .Net Core Konsolenanwendung erstellt. Da hast Du nicht das große .Net Framework wie bei Windows, wo man Komponenten vom Framework hinzu nehmen kann, wenn man diese benötigt.

Wenn Du den Weg, den ich beschrieben habe, mal nachverfolgen willst, dann kannst Du ein .Net Framework Projekt erstellen. (Das wäre dann "Konsolen-App (.Net-Framework)" statt nur "Konsolenanwendung". Das wäre dann halt eine Windows spezifische Sache und nicht auch für Mac und Linux.)
 

NichtExpert

Bekanntes Mitglied
Ich habe nun erneut noch einmal Hilfe nötig.
meine Verbindung/Connection misslingt noch.
[CODE lang="csharp" title="SQL_Connection" highlight="1,3"]string connectionstring = "server=Localhost,3306;user id=root;password=password;initial catalog=test;TrustServerCertificate=true;Persist Security Info=True";
SqlConnection connection = new SqlConnection(connectionstring);
connection.Open(); // error-message
SqlCommand command = new SqlCommand("SELECT * FROM dvd_sammlung", connection);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read()) {
Console.WriteLine(reader.GetString(0), reader.GetString(1), reader.GetString(2));
}
reader.Close();
connection.Close();
}[/CODE]

Das Programm hängt sich jedes Mal in der Zeile 3 auf.
Ich vermute mein Connectionstring (zeile-1) oder eine Einstellung in der Datenbank selbst ist der Auslöser des Ganzen.
Fehlermeldung lautet:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake.
(provider: TCP Provider, error: 0 - Eine vorhandene Verbindung wurde vom Remotehost geschlossen.)
Meine Suchen im Internet ergaben sowas wie
In meinem Fall trat dieser Fehler bei dot net core und Microsoft.Data.SqlClient.
Die Lösung bestand darin ;TrustServerCertificate=true, das Ende der Verbindungszeichenfolge hinzuzufügen .
Das habe ich Alles schon im Code hinzugefügt bzw. dem Connectionstring.

Hoffe mir kann jemand helfen🙏
 
K

kneitzel

Gast
Wie ist denn der SQL Server installiert? Hast Du die Anmeldung mit User/Passwort aktiviert? Standard ist - so ich mich recht erinnere - dass MS SQL nur Windows Integrated Authentication per default erlaubt. Das kann direkt bei der Installation aber auch im nachhinein konfigurieren. Desweiteren muss auch tcp/ip aktiviert sein (Das dürfte aber Standard sein, aber man weiss ja nie, wie da was installiert wurde ...)

Der Port ist 3306? hast Du das so eingestellt? Standard ist 1433. Das kann man aber auch der Konfiguration entnehmen.

Und dann ganz wichtig: Die Verbindung mit dem SSMS funktioniert? Wenn ja: wie verbindest Du Dich mit SSMS?
 

NichtExpert

Bekanntes Mitglied
die Error Message auch zu Posten wäre hilfreich
Die Error-Message ist oben entnehmbar.
Hier noch einmal:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake.
(provider: TCP Provider, error: 0 - Eine vorhandene Verbindung wurde vom Remotehost geschlossen.)
Er bekommt eine Connection hin, aber anschließend geht irgendwas schief
 

NichtExpert

Bekanntes Mitglied
Wie ist denn der SQL Server installiert? Hast Du die Anmeldung mit User/Passwort aktiviert? Standard ist - so ich mich recht erinnere - dass MS SQL nur Windows Integrated Authentication per default erlaubt. Das kann direkt bei der Installation aber auch im nachhinein konfigurieren. Desweiteren muss auch tcp/ip aktiviert sein (Das dürfte aber Standard sein, aber man weiss ja nie, wie da was installiert wurde ...)

Der Port ist 3306? hast Du das so eingestellt? Standard ist 1433. Das kann man aber auch der Konfiguration entnehmen.

Und dann ganz wichtig: Die Verbindung mit dem SSMS funktioniert? Wenn ja: wie verbindest Du Dich mit SSMS?
Die Abfrage funktioniert über Java. Mit C# klappt es aber nicht.
Der Port ist auch richtig eingestellt.
Ich arbeite mit einer lokalen Datenbank.
Also über XAMPP starte ich meine lokale Datenbank über den Port 3306. Verwalten tue ich die Datenbank mit HeidiSQL falls relevant.
 
K

kneitzel

Gast
Ach, gerade gemerkt: Du greifst ja auf mysql zu und nicht auf MS SQL. Da kannst Du meine letzte Antwort natürlich erst einmal vergessen, denn da bin von MS SQL ausgegangen.

Dein Code würde aber auf MS SQL Server zugreifen wollen. Den Code für mysql findest Du unter:
Java:
    conn = new MySql.Data.MySqlClient.MySqlConnection();
    conn.ConnectionString = myConnectionString;
    conn.Open();
 
K

kneitzel

Gast
Um es noch etwas auszuführen:
Anders als in Java enthält der Connection String keine Information, um was für eine Datenbank es sich handelt. Statt dessen sind die Klassen alle spezifisch und jede Datenbank bringt eine eigene Implementation von DbConnection mit, die dann zu nutzen ist.

SqlConnection ist für den SQL Server (Und das meint wirklich MS SQL Server):

Daher brauchst Du auch nicht System.Data.SqlServer, wenn Du den SQL Server nicht nutzt. Dir reicht System.Data.Common zusammen mit dem MySQL Connector/Net.
 

Neue Themen


Oben