Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Daten aus einer SQL Datenbank auslesen - Welcher Connectionstring ist richtig?
Fitzel69
myCSharp.de - Member



Dabei seit:
Beiträge: 45

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2461
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
mrMo
myCSharp.de - Member

Avatar #avatar-4067.jpg


Dabei seit:
Beiträge: 12
Herkunft: Baden-Württemberg

beantworten | zitieren | melden

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.


2. 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;
        }
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von mrMo am .
"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. "
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3780
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Fitzel69
myCSharp.de - Member



Dabei seit:
Beiträge: 45

Themenstarter:

beantworten | zitieren | melden

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);
            }
private Nachricht | Beiträge des Benutzers
mrMo
myCSharp.de - Member

Avatar #avatar-4067.jpg


Dabei seit:
Beiträge: 12
Herkunft: Baden-Württemberg

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von mrMo am .
"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. "
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
mrMo
myCSharp.de - Member

Avatar #avatar-4067.jpg


Dabei seit:
Beiträge: 12
Herkunft: Baden-Württemberg

beantworten | zitieren | melden

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;

3. Der sqlcmd.CommandText muss definiert sein, bevor du deinen sqlreader abfeuerst


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

4. 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.

5. 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 "]);
                }

6. 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);
           }

7. 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 ;-)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von mrMo am .
"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. "
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

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

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
mrMo
myCSharp.de - Member

Avatar #avatar-4067.jpg


Dabei seit:
Beiträge: 12
Herkunft: Baden-Württemberg

beantworten | zitieren | melden

Zitat von Abt
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. "
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

Zitat
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();
	}
}
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von FZelle am .
private Nachricht | Beiträge des Benutzers
Fitzel69
myCSharp.de - Member



Dabei seit:
Beiträge: 45

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
mrMo
myCSharp.de - Member

Avatar #avatar-4067.jpg


Dabei seit:
Beiträge: 12
Herkunft: Baden-Württemberg

beantworten | zitieren | melden

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
"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. "

Moderationshinweis von Abt (15.09.2016 - 08:55:52):

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

private Nachricht | Beiträge des Benutzers
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 58
Herkunft: Süddeutschland

Fehler bei alten mdf

beantworten | zitieren | melden

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#?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10083

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Fitzel69
myCSharp.de - Member



Dabei seit:
Beiträge: 45

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers