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
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
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hi Fitzel69,
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.
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. "
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
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);
}
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. "
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 - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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:
Deinen Connectionstring habe ich nicht getestet, bitte mal meinen (auf dein Umgebung angepasst) testen. Hab keinen 2008er SQL Server installiert, nur nen 2014er.
Du hast deinem sqlcmd keine Connection (conSql) zugewiesen
sqlcmd.Connection = conSql;
sqlcmd.CommandText = "Select * from person.password";
sqlreader = sqlcmd.ExecuteReader();
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.
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 "]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
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. "
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 - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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. "
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();
}
}
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
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
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. "
Ich hatte ein ähnliches Problem! Kein DB-Zugriff mehr seit ich mit VS15 und Win10 arbeitete!
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#?
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.
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