Laden...

Welche Datenbank ist für meine Vorhaben am passensten?

Erstellt von Qualimbo vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.802 Views
Thema geschlossen
Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren
Welche Datenbank ist für meine Vorhaben am passensten?

verwendetes Datenbanksystem: ??

Hallo zusammen,
ich bin ganz neu hier im Forum und vor allem bin ich auf dem Gebiet C# + Datenbanken ganz neu.
Nun habe ich mir gestern die Nacht um die Ohren geschlagen um eine geeignete Datenbankverbindung herauszufinden. Da gibt es ja einige Möglichkeiten, wie ich gelesen habe.

Nun ist die Frage, welche Datenbankverbindung wohl die geeignete für mein Szenario ist.

Ich arbeite im Moment an einer Nachkalkulationssoftware für einen lokalen Handwerksbetrieb. Für diese Software ist eine Datenbank mit Artikeln, Bauvorhaben etc. von Nöten.
Diese soll auf dem Server des Betriebes abgelegt werden und von allen Nutzern gleichzeitig genutzt werden können. Daher schließe ich "lokale Datenbanken" schonmal aus.

Die ganzen Namen und Fachbegriffe im Forum haben mich ein wenig verwirrt. Ich bin gelernt im Umgang mit SQL-Statements etc., das einzige Problem ist, dass ich nicht weiß, wie ich über C# das Ganze am besten löse.

Am liebsten wäre mir eine Möglichkeit, in der ich einmal eine Membervariable mit dem Connect-String anlege und ich mir dann eine Klasse basteln kann, um SQL-Querys durchzuführen.

Hätte da jemand einen Tip, mit welchem System (Oledb, Ado.Net, Linq??) ich das Ganze am Besten bewältige und welche Möglichkeiten es zu der Lösung gibt?

Die bisherigen Themen haben mich da nicht so ganz weiter gebracht.

Vielen Dank im Voraus,
Qualimbo

Nachtrag: Die Datenbank liegt als MS-Acess Datenbank vor

458 Beiträge seit 2007
vor 12 Jahren

be the hammer, not the nail!

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Genau diesen Artikel hatte ich eben auch noch geöffnet.
Aber muss ich denn dort irgendetwas zusätzlich installieren und vor allem: Muss der spätere Client das Ganze auch installiert haben?

Ich kann das nämlich nicht unter realen Bedingungen testen, sondern nur bei mir Zuhause. Auf das Firmennetzwerk habe ich im Moment keinen Zugang.

Oder ist der OLEDB Controller immer installiert?

458 Beiträge seit 2007
vor 12 Jahren

Wenn das .NET Framework installiert ist, was es sein muss damit die Anwendung ueberhaupt laeuft - ist auch der OleDB Treiber da.

be the hammer, not the nail!

F
10.010 Beiträge seit 2004
vor 12 Jahren

Auch wenn es bei einigen funktioniert würde ich eine MDB niemals über das Netz ansprechen und schon gar nicht bei vorgesehenem Multiuserbetrieb.

Zumal der MS SqlServer Express kostenlos ist, und für solche Aufgaben bestimmt nicht überfordert sein sollte.

Und ansonsten:
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
[Artikelserie] SQL: Parameter von Befehlen
ADO.NET – verbindungsorientierte Objekte

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Zumal der MS SqlServer Express kostenlos ist, und für solche Aufgaben bestimmt nicht überfordert sein sollte.

Nunja, leider weiß ich überhaupt nicht wirklich, was das ist.
Am liebsten wäre mir ja eigentlich eine MySQL-Datenbank.

Außerdem erkennt die Methode, die oben genannt wurde das ".accdb"-Format nicht an.
Auch kam direkt eine Fehlermeldung, als ich die Datenbank noch geöffnet hatte. Das entspricht ja dann nicht dem Multiusing.

Kannst du mir vielleicht erklären, was ich mit MS SqlServer Express anfangen kann? Was ist daran besser, bzw. wie könnte ich das Ganze auf mein Szenario anwenden?

Ich habe nun mal eine Klasse gebastelt, mit der obrigen Methode:

    public class hp_class_db
    {
        OleDbConnection m_con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Users\Qualimbo\Documents\Visual Studio 2010\Projects\HP Nachkalkulation\hp_data.accdb");
        
        public ArrayList do_query (string SQL_string)
        {       
            m_con.Open();
            string strSQL = SQL_string;
            OleDbCommand cmd = new OleDbCommand(strSQL, m_con);
            OleDbDataReader dr = cmd.ExecuteReader();

            ArrayList array_data = new ArrayList();
            while (dr.Read())
            {
                int i = dr.FieldCount;
                ArrayList array_data_row = new ArrayList();
                for (int c = 0; c <= i; c++)
                {
                    array_data_row.Add(dr[c]);
                }
                array_data.Add(array_data_row);
            }            
            dr.Close();
            m_con.Close();
            return array_data;
        }
    }
6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Qualimbo,

für dein Vorhaben ist so ziemlich jede vernüftige Datenbank geeignet. Wenn du aber MySQL favorisierst dann ist die Entscheidung eh schon gefallen 😉

Einen Überblick gibt auch Empfehlungen für SQL-Datenbank gesucht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Es ging mir weniger um eine Datenbank, als um die Schnittstelle in C#. Ich werde mich denke ich mit MS SQL Server 2008 Express auseinander setzen und die Lösung dann hier rein schreiben.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Qualimbo,

um die Schnittstelle in C#.

Da gibts viele Möglichkeiten und diese zu diskutieren kann einem "Glaubenskrieg" gleichen 😉
Deshalb hier nur ein paar Stichworte, damit du weiter suchen kannst:
O/R-Mapper wie Linq2Sql, ADO.net Entity Framework, NHibernate, ...
DataSet
...

Auch passend und hilfreich ist http://connectionstrings.com/

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

N
135 Beiträge seit 2006
vor 12 Jahren

Ist es nicht so dass MS Sql Express nur eine aktive Verbindung zulässt? Wär doch dann auch nicht für den betrieblichen Einsatz ungeeignet, zumindest wenn gleichzeitig darauf zugegriffen werden muss.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Neidhard,

nein das ist nicht so.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ist es nicht so dass MS Sql Express nur eine aktive Verbindung zulässt? Wär doch dann auch nicht für den betrieblichen Einsatz ungeeignet, zumindest wenn gleichzeitig darauf zugegriffen werden muss.

Nein.

1.564 Beiträge seit 2007
vor 12 Jahren

Ist es nicht so dass MS Sql Express nur eine aktive Verbindung zulässt?

Nein, du verwechselst die Express Edition mit der Compact Edition.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Hinweis von gfoidl vor 12 Jahren

Dieser Punkt ist somit ausreichend geklärt 😉

F
10.010 Beiträge seit 2004
vor 12 Jahren

Und nichtmal die hat die Beschränkung.

@Qualimbo:

  1. Unter .NET wird jede Datenbank per ADO.NET angesprochen, egal ob OleDb, MsSql oder MySql.
    Deshalb auch der link zum Openbook.

  2. Solltest Du lernen [Hinweis] Wie poste ich richtig? zu beachten, und da speziell Punkt 5.

  3. MySql ist im kommerziellen Umfeld nicht kostenlos, viel zu langsam übers Netz und die junx von MySql bekommen seit jahren keinen wirklich vernünftigen Treiber hin.

Tu dir wirklich einen gefallen und lese wenigstens die Einleitung zu ADO.NET durch.

@Neidhard:
Nur wenn du nicht weist was du tust und eine Multiuser version mit AttachDbFile aufbaust.

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Ich danke euch für die vielen hilfreichen Antworten.
Was ich an Punkt 5 nicht beachtet habe, leuchtet mir nicht ganz ein. Ich bin aber auch wie gesagt neu hier und lasse mich gerne belehren!

Ich werde nun mit der MS SQL Server Express Version arbeiten, die Connection werde ich schon hinkriegen, da gibt es ja genügend Tutorials.

Mein Problem lag einfach darin, dass ich von der Masse an Möglichkeiten etwas "überrollt" wurde.

Vielen Dank noch einmal und bis demnächst,
Qualimbo

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Qualimbo,

Was ich an Punkt 5 nicht beachtet habe, leuchtet mir nicht ganz ein

Punkt 5 bezieht sich nicht nur auf Fehler (-meldungen), sondern auch allgemeiner auf die Problembeschreibung. Hier warst du etwas zu allgemein. Daher der Hinweis, dass du versuchen sollst so exakt wie möglich das Problem zu beschreiben. Nur dann kannst du auch gezielte Hilfe erwarten. Es ist also in deinem Sinne.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Eine Frage hätte ich allerdings nun noch:
Ich benutze folgendes Tutorial, um das erstellen einer Datenbank in meiner Anwendung zu lernen:
Exemplarische Vorgehensweise: Erstellen einer SQL Server Express-Datenbank

Wenn ich es nach diesem Tutorial mache, erscheint es mir so, als wäre die Datenbank dann lokal auf meinem Computer (ist ja irgendwie klar..).
Kann ich diese Datenbank im Nachhinein auf den SQL Server im Betrieb exportieren und den Zugriff meiner Anwendung im Nachhinein auf den Server des Betriebes umstellen? Ich möchte ungern meine Anwendung auf einer Datenbank bauen, die später nicht mehr verwendbar ist.

Es würde mich freuen, weiterhin so nette Hilfe zu bekommen.

Grüße,
Qualimbo

1.029 Beiträge seit 2010
vor 12 Jahren

Hi,

klar kannst du die DB exportieren.

Wenn du dir die SqlExpress inkl. ManagementStudio geholt hast z.B. darüber.

Mein Visual Studio (2010 Ultimate) kann's auch - und manche O/R-Mapper können
das Schema auch erstellen. (Letztlich gehts ja nur um ein SQL-Script, dass du dann gegen
die Betriebs-DB laufen lassen kannst.

LG
Achim

1.564 Beiträge seit 2007
vor 12 Jahren

Hi Qualimbo

Habe mir das Tutorial jetzt nicht wirklich angeschaut, aber klar kannst du im Nachhinein den Zielrechner, auf dem sich der SQL Server befindet anpassen.

Du hast hierfür einen Connection-String aller:

Data Source=RechnerName;Initial Catalog=DatenbankName;Integrated Security=SSPI;

Alles was zu tun ist, ist den Connection-String anzupassen. Falls du mit Windows-Authentifizierung arbeitest (Integrated Security oder Trusted_Connection), darauf achten dass der Benutzer die nötigen Rechte auf dem Zielserver hat. Bei der Installation der Express-Edition auf einem Remote-Server musst du übrigens darauf achten, dass du am Ende im Configuration Manager TCP/IP als Prodokoll aktivierst und ggf. die Firewall für SQL Server konfigurierst, sonst kommst du nicht drauf.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Sehr gut, dann scheint SQL-Server-Express tatsächlich meine Lösung zu sein!
Vielen Dank!

Ich werde denke ich die Server-Einrichtung mit dem Unternehmen, welches den Server auch sonst verwaltet, erledigen! Die sollten sich damit ja auskennen.

Ich habe bisher mehr mit PHP und Javascript gearbeitet, und mich leider bisher zu wenig mit Servertechnik beschäftigt. Aber meine Ausbildung dauert ja auch noch.

Bis dann und noch einmal vielen Dank,
Qualimbo

U
237 Beiträge seit 2007
vor 12 Jahren
  1. MySql ist im kommerziellen Umfeld nicht kostenlos, viel zu langsam übers Netz und die junx von MySql bekommen seit jahren keinen wirklich vernünftigen Treiber hin.

Tut mir leid, aber da liegst du falsch. MySQL ist auch im kommerziellen Umfeld kostenlos.

Außerdem habe ich öfter Programme mit MySQL als DB erstellt und keine Probleme gehabt was Treiber angeht.

heute code ich, morgen debug ich und übermorgen cast ich die königin auf int

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Hallo nochmal,
für alle, die sich das Thema durchlesen und sich fragen wie ich es gelöst habe (evtl. hat ja jemand das selbe Problem) habe ich hier mal die Lösung:

Zum einen hat mich dieses Tutorial bei der Verbindungsherstellung sehr gut unterstützt:
SQL Server Express and C# .NET

Wunderbar erklärt, mit Bildern etc. (leider nur in Englisch).

Mein Code sieht nun so aus:

    public class hp_class_db
    {
        System.Data.SqlClient.SqlConnection m_con = new System.Data.SqlClient.SqlConnection();
         
        public ArrayList do_query (string SQL_string)
        {
            string strSQL = SQL_string;
            m_con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\HP_Data.mdf;Integrated Security=True;User Instance=True";
            
            m_con.Open();
        }
    }

Hier kann man sehen, wie nun die Verbindung zum SQL-Server und der darauf angelegten Datenbank aussieht. In meinem Fall habe ich eine eigene Klasse für die Datenbankzugriffe geschrieben, die später noch um weitere Funktionen erweitert werden kann.

Ich hoffe, ich konnte nun vielleicht auch mit meiner Lösung mein eigentliches Problem darstellen: Die Verbindung zu einer geeigneten Datenbank herstellen.

Grüße und vielen Dank,
Qualimbo

(Das Thema könnte dann meinetwegen geschlossen werden, falls keine Fragen mehr bestehen)

Hinweis von gfoidl vor 12 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3.1

(Das Thema könnte dann meinetwegen geschlossen werden, falls keine Fragen mehr bestehen)

Themen werden für normal nicht geschlossen, solange sie den Regeln entsprechen.

1.564 Beiträge seit 2007
vor 12 Jahren

Hi

Erstmal, danke dass du deine Lösung geteilt hast.

Hierzu aber zwei Anmerkungen:

1.
Fang gar nicht erst mit AttachDbFilename an. Das ist ein echtes Schmarn-Feature von SQL Express. Braucht keiner, bringt nix und macht nur Probleme - z.B. sehr langsame Verbidungen, keine gleichzeitigen Zugriffe, ...

2.
Lass die ArrayList in Frieden ruhen, die ist Legacy. Verwende die generische List<T>.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Q
Qualimbo Themenstarter:in
32 Beiträge seit 2011
vor 12 Jahren

Hallo Florian,
gerne teile ich meine Lösung, leider bin ich noch nicht ganz durchgestiegen in diesem doch neuen Terrain für mich.

Was AttachDbFilename genau anstellt, ist mir gar nicht klar. Den Connect-String habe ich von Visual Studio erstellen lassen.

Könntest du mir sagen, wie der Connect-String für meine Zwecke aussehen müsste? (Gerade das Multiusing ist mir wichtig).

Zur Arraylist: Hast du denn eine Möglichkeit, wie ich einen Array ohne feste Größe erstelle?
Ich kann mich dran erinnern, dass ich es damals irgendwie gelöst hatte.. weiß aber nicht mehr wie und im Internet habe ich auch nicht wirklich hilfreiches gefunden.
Eigentlich soll ein Array angelegt werden, der widerrum Arrays mit den einzelnen Spaltenwerten enthält!

Bisher sieht das so aus:

            ArrayList array_data = new ArrayList();
            while (sql_reader.Read())
            {
                int i = sql_reader.FieldCount;
                ArrayList array_data_row = new ArrayList();
                for (int c = 0; c <= i; c++)
                {
                    array_data_row.Add(sql_reader[c]);
                }
                array_data.Add(array_data_row);
            }   

Was allerdings auch ein Problem darstellt, ist überhaupt erst einmal Daten in meine Datenbank per Code reinzuschreiben. Bisher sieht das so aus:

            SqlCommand sql_cmd = new SqlCommand(sql_query, m_sql_con);            
            SqlDataReader sql_reader = sql_cmd.ExecuteReader();

Die Variable "sql_query" ist mit dem SQL-String gefüllt:
"INSERT INTO tbl_bauvorhaben (bv_name, bv_ort, bv_betreff) VALUES ("test", "test", "test")

Die Spalte "Bv_id" in meiner Tabelle ist der Primärschlüssel und per "Identity: Ja", "ID-Startwert: 1", "ID-Schrittweite:1" ein Autowert.

An der Stelle:

SqlDataReader sql_reader = sql_cmd.ExecuteReader();

Führt es allerdings zum Fehler, da ich keinen "NULL"-Wert für die Spalte bv_id angeben kann. Eigentlich soll dieser Wert aber ja generiert werden. Hast du da eine Idee?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Qualimbo,

wie der Connect-String für meine Zwecke aussehen müsste?

Siehe die Links in diesem Thema.

Zur Arraylist: Hast du denn eine Möglichkeit, wie ich einen Array ohne feste Größe erstelle?

Auch das wurde schon beantwortet -> nimm eine List<T>.

Eigentlich soll ein Array angelegt werden, der widerrum Arrays mit den einzelnen Spaltenwerten enthält!

Erstell dir besser ein Objekt das die Daten repräsentiert und pack diese in die List<T>. (Das T wird dabei durch die Klasse ersetzt).

INSERT INTO tbl_bauvorhaben (bv_name, bv_ort, bv_betreff) VALUES ("test", "test", "test")

Auch das hatten wir denke ich schon, aber zur Sicherheit schau dir [Artikelserie] SQL: Parameter von Befehlen an.

Da eigentlich alles nötige bereits erwähnt wurde und der Rest sich einfach in der :rtfm: finden lässt mach ich hier zu.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Thema geschlossen