myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Hinzufügen einer Remote-DB-Verbindung - Welcher Weg?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Hinzufügen einer Remote-DB-Verbindung - Welcher Weg?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
hipp1010 hipp1010 ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.10.2011
Beiträge: 76
Entwicklungsumgebung: Visual Studio 2010


hipp1010 ist offline

Hinzufügen einer Remote-DB-Verbindung - Welcher Weg?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

verwendetes Datenbanksystem: SQL-Server 2012

Ich möchte eine Anwendung in VS 2010 erstellen, bei der ich auch einen Remote-Sql-Server zugreife. Das direkte Einbinden in die Applikation geht wohl nicht. So kann ich wohl auf die Daten nur über eine Connection zugreifen. Schön wäre es , wenn ich das Feature der grafischen TableAdapter Erstellung nutzen hätte können.

Bei der Connection stellt sich die Frage, ob es besser ist, sich per OLEDB zu verbinden, oder sich bei der Instanz per "Server srv = new Server();" anzumelden.

Hinzu kommt, dass wir eine Enticklungs-Umgebung und Produktions-Umgebung haben, die beim einloggen in die Applikation geswitcht werden muss.

Gruß Hipp
16.06.2012 13:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 1.181


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich nutze die SqlDbConnection. Die Erstellung einer Verbindung per Code sind ein paar Zeilen. Eigentlich übersichtlicher als versteckter Code hinter grafischen Elementen. Für die paar Werte lohnt sich das fast nicht, außer du willst das grafisch erstellte Element wieder in einem anderen grafischen Element nutzen. Aber das tu ich auch nie, weil mir die grafische Pflege dieser Elemente (DataSet usw.) auch wieder zu umständlich ist.
Der Connection kannst du alle Parameter so übergeben wie du sie gerade haben willst. Und du kannst dir so viele Verbindungen erstellen wie du willst.

Ich muss übrigens zugeben dass ich deine Frage nicht ganz verstanden habe.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am 16.06.2012 14:19.

16.06.2012 14:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hipp1010 hipp1010 ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.10.2011
Beiträge: 76
Entwicklungsumgebung: Visual Studio 2010

Themenstarter Thema begonnen von hipp1010

hipp1010 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank. Zum Verwenden der Daten gibt es ja unterschiedliche Möglichkeiten. Man kann mit den TableAdaptern arbeiten, die man im Code generiert oder eben über die grafische Oberfläche. Hier kann man zusätzliche Queries implementieren, etc. Doch dies geht nur, wenn ich eine DB (z.B: Access, oder lokale SQL-DB) direkt anbinde. Da unser Sql-Server aber auf einen Remote-Rechner installiert ist, komme ich in VS 2010 EXPRESS nicht dran. Somit muss ich es eben manuell machen: Adapter Objekt erzeugen, mit dynamischen SQL, etc.

Über die grafische Oberfläche wäre es halt einfache und schneller, weniger Schreibarbeit. So muss ich für jedes Lesen, Ändern oder Löschen eigene SQL-Statements erzeugen und absetzen. Oder gibt es hier eine andere Variante, z. B. ein DataGridView direkt einzubinden, inkl. Insert, UPDATE und DELETE-Möglichkeiten?

Gruß Hipp
16.06.2012 14:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 1.181


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Kann man in einer zusammengeklickten Connection wirklich nicht auf einen Remote Server? Kann ich mir ehrlich gesagt kaum vorstellen.
Irgendwo kanst du doch die Datenbank angeben oder nicht?
Vielleicht musst du bei der Suche nach der DB umstellen dass nicht nur lokal sondern im Netz gesucht wird.
Und wenns gar nicht anders geht, klick halt erst mal eine lokale rein und ändere dann den generierten Code so um dass es auf eine remote geht.
16.06.2012 15:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hipp1010 hipp1010 ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.10.2011
Beiträge: 76
Entwicklungsumgebung: Visual Studio 2010

Themenstarter Thema begonnen von hipp1010

hipp1010 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Man kann eine SQL_Server-Datenbank-Datei auswählen. Ich möchte aber eine direkte Verbindung zum SQL-Server.

Egal.

Gruß Hipp
16.06.2012 16:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Cat
myCSharp.de-Mitglied

images/avatars/avatar-3070.jpg


Dabei seit: 25.10.2009
Beiträge: 453


Cat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

Visual Studio Express unterstützt per Designer nur den Zugriff auf lokale Datenbankdateien.
Für den MS SQL Server solltest du auf jeden Fall den nativen Zugang mittels der System.Data.SqlClient Klassen wählen (und nicht OleDB). Du wirst also es ausprogrammieren müssen.
Unter  http://www.connectionstrings.com/sql-server-2008 findest du die passenden Parameter für den Connectionstring (gilt auch für 2010 und 2012).
16.06.2012 16:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hipp1010 hipp1010 ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.10.2011
Beiträge: 76
Entwicklungsumgebung: Visual Studio 2010

Themenstarter Thema begonnen von hipp1010

hipp1010 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke. Habe gerade zwei Wege ausprobiert und hier stellt sich mir die Frage was ist besser. Es geht um die Rückgabe der Werte z.B. beim Lesen aus einer Tabelle.

Auf der einen Seite habe ich diese Variante

C#-Code:
oCommand.Connection.Open();
SqlDataReader oReader = oCommand.ExecuteReader();
while (oReader.Read())
{
     string field1 = oReader[0].ToString();
     ...
}

(hier etwas verkürzt ohne Exception) auf der anderen diese:

C#-Code:
sqlCommand.Connection.Open();
sqlDataAdapter = new SqlDataAdapter(sqlCommand);

DataSet = new DataSet();
try
{
    sqlDataAdapter.Fill(this.DataSet);
    this.returnDataTable = new DataTable();
}
catch (Exception ex)
{
    string msg = ex.Message.ToString();
    this.DataSet = null;
}
if ((this.DataSet != null) && (this.DataSet.Tables.Count > 0))
{
    this.returnDataTable = this.DataSet.Tables[0];
}
else
{
    this.returnDataTable = null;
}
try
{
    sqlCommand.Connection.Close();
}
catch (Exception ex)
{
    string msg = ex.Message;
}
finally
{
    if (sqlConnection != null && sqlConnection.State != ConnectionState.Closed)
    {
        sqlConnection.Close();
    }
}
_disposed = false;
return returnDataTable;

mit anschließend

C#-Code:
DataBase oDataBase = new DataBase(DataBase.pubEnvironment.production);
DataTable returnDataTable = oDataBase.Read(sqlString);
oDataBase.Dispose();
if (returnDataTable != null)
{
    foreach (DataRow row in returnDataTable.Rows)
    {
        break;
    }
}

Beide Wege erzeugen über den Konstruktor ein Objekt, in dem der Connection-String erzeugt wird und ein neues Object SQLConnection. Natürlich wird auch zuvor ein SqlCommand Objekt erzeugt.

Was wäre zu bevorzugen oder was ist schneller? Ziel ist es, DataGridViews zu füllen oder Comboboxen zu füllen, etc.

Gruß Hipp
16.06.2012 18:35 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Cat
myCSharp.de-Mitglied

images/avatars/avatar-3070.jpg


Dabei seit: 25.10.2009
Beiträge: 453


Cat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Für DataBinding solltest du der Einfachheit wegen die 2. Variante benutzen (SqlDataAdapter.Fill).

Um dir den Programmcode bzgl. der try-catch-finally zu vereinfachen, solltest du die using-Anweisung benutzen:

C#-Code:
using (SqlConnection connection = new SqlConnection("..."))
  using (SqlCommand command = new SqlCommand(sql, connection))
  {
     connection.Open();

     using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand))
     {
        dataAdapter.Fill(this.DataSet);
       ...
     }
  }

Close bzw. Dispose wird dann auch bei einer Exception automatisch ausgeführt.
17.06.2012 09:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 1.181


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

this.returnDataTable = new DataTable(); ist überflüssig

Den Test
if ((this.DataSet != null) && (this.DataSet.Tables.Count > 0))
kannst du eigentlich auch weglassen. Wenn da wirklich was null ist, ist irgendwas im Programm gründlich schief gelaufen. Da würd ich es lieber knallen lassen anstatt still und leise mit null weiter zu machen.
Als Test ob vorher eine Excecption stattgefunden hat, halte ich das für nicht schön. Da spring lieber gleicht aus der Methode raus, statt den Fehlerfall durch alles weitere durch zu schleifen.

Wenn du das machst
sqlCommand.Connection.Close();
warum dann noch das?
sqlConnection.Close();
17.06.2012 11:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 8.478


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@cat:
Oder diese ganzen überflüssigen Zeilen ganz weg lassen.

C#-Code:
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sql,ConnectionString))
{
   dataAdapter.Fill(this.DataSet);
   ...
}
17.06.2012 12:56 Beiträge des Benutzers | zu Buddylist hinzufügen
BerndFfm BerndFfm ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-3299.jpg


Dabei seit: 20.01.2006
Beiträge: 3.143
Entwicklungsumgebung: Visual Studio 2008
Herkunft: Frankfurt a.M.


BerndFfm ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Hipp,

Zitat:
Habe gerade zwei Wege ausprobiert und hier stellt sich mir die Frage was ist besser

Im ersten Beispiel verwendest Du einen DataReader. Den sollte man immer nutzen wenn es um Geschwindigkeit geht und die Zeilen nacheinander gelesen werden müssen.

Im zweiten Beispiel benutzt Du ein DataSet. Das sollte man benutzen wenn man Daten ändern oder einfügen möchte.

Hier noch ein paar Beispiele :  http://www.seven-c.de/files/datenbankenhowto.htm

SQL.Kommandos musst Du nicht schreiben, das nimmt Dir der CommandBuilder ab.

Grüße Bernd
18.06.2012 09:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hipp1010 hipp1010 ist männlich
myCSharp.de-Mitglied

Dabei seit: 11.10.2011
Beiträge: 76
Entwicklungsumgebung: Visual Studio 2010

Themenstarter Thema begonnen von hipp1010

hipp1010 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die ganzen Infos. Werde es gleich integrieren.

Gruß Hipp.
19.06.2012 07:40 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 20.05.2013 02:42