none
SQl Server SqlConnection Anwendung RRS feed

  • Frage

  • Hi NG,

    ich erstelle ein verbindung zum SQL Server mit

    SqlConnection myConnection = new SqlConnection("Server=.\\SQLEXPRESS;Initial Catalog=DBName;user id=Name;pwd=Passwort;Integrated Security=SSPI");

    Wie kann ich die myConnection über das ganze Progamm und andere Forms verwenden ?

    Ausserdem möchte ich die Verbindung nur einmal beim Programmstart herstellen und beim Beenden schließen.

    Dann möchte ich für die Ausführung der Befehle immer die gleiche Variable "myCommand" verwenden.

    Der erste Aufruf.

     

    SqlCommand myCommand = new SqlCommand("INSERT INTO Anmeldung (Name) Values (998)", myConnection); 
    myCommand.ExecuteNonQuery();

     

    Wenn ich dann myCommand wieder verwenden möchte, bekomme ich den Hinweis, das "myCommand" bereits verwendet wird.

    Was muss ich machen um myCommand im gesamten Programm verwenden zu können.

    Bin für jede Info dankbar.

    Gruß Roland

     

    Sonntag, 20. Juni 2010 09:05

Antworten

  • Hallo Roland,

    Deine Verbindungszeichenfolge widerspricht sich ;-)

    Integrated Security = SSPI (oder auch true) bedeutet das Windows Authentifizierung verwendet wird
    und damit das Windows - Konto, was dazu auf dem SQL Server angelegt und berechtigt sein muß

    Wohingegen User Id/Password nur für Standard-Sicherheit mit SQL Server Konten gültig ist.

    Siehe: Syntax für Verbindungszeichenfolgen (ADO.NET)

    Und der SQL Server sollte auch TCP/IP aktiviert haben und für den Port (1143) konfiguriert sein.

    Gruß Elmar

    Mittwoch, 23. Juni 2010 08:02
  • Hallo Roland,

    ergänzend zu Elmars Anmerkungen.

    Und der SQL Server sollte auch TCP/IP aktiviert haben und für den Port (1143) konfiguriert sein.

    Sollte auch die (Windows) Firewall entsprechend konfiguriert sein, Anfragen auf diesem Port von außen zuzulassen. Standardport des SQL Server wäre ohnehin normal 1433, der automatisch angenommen wird, wenn man keinen Port bei der Verbindungszeichenfolge angibt.



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 23. Juni 2010 08:42

Alle Antworten

  • Hallo Roland,

    Hi NG,

    Ne, jetzt Forum. :-)

    ich erstelle ein verbindung zum SQL Server mit

    SqlConnection myConnection = new SqlConnection("Server=.\\SQLEXPRESS;Initial Catalog=DBName;user id=Name;pwd=Passwort;Integrated Security=SSPI");

    Du solltest Deinen ConnectionString in den Anwendungseinstellungen vorhalten, so kannst Du ihn später auch jederzeit ändern ohne das Programm anpassen zu müssen.

    Connection Strings and Configuration Files (ADO.NET)
    http://msdn.microsoft.com/en-us/library/ms254494.aspx

     

    Wie kann ich die myConnection über das ganze Progamm und andere Forms verwenden.

    Ausserdem möchte ich die Verbindung nur einmal beim Programmstart herstellen und beim Beenden schließen.

    Dann möchte ich für die Ausführung der Befehle immer die gleiche Variable "myCommand" verwenden.

    Das ist in Verbindung mit dem SQL Server kein gutes Vorgehen. Hier ist es "best practice" die Verbindung immer nur so kurz wie möglich zu öffnen und gleich wieder zu schließen, wenn man sie nicht mehr braucht. Performance Bedenken muss man hier keine haben, durch das Connection Pooling des Frameworks, sorgt dafür dass Verbindungen wiederverwendet werden können und nicht bei jeder Instantiierung einer SQL Connection tatsächlich eine neue Verbindung zum SQL Server aufgebaut werden muss. Es besteht also keine Notwendigkeit die SQL Verbindung in Deiner Anwendung zu verwalten.

    SQL Server Connection Pooling (ADO.NET)
    http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

    Was muss ich machen um myCommand im gesamten Programm verwenden zu können.
    Hier wäre es vielleicht sinnvoller, eine eigene Klasse zu erstellen, die Dir den Zugriff auf die Datenbank kapselt.

    Als Beispiel ohne Anspruch auf Korrektheit und Vollständigkeit:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    using System.Data.SqlClient;
    
    // DataLayer.cs
    namespace WindowsFormsApplication1
    {
      public class DataLayer
      {
    
        public DataLayer()
        {
        }
    
        public void InsertLogin(string name)
        {
          SqlConnection lConn = new SqlConnection(Properties.Settings.Default.MySqlConnection);
    
          try
          {
            lConn.Open();
    
            SqlCommand lCommand = new SqlCommand("INSERT INTO (Name) VALUES (@name)");
            lCommand.Parameters.Add(new SqlParameter("@name", name));
    
            lCommand.ExecuteNonQuery();
    
          }
          catch (Exception ex)
          {
            throw new Exception("Insert login failed.", ex);
    
          }
          finally
          {
            lConn.Close();
    
          }
        }
      }
    }
    
    // Form1.cs
    namespace WindowsFormsApplication1
    {
      public class Form1
      {
    
        private void Button1_Click(System.Object sender, System.EventArgs e)
        {
          DataLayer lData = new DataLayer();
          lData.InsertLogin("998");
    
        }
      }
    }
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 20. Juni 2010 10:12
  • Hallo Thorsten,

    ok ab sofort Hallo Forum :-)

    Den Connect nicht in der Anwendung fix hinterlegen ist schon klar. War ja auch nur zur Beschreibung.

    Bin da noch am Testen. Habe mit C# erst begonnen.

    Bisher habe ich alle Einstellungen für den PC oder Benutzer in einer DBF ( VFox ) gespeichert und im gleiche

    Verzeichnis wie die "exe" abgelegt.

    Das würde ich gerne weiter so tun. Schon aus dem Grund damit ich die Programme parallel betreiben kann.

    Grundsätzliche Frage.

    Wie würde man lokale PC Einstellungen und allgemeine Informationen wie "SQL Server Einstellungen / Zugänge"

    in C# vorzugsweise lokal ablegen.

    Habe auch kein richtiges Beispiel gefunden wie ich auf mein VFox DBF zugreifen kann.

    Wie kann man mit C# auf ein bestimmtes Feld in der DBF zugreifen ?

    Kannst Du mir da helfen ?

    Gruß Roland

    Sonntag, 20. Juni 2010 14:32
  • Hallo Roland,

    hab eben erst gesehen, dass ich mit meinem Codebeispiel im falschen Forum war.
    Bisher habe ich alle Einstellungen für den PC oder Benutzer in einer DBF ( VFox ) gespeichert und im gleiche

    Verzeichnis wie die "exe" abgelegt.

    Für die Anwendung ist das OK, für die Benutzer eher nicht. Hier würde man auf benutzerspezifische Verzeichnisse ausweichen. Beides verwalten die Anwendungseinstellungen schon automatisch. Allerdings nicht in einer DBF, sondern in einer XML Datei.

    Das würde ich gerne weiter so tun. Schon aus dem Grund damit ich die Programme parallel betreiben kann.

    Hier würde ich aber eher dazu tendieren, den neuen Weg einzuschlagen, statt eine neue Anwendung auf Basis von "Altlasten" aufzubauen. Zumal Probleme unter Windows Vista/7 vorprogrammiert sind, soll der Benutzer die DBF im Programmverzeichnis beschreiben können.

    Wie würde man lokale PC Einstellungen und allgemeine Informationen wie "SQL Server Einstellungen / Zugänge"

    in C# vorzugsweise lokal ablegen.

    Über die angesprochenen Anwendungseinstellungen (Projekt => Eigenschaften > Einstellungen). Dort kannst Du festlegen, wie weit die Einstellungen gültig sein sollen. Für die gesamte Anwendung (Ablage in app.config im Programmverzeichnis) oder benutzerspezifisch (Ablage im Anwendungsdaten Verzeichnis des aktuellen Benutzers.

    Managing Application Settings
    http://msdn.microsoft.com/en-us/library/c9db58th.aspx

    Habe auch kein richtiges Beispiel gefunden wie ich auf mein VFox DBF zugreifen kann.

    Wie kann man mit C# auf ein bestimmtes Feld in der DBF zugreifen ?

    Eigentlich ist das ja wieder eine neue Frage. Schau mal hier:

    Reading DBF files in C#
    http://www.aspcode.net/Reading-DBF-files-in-C.aspx

    http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic62548.aspx

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Sonntag, 20. Juni 2010 15:19
  • Hallo Thorsten,

    Danke für die Info.

    Habe mir die Dokumente angesehen und bin etwas weiter.

    Wenn es aber an das Auslesen der Einstellungen "Zugriff auf Anwendungseinstellungen" geht hört es auf.

    Auch in den Dokumenten http://msdn.microsoft.com/de-de/library/wch2c4sf.aspx wo man dann landet findet man keinen Code

    "C# nicht unterstützt" ??

    Habe einige Anwendungseinstellungen erstellt. Wenn Du mir jetzt noch sagen kannst wie man auf diese zugreifen kann, wäre echt toll.

    Habe z.B. eine mit dem Namen "SQLServerName" "string" "Anwendung"  und dem Wert "\\SQLExpress.." erstellt.

    Wie kann ich nun meinen Aufruf

    SqlConnection myConnection = new SqlConnection("Server=.\\SQLEXPRESS;Initial Catalog=DBName;user id=Name;pwd=Passwort;Integrated Security=SSPI");

    zusammenstellen ?

    Gruß Roland

    Montag, 21. Juni 2010 06:19
  • Hallo Roland,
    Habe mir die Dokumente angesehen und bin etwas weiter.

    Wenn es aber an das Auslesen der Einstellungen "Zugriff auf Anwendungseinstellungen" geht hört es auf.

    Auch in den Dokumenten http://msdn.microsoft.com/de-de/library/wch2c4sf.aspx wo man dann landet findet man keinen Code

    "C# nicht unterstützt" ??

    Das liegt wohl daran, dass dort nur auf den VB spezifischen Teil verwiesen wird. Für C# muss man wieder etwas mehr suchen und landet dann irgendwann hier:

    Verwenden von Einstellungen in C#
    http://msdn.microsoft.com/de-de/library/aa730869(VS.80).aspx

    Habe einige Anwendungseinstellungen erstellt. Wenn Du mir jetzt noch sagen kannst wie man auf diese zugreifen kann, wäre echt toll.

    Normalerweise über:
    string value = Properties.Settings.Default.SettingName;
    
    "value" kann natürlich auch einen anderen Datentyp als String haben.

    btw. so wie in dem Beispiel aus o.g. Dokumentation mit "myColor" würde ich Einstellungen nicht bezeichnen, sondern immer mit Camel-Case arbeiten, also "MyColor".

    Habe z.B. eine mit dem Namen "SQLServerName" "string" "Anwendung"  und dem Wert "\\SQLExpress.." erstellt.

    Wie kann ich nun meinen Aufruf

    SqlConnection myConnection = new SqlConnection("Server=.\\SQLEXPRESS;Initial Catalog=DBName;user id=Name;pwd=Passwort;Integrated Security=SSPI"

    );

    Für ConnectionStrings gibt es einen eigenen Typ "ConnectionString". Wählst Du diesen aus, kannst Du in der Spalte "Wert" im Designer für Einstellungen, rechts auf den Button [...] klicken und bekommst einen Dialog in dem Du alle Parameter für die Verbindung eingeben kannst. Hier wählst Du "Microsoft SQL Server (SqlClient)" als Datenquelle aus, gibst unter Servername bspw. ".\SQLExpress", sowie die passende Datenabank, weiter unten unter "Verbindung zu Datenbank" an.

    Für Deine SQL Verbindung kannst Du dies dann bspw. so nutzen:
    SqlConnection myConnection = new SqlConnection(Properties.Settings.Default.MySqlServerConnection);
    


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Montag, 21. Juni 2010 10:14
  • Hallo Thorsten,

    Danke für die Info. Bin wieder etwas wieter. Habe auch mal eine weitere Einstellungssatz erstellt.

    Womit ich aber immer noch ein Problem habe, sind die beien Möglichkeiten.

    1 x gehören die Einstellungen zur Anwendung und können zur Laufzeit nicht geändert werden und zum 2 ten gibt es die persönlichen Einstellungen zum Benutzer die zur Laufzeit geändert werden können.

    Was ich brau ist so ein Zwischending. Ich möchte die Servereinstellungen als z.B. SQLServerName, User, Passwort so steuern, das wenn beim Programmstart keine Verbindung hergestellt werden kann (weil falscher oder kein Eintrag) sich dem Benutzer ein Fenster öffnet in dem er die Verbindungsdaten eintragen kann. (like ODBC)

    Das sollte dann aber für die ganze Anwendung gültigkeit haben. Nicht nur für diesen User. Es macht ja keinen Sinn die Verbindungsdaten von jedem User pflegen zu lassen. Aber so wie ich das verstehe geht das nicht.

    Hoffe ich liege da falsch. Hast Du mir einen Hinweis ?

    Gruß Roland

     

     

    Montag, 21. Juni 2010 13:03
  • Hallo Roland,

    die Trennung in Anwendungseinstellungen (darf nur ein authorisierter Benutzer aka. Administrator)
    und Benutzereinstellugen - das darf der jweilige Benutzer direkt - hat schon seinen Sinn.
    Denn z. B. sollten Benutzerkonten und die dazugehörigen Kennwörter je Benutzer gelten -
    denn alles andere ist ein Sicherheitsrisiko wie auch das Arbeiten unter einem Administratorkonto.
    So könnte ein Benutzer die Rechte eines Vorgängers am Arbeitsplatz erben und würde
    damit u. U. auf Dinge zugreifen können, an die er eigentlich nicht sollte (beliebt: Gehaltsdaten ;-).

    Um zur Laufzeit eine Verbindungszeichenfolge mit Benutzerangaben zu vervollständigen,
    kannst  Du den SqlConnectionStringBuilder verwenden, mehr siehe
    Verbindungszeichenfolgen-Generatoren (ADO.NET)

    Wobei Du dem Anwender die Entscheidung überlassen solltest, ob er sein privates Kennwort
    (als Benutzereinstellung) speichert - so wie es auch die Standard-Dialog tun - siehe auch
    Persist Security Info Parameter.

    Was den SQL Server angeht, ist die integrierte Sicherheit am Ende wiederum das einfachste,
    da man dort die Bürde dem Betriebssystem auferlegt.

    Gruß Elmar

    Montag, 21. Juni 2010 15:49
  • Hallo Thorsten,

    habe da noch eine Frage. Bei den "Parameter für die Verbindung" gibt es bei mir keinen "Microsoft SQL Server (SqlClient)" als Datenquelle. Es gibt nur Access SQL Datenbankdatei und SQL Compact 3.5.

    Wie kann ich die Auswahl Microsoft SQL Server (SqlClient)" als Datenquelle hinzufügen ?

    Gruß Roland

     

    Dienstag, 22. Juni 2010 07:57
  • Hallo Roland,

    da wir hier im C# Express Forum sind, gehe ich davon aus Du verwendest Visual C# (2010) Express.

    Dort gibt es nur die Möglichkeit eine lokale SQL Server Datenbank-Datei zu verwenden,
    und auch nur dann, wenn man SQL Server Express (vorzugsweise 2008 R2 ) installiert hat.

    Der Zugriff über den Designer auf reguläre (serverbasierte) SQL Server Datenbanken ist
    den kostenpflichtigen Editionen (ab Professional) vorbehalten - einen Grund, diese zu kaufen,
    muß ja auch gegeben sein ;-)

    Das gilt aber nur für den Designer. Dort muß die Datenbankdatei (MDF) dann ins Projekt
    eingebunden werden und wird als Express Benutzerinstanz verwendet. Etwas was auch
    nur mit den Express-Editionen geht (SQL Server Standard usw. unterstützen keine
    Benutzerinstanzen).

    Zur Laufzeit wiederum kannst Du auf jede SQL Server Instanz (ab 2000) zugreifen.

    Gruß Elmar

     

    Dienstag, 22. Juni 2010 08:34
  • Hallo Elmar,

    habe gerade Versucht auf eine MS SQL Server 2008 Datenbank auf einem anderen Rechner zuzugreifen. Über TCP/IT

    habe dazu auch etwas im Forum gefunden. Geht aber nicht. Es kommt immer der Hinweis das der server die Verbindung ableht.

    So wie Du schreibst, kann man dies mit der Express nicht tun. Auch wenn ich die Daten kpl. eingebe ?

    SqlConnection myConnection = new SqlConnection("Server=tcp:172.1.1.10,1143;Initial Catalog=DBName;user id=Name;pwd=Passwort;Integrated Security=SSPI"); 

    Wie gesagt es geht nicht. Aber ich hoffe ich mach was falsch  !

    Gruß Roland

    Dienstag, 22. Juni 2010 18:55
  • Hallo Roland,

    Deine Verbindungszeichenfolge widerspricht sich ;-)

    Integrated Security = SSPI (oder auch true) bedeutet das Windows Authentifizierung verwendet wird
    und damit das Windows - Konto, was dazu auf dem SQL Server angelegt und berechtigt sein muß

    Wohingegen User Id/Password nur für Standard-Sicherheit mit SQL Server Konten gültig ist.

    Siehe: Syntax für Verbindungszeichenfolgen (ADO.NET)

    Und der SQL Server sollte auch TCP/IP aktiviert haben und für den Port (1143) konfiguriert sein.

    Gruß Elmar

    Mittwoch, 23. Juni 2010 08:02
  • Hallo Roland,

    ergänzend zu Elmars Anmerkungen.

    Und der SQL Server sollte auch TCP/IP aktiviert haben und für den Port (1143) konfiguriert sein.

    Sollte auch die (Windows) Firewall entsprechend konfiguriert sein, Anfragen auf diesem Port von außen zuzulassen. Standardport des SQL Server wäre ohnehin normal 1433, der automatisch angenommen wird, wenn man keinen Port bei der Verbindungszeichenfolge angibt.



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 23. Juni 2010 08:42