Laden...

Daten aus einer SQL Datenbank auslesen - Welcher Connectionstring ist richtig?

Erstellt von Fitzel69 vor 7 Jahren Letzter Beitrag vor 7 Jahren 13.318 Views
F
Fitzel69 Themenstarter:in
45 Beiträge seit 2015
vor 7 Jahren
Daten aus einer SQL Datenbank auslesen - Welcher Connectionstring ist richtig?

Hallo zusammen

anbei folgende Situation

ich bin leidenschaftlicher Programmieranfänger, der aber noch nicht das goldene Händchen gefunden hat

Ich versuche mit Visual Studio Express und C# eine Tabelle von einem SQL Server 2008 auszulesen.
Ich benutze die Windows Authentifizierung für die DB ( SQL Server 2008)

Ich kann auf dem SQL Server ( über Perfmon und dem SQL Profiler ) keine Verbindung vom Client aus nachweisen.

 conSql.ConnectionString = "Network Address=192.168.2.50;" +
                                      "Initial Catalog=av2008;" +
                                      "Integrated Security=true";
           SqlCommand sqlcmd = new SqlCommand();

Den restlichen Quellcode erspare ich erstmal
Ich habe bereits die Data Source mit der "Network Address " getauscht

Ich setze zum lernen vom RheinwerkVerlag , das Buch von Andreas Kühnel ein.

Danke für eure Hilfe

849 Beiträge seit 2006
vor 7 Jahren

Vielleicht solltest Du den restlich Quellcode doch posten.. zumindest den Teil wo du versuchst mit Open() die Verbindung zu öffnen. Das ist auch die Stelle wo eine Exception fliegen sollte, wenn keine Verbindung aufgebaut werden kann.

Exceptions kannst Du mit try/catch abfangen, oder mit dem Debugger einsehen -> [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Ich bin mir nicht sicher ob man die Windows Authentifizierung vom Server nicht nochmal Explizit einschalten muss.

Grüße

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Fitzel69,

was Connectionstrings angeht kannst du auch mal auf The Connection Strings Reference schauen.

Ich weiss ja nicht was für Code du bisher hast aber so könnte eine Abfrage beispielsweise aussehen:

try
{
	string conString = "...";
	using (SqlConnection connection = new SqlConnection(conString))
	{
		connection.Open();

		using (SqlCommand command = new SqlCommand("SELECT ...", connection))
		{
			using (SqlDataReader reader = command.ExecuteReader())
			{
				while (reader.Read())
				{
					// ...
				}
			}
		}
	}
}
catch(...)
{

}

Beachte dann aber auch gleich [Artikelserie] SQL: Parameter von Befehlen

Gruss

Coffeebean

9 Beiträge seit 2016
vor 7 Jahren

Hi Fitzel69,

  1. Kannst du dich den manuell über das Management Studio per Win. Authentification auf dem SQL Server einloggen. Evtl. liegt es an den User Rechten...

1.2 Wenn das nicht geht, mit nem anderen User versuchen. Im Management Studio mal die Authentifizierung auf den gemischten (user/win) Modus umstellen und dann versuchen die vergebenen Zugangsdaten in deinen Connectionstring einpflegen.

  1. Was ich eher glaube, du hast einen Fehler in deinem Code (den du leider noch nicht gepostet hast). Bitte mal deinen Code für die SQL Connection / DB Zugriff komplett posten. Zusätzlich mal nen try/catch Block drum rum und die Fehlermeldung posten.

Grüße und einen schönen Abend

Edit:
Hier mal ein einfaches Beispiel (ohne Try/catch) um die Verbindung zu testen.
Getestet mit MS SQL Server 2008 - 2014


//Windows Authentification
//sConnection = "Server = " + _sServerInstanz + "; Database =" + _sDatenbankInstanzBezeichnung + "; Trusted_Connection = yes;"

//User Authentification
// "Server = " + _sServerInstanz + "; Database =" + _sDatenbankInstanzBezeichnung + "; User Id =" +_sBenutzername + "; Password =" + _sPasswort + ";"
        public bool Verbindungstest()
        {
            SqlConnection SQLcon = new SqlConnection(sConnection);
            SqlCommand SQLcmd = new SqlCommand();
            SQLcmd.Connection = SQLcon;
            SQLcon.Open();
            SQLcon.Close();
            return true;
        }

"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. "

3.825 Beiträge seit 2006
vor 7 Jahren

Hallo Fitzel,

in Deinem Connection String fehlt eventuell die Angabe der Server Instance.

Beispiel "Data Source=192.168.2.50\SQLExpress" statt Network Address.

Hier ein paar Beispiele :

http://download.seven-c.de/files/DatenbankenHowTo.htm

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
Fitzel69 Themenstarter:in
45 Beiträge seit 2015
vor 7 Jahren

Hallo,

vielen Dank für eure Antworten.......schaue ich mir an

Anbei der Code


private void CMD_Read_DB_Click(object sender, EventArgs e)
        {
            
                     
            // SQL Verbindung 
            SqlConnection conSql = new SqlConnection();
            conSql.ConnectionString = "Network Address=192.168.2.50;" +
                                      "Initial Catalog=av2008;" +
                                      "Integrated Security=true";
           SqlCommand sqlcmd = new SqlCommand();
                
            SqlDataReader sqlreader ;

            //LB_DB.Items.Add("test");

            try
            {
                conSql.Open();
                //conOle.Open();
                sqlreader = sqlcmd.ExecuteReader();

               // readeroledb = Olecmd.ExecuteReader();
                string strsql = "Select * from person.password";
               // sqlcmd.CommandText = "Select * from person.password";

                LB_DB.Items.Add("test1");
                LB_DB.Items.Add(sqlcmd.CommandText);
                LB_DB.Items.Add(strsql);

                
            
            }


            catch (Exception ex)
            {
                Console.WriteLine("Fehlermeldung :{0}", ex.Message);
            }
9 Beiträge seit 2016
vor 7 Jahren

Hi Fitzel69,

ich tippe mal, das der Connectionstring falsch/unvollständig ist. Setzt bitte mal, wie BerndFfm geschrieben hat, Im Connectionstring den Namen deiner SQL-Server Instanz also z.B ip\NameInstanz.

Zusätzlich mal hier https://www.connectionstrings.com/sql-server/ deinen Connectionstring gegenprüfen. Bin am Handy und kann da schlecht vergleichen.

Was mir zusätzlich in deinem Code aufgefallen ist. Die Connection wird nicht geschlossen.

conSql.Close();

Ich bin mir nicht sicher, aber mit "Select * from person.password" möchtest du wohl alle Passwörter(Spalte password) aus der Tabelle person abfragen(?). Versuch doch mal "Select password from person" als Alternative, so mache ich das immer.

Über eine Fehlermeldung und die Stelle an der diese in deinem ursprünglichen Code geworfen wird freuen wir uns alle noch 😉

Grüße und einen schönen Abend an alle Forumsteilnehmer

"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. "

16.807 Beiträge seit 2008
vor 7 Jahren

Ganz dringender Hinweis: niemals Passwörter in der Datenbank im Klartext speichern.
Außer natürlich, ihr wollt präsent auf https://haveibeenpwned.com/ landen.

9 Beiträge seit 2016
vor 7 Jahren

So, ich nochmal, jetzt vom PC aus.

Hab deinen Code mal bei mir ins VS gepackt. Und "zum laufen" gebracht. Da sind einige Dinge nicht ganz korrekt:

  1. Deinen Connectionstring habe ich nicht getestet, bitte mal meinen (auf dein Umgebung angepasst) testen. Hab keinen 2008er SQL Server installiert, nur nen 2014er.

  2. Du hast deinem sqlcmd keine Connection (conSql) zugewiesen

sqlcmd.Connection = conSql;
  1. Der sqlcmd.CommandText muss definiert sein, bevor du deinen sqlreader abfeuerst

sqlcmd.CommandText = "Select * from person.password";
sqlreader = sqlcmd.ExecuteReader();

  1. Dein SQL-Statement "Select * from person.password"; funktionier so nicht. Das muss "Select password from person" lauten (sofern du die Daten der Spalte Password aus der Tabelle Person haben möchtest.

  2. Wie du die erhaltenen Daten deiner Listbox "LB_DB" hinzufügst weißt du? Falls nicht, geht das z.B. so:


while(sqlreader.Read())
                {
                    LB_DB.Items.Add(sqlreader["password "]);
                }

  1. Ich würde im Catch die MessageBox verwenden, nicht die Console, du hast ja eine Win Forms Anwendung und keine Consolen Anwendung.

catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
           }

  1. In der Hoffnung, dass es dir weiterhilft und versuchst nachzuvollziehen was / wann / wie gemacht werden muss, hier der Code am Stück (Connectrionstring bitte anpassen, nur mir 2014er SQL Server getestet).

        private void CMD_Read_DB_Click(object sender, EventArgs e)
        {
            
            SqlConnection conSql = new SqlConnection();
            conSql.ConnectionString = "Server = DESKTOP-EFF0LV4\\SQLEXPRESS2014MD;  Database = GhostCoder ; Trusted_Connection = yes;";
            SqlCommand sqlcmd = new SqlCommand();
            SqlDataReader sqlreader;
            sqlcmd.Connection = conSql;
            sqlcmd.CommandText = "Select password from person";

            try
            {
                //Verbindung herstellen
                conSql.Open();

                sqlreader = sqlcmd.ExecuteReader();
               
                //Zufügen der Ergebnisse in die ListBox
                while(sqlreader.Read())
                {
                    LB_DB.Items.Add(sqlreader["password"]);

                }
                //Verbindung schließen
                conSql.Close();
            }


            catch (Exception ex)
            {
                MessageBox.Show( ex.Message);
            }
    }

P.S. Für den Anfang ist der Stil in dem du Programmierst in Ordnung (steinigt mich 😃 ). Jedoch solltest du langfristig schauen, dass du deine UI und den DB Zugriff bzw. die Business Logik trennst (z.B. separate Klassen), und dass du DataSource/DataBindings verwendest. Kleiner Tipp von einem (immer noch) Anfänger 😉

"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. "

16.807 Beiträge seit 2008
vor 7 Jahren

Verbindung immer im finally block schließen - dafür ist er da.
Noch besser: using() verwenden, wenn es möglich ist.

9 Beiträge seit 2016
vor 7 Jahren

Verbindung immer im finally block schließen - dafür ist er da.
Noch besser: using() verwenden, wenn es möglich ist.

Oh, noch ein Schwabe aus Stuttgart 😃

finally und using sollte genutzt werden, kein Zweifel. Auf dem Level auf dem der Thread Ersteller programmiert (soweit ich das anhand dieses Threads einschätzen kann) ist es meiner Meinung nach noch "zu früh" dafür und sorgt im schlimmsten Fall für Verwirrung. Sowas sehe ich als "Stil optimierung" an, welche im Verlauf des Lernens nach und nach geschehen sollte.

Grüße aus Stuttgart

"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. "

F
10.010 Beiträge seit 2004
vor 7 Jahren

finally und using sollte genutzt werden, kein Zweifel. Auf dem Level auf dem der Thread Ersteller programmiert (soweit ich das anhand dieses Threads einschätzen kann) ist es meiner Meinung nach noch "zu früh" dafür und sorgt im schlimmsten Fall für Verwirrung. Sowas sehe ich als "Stil optimierung" an, welche im Verlauf des Lernens nach und nach geschehen sollte.

Nein, aus 30 Jahren SW Entwicklung kann ich dir sagen, da liegt du falsch.

Wenn man etwas lernt dann gleich richtig und nicht erstmal irgendwie und dann evtl doch mal richtig.
Denn nichts ist in der SW Entwicklung so beständig wie das Provisorium.

Using und Finally haben nichts aber auch gar nichts mit schöner zu tun.
Sie verhindern das ggf bei einem Fehler die Connection unnötig lange geöffnet bleibt.
Was ist z.b. wenn in deinem Fall der Reader eine Exception wirft?
Ganz abgesehen davon das der DAL ( denn da gehört so eine Abfrage hin ) niemals irgendwelche MessageBoxen öffnen sollte.
Auch gehört das niemals so ( nicht mal als Beispiel ) in ein Button-Click.

Und ganz bestimmt auch nicht in irgendwelche Itemsauflistungen ( DataBinding).

Und es ist doch so simple. Das habe ich mal in 5 Minuten geschrieben ( nicht compiliert)


public class WasAuchImmerDAL
{
	string m_ConnectionString;
	public WasAuchImmerDAL( string connectionString)
	{
		m_ConnectionString = connectionString;
	}
	
	protected DbConnection GetConnection()
	{
		return new SqlConnection(m_ConnectionString);
	}
	
	public List<string> GetPasswords()
	{
		var list = List<string>();
		using( var con = GetConnection())
		{
			con.Open();
			var cmd = con.GetCommand();
			cmd.Text = "Select Password from Person";
			var rdr = cmd.ExecuteReader();
			while(sqlreader.Read())
			{
				List.Add(sqlreader.GetString(0));
			}
		}
		return list;
	}
	....
}

public class WasAuchImmerForm : Form
{
	private WasAuchImmerDAL m_MyDal;
	public WasAuchImmerForm()
	{
		InitializeComponents();
		m_MyDal = new WasAuchImmerDAL(ConnectionStringZusammenstellen);
	}
	
	private void CMD_Read_DB_Click(object sender, EventArgs e)
	{
		LB_DB.DataSource = m_MyDal.GetPasswords();
	}
}

F
Fitzel69 Themenstarter:in
45 Beiträge seit 2015
vor 7 Jahren

Danke MrMo

Ich arbeite das Buch durch, und denke das ich zur Zeit nur an Funktion, nicht aber an Stil denke

Und halt an Fehlerbehebung

Ich arbeite das jetzt mal durch...........

Bis morgen aus OWL

9 Beiträge seit 2016
vor 7 Jahren

Hi FZelle,

Den Code den ich gepostet habe würde ich auch so nie verwenden. Ich habe mich hierbei am Thread Ersteller orientiert und wollte möglichst nah an seinem Beispiel bleiben um nicht mehr Fragen aufzuwerfen wie zu beantworten. Grundsätzlich bin ich auch der selben Meinung wie du. Daher hatte ich auch empfohlen langfristig UI und Businesslogik in separate Klassen aufzuteilen, wie du es gemacht hast, sowie Themen wie DataSource etc. zu erlernen.

Das mit dem Provisorium ist reine Disziplin. Ich habe am Anfang auch so "programmiert" was ich jedoch nach und nach abgelegt habe...

Grüße
MrMo

Information von Abt vor 7 Jahren

Bitte keine seitenlangen Full-Quotes! [Hinweis] Wie poste ich richtig?

"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. "

57 Beiträge seit 2012
vor 7 Jahren
Fehler bei alten mdf

Ich hatte ein ähnliches Problem! Kein DB-Zugriff mehr seit ich mit VS15 und Win10 arbeitete!

  • bei neu erstellten DBs klappt alles sofort
  • nur bei alten MDFs ist irgendwo ein Wurm drin
  • meine Lösung: Datenbank mit MS SQL Server Management Studio neu erstellt!
  • Also ist irgendein Kompatibilitäts-Macken mit den alten mdf-Datenbanken, auch wenn mir keiner glauben wollte!
  • denn jetzt klappt ja alles problemlos!
con.ConnectionString = "Data Source=(localdb)\\MSSQLLocalDB; Initial Catalog=Daten; Integrated Security=sspi"; con.Open();
string s = "INSERT INTO dbo.Egal VALUES(...)";
            SqlCommand c = new SqlCommand(s, con);
            c.ExecuteNonQuery();...

OO gibts seit Platon - hatte der auch C#?

F
10.010 Beiträge seit 2004
vor 7 Jahren

Bitte tu dir selber einen gefallen und vergiss die localDB.
Das ist eine komische Krücke von MS die nicht wirklich Sinn macht.
Du musst dazu fast den ganzen SQLServer installieren, was nicht mal eben so woanders funktioniert und du hast ständig irgendwelche Kompatibilitätsprobleme.

Wenn du eine Embedded Datenbank benötigst nimm SQLite.
Brauchst du mehr ( was auch immer das bedeutet ) dann installiere den echten SQL Server (express) und benutze installierte Datenbanken.

F
Fitzel69 Themenstarter:in
45 Beiträge seit 2015
vor 7 Jahren

Servus

So ich habe mir eine Standard SQL Version 2008 installiert
und siehe da, es funktioniert

Es scheint ein Problem mit dem Namen ( Index Fehler 65 und 82 )
.......da arbeite ich jetzt dran...

Danke euch allen dafür....MrMo speziell

Als Anfänger suchst du halt den einen Weg der dir ein bißchen Licht am Tunnelende bringt

Jetzt geht's weiter.............mit dem Basis Problem