c# - SQL-Datenbank von Webserver nutzen

bremse

Grünschnabel
Hi Leute,

hab folgendes Problem.

Hab die Daten meiner Programme immer in einer Access-DB gespeichert. Bei meinem neuen Projekt kann ich das aber nicht mehr machen weil das Programm von 2 Standorten genutzt werden soll. Deswegen möchte ich als DB die SQL-DB meines Webservers nutzen.
Hab auch schon das Forum diesbezüglich durchsucht und auch schon einiges ausprobiert. Bekomme es aber einfach nicht hin.

Mein Programm ist so aufgebaut, dass ich eine Klasse namens "DBZugriff.cs" habe, wo ich dann die DB-Connection öffne und auch schließe.

Code:
   using System;
   using System.Data;			// für Datenbankzugriff
   using System.Data.OleDb;	// für Datenbankzugriff
   using System.Windows.Forms; // für Datenbankzugriff
   
   namespace Verwaltung
   {
   	/// <summary>
   	/// Zusammenfassung für DBZugriff.
   	/// </summary>
   	public class DBZugriff
   	{
   		public DBZugriff()
   		{
   			//
   			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
   			//
   		}
   
   		// Das Datenbank-Verbindungsobjekt
   		protected static OleDbConnection verbindung = null;
   
   		public static bool openDB()
   		{
   			// erstelle Verbindungsobjekt
 			verbindung = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = \"C:/Programme/Einkaufsverwaltung/datenbank.mdb\"");
 			//verbindung = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = \"datenbank.mdb\"");
   
   			try
   			{
   				// öffne Verbindung
   				verbindung.Open();
   				return true;
   			}
   			catch(InvalidOperationException ioe)
   			{
 		 	MessageBox.Show(ioe.Message, "Fehler 1 beim Öffnen der DB");
   				return false;
   			}
   			catch(OleDbException ode)
   			{
 		 	MessageBox.Show(ode.Message, "Fehler 2 beim Öffnen der DB");
   				return false;
   			}
   		}
   
   		public static void closeDB()
   		{
   			verbindung.Close();
   		}
   
   		// Diese Funktion wird deshalb hier geschrieben weil es ja für jede
   		// Klasse das selbe ist wenn sie ne neue Identnr braucht
   		// Der einzige Unterschied ist immer nur der Tabellenname
   		// STATIC = man braucht kein Objekt um diese Funktion aufrufen zu können
   		public static int getNeueIdentNr(string tabname)
   		{
   			// SQL-String 
   			string sql = "select max(identNr) from " + tabname;
   
   			// erstelle Command-Objekt
 			OleDbCommand befehl = new OleDbCommand(sql, verbindung);
   
   			// führe Befehl aus und empfange Daten
   			OleDbDataReader daten = befehl.ExecuteReader();
   
   			// nächste freie IdentNr
   			int neueIdent = 1;
   
   			if (daten.Read() == true)
   			{
   				if (!daten.IsDBNull(0))
   				{
 		 		neueIdent = daten.GetInt32(0) + 1;
   				}
   				daten.Close();
   			}
   			return neueIdent;
   		}
   	}
   }


dann habe ich eine andere Klasse, z.B. dbStation.cs, die die SQL-Anweisung beinhaltet.

Code:
   using System;
   using System.Data;
   using System.Data.OleDb;
   
   namespace Verwaltung
   {
   	/// <summary>
   	/// Zusammenfassung für dbStation.
   	/// </summary>
   	public class dbStation : Verwaltung.DBZugriff
   	{
   		public static bool dbSelect(Stationen stationen, string kommnr)
   		{
   			//SQL-String
 			string sql = "select * from Station where KommNr = '" + kommnr +"' order by StationNr";
   
   			//erstelle Befehsobjekt
 			OleDbCommand befehl = new OleDbCommand(sql, verbindung);
   
   			//führe Befehl aus und empfange Daten
   			OleDbDataReader daten = befehl.ExecuteReader();
   
   			//lies den nächsten Satz
   			while(daten.Read()==true)
   			{
   				//erzeuge Kommissionsobjekt
 				Station station = new Station(kommnr);
   
 				//Datensazt in Kommissionssobjekt schreiben
 		 	if(!daten.IsDBNull(0)) station.IdentNr = daten.GetInt32(0);
 		 	if(!daten.IsDBNull(1)) station.StationNr = daten.GetString(1);
 		 	if(!daten.IsDBNull(3)) station.Bezeichnung = daten.GetString(3);
 		 	if(!daten.IsDBNull(4)) station.Lieferant = daten.GetString(4);
 		 	if(!daten.IsDBNull(5)) station.Liefertermin = daten.GetDateTime(5);
 		 	if(!daten.IsDBNull(6)) station.Preis = daten.GetDecimal(6);
 		 	if(!daten.IsDBNull(7)) station.Geliefert = daten.GetString(7);
 		 	if(!daten.IsDBNull(8)) station.InFertigung = daten.GetDateTime(8);
 		 	if(!daten.IsDBNull(9)) station.EnddatumKaufteile = daten.GetDateTime(9);
 		 	if(!daten.IsDBNull(10)) station.EnddatumStation = daten.GetDateTime(10);
 		 	if(!daten.IsDBNull(11)) station.Auslieferung = daten.GetDateTime(11);
 		 	if(!daten.IsDBNull(12)) station.Vormontage = daten.GetDateTime(12);
   				station.InDB = true;
   
 				//Mitgliedsobjekt dem Behälter hinzufügen
   				stationen.Add(station);
   			}
   			daten.Close();
   			return true;
   		}
   		
   		// fügt ein Kommissionsobjekt in der DB ein
   		public static int dbInsert(Station station)
   		{
   			// hole nächste IdentNr
   			station.IdentNr = getNeueIdentNr("Station");
   
   			// SQL-Befehl
   			string sql = "insert into Station "
 		 	+ "(IdentNr,StationNr, KommNr, Bezeichnung, Lieferant, Liefertermin, Preis, Geliefert, InFertigung, EnddatumKaufteile, EnddatumStation, Auslieferung, Vormontage)"
   				+ "values("
   				+ station.IdentNr+",'"
   				+ station.StationNr+"','"
   				+ station.KommNr+ "','"
   				+ station.Bezeichnung+ "','"
   				+ station.Lieferant+ "','"
   				+ station.Liefertermin+ "','"
   				+ station.Preis+ "','"
   				+ station.Geliefert+ "','"
   				+ station.InFertigung+ "','"
 				+ station.EnddatumKaufteile+ "','"
 				+ station.EnddatumStation+ "','"
   				+ station.Auslieferung+ "','"
   				+ station.Vormontage+ "')";
   
   			// erstelle Befehlsobjekt
 			OleDbCommand befehl = new OleDbCommand(sql, verbindung);
   
   			// führe Befehl aus
   			int anzahl = befehl.ExecuteNonQuery();
   
   			if (anzahl>0)
   			{
   				station.InDB = true;
   			}
   			return anzahl;
   		}
   		
   		// ändert einen Datensatz
   		public static int dbUpdate(Station station)
   		{
   			// SQL-Befehl
 			string sql = "update Station set StationNr='"+station.StationNr
 				+"', Bezeichnung='"+station.Bezeichnung
 				+"', Lieferant='"+station.Lieferant
 				+"', Liefertermin='"+station.Liefertermin
   				+"', Preis='"+station.Preis
 				+"', Geliefert='"+station.Geliefert
 				+"', InFertigung='"+station.InFertigung
 				+"', EnddatumKaufteile='"+station.EnddatumKaufteile
 				+"', EnddatumStation='"+station.EnddatumStation
 				+"', Auslieferung='"+station.Auslieferung
 				+"', Vormontage='"+station.Vormontage
 				+"' where IdentNr="+station.IdentNr;
   			
   			// erstelle Befehlsobjekt
 			OleDbCommand befehl = new OleDbCommand(sql, verbindung);
   
   			// führe Befehl aus
   			int anzahl = befehl.ExecuteNonQuery();
   
   			return anzahl;
   		}
   		
   		public static int dbDelete(int id)
   		{
   			// SQL-Befehl
 			string sql = "delete from Station where IdentNr = " + id;
   
   			// erstelle Befehlsobjekt
 			OleDbCommand befehl = new OleDbCommand(sql, verbindung);
   
   			// führe Befehl aus
   			int anzahl = befehl.ExecuteNonQuery();
   
   			return anzahl;
   		}
   	}
   }

Wär echt super, wenn mir jemand helfen könnte, dass ich in meinem Programm so wenig wie möglich umschreiben müsste.
 

Norbert Eder

Erfahrenes Mitglied
Würdest du die ConnectionString Informationen in einer Config-Datei haben, müsstest du gar nichts umschreiben, denn den SQL-Server kannst du natürlich auch per OleDB ansprechen. Eventuell musst du kurz deine SQL-Statements ansehen, ob diese auch unter dem SQL-Server funktionieren.
 

bremse

Grünschnabel
wenn ich es umschreibe, zeigt die Compilierung keine Fehler. Aber es läuft dann doch nicht und .net will nen debugger starten.

Hab es so umgeschrieben
verbindung = new OleDbConnection("Database=usr_web15_p2; Data Source=
IP-Addresse; UserId = web15; Password=xxx;");
 

bremse

Grünschnabel
Folgende Fehlermeldung wird angezeigt


Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in system.data.dll aufgetreten.

Zusätzliche Informationen: In ConnectionString wurde kein OLE DB Provider angegeben. Anwendungsbeispiel: 'Provider=SQLOLEDB;'.
 

bremse

Grünschnabel
Habe jetzt einfach den Provider in den Connection String eingefügt und einen Verweis zur System.Data.dll hinzugefügt.

Jetzt kommt folgender Fehler bei
OleDbDataReader daten = befehl.ExecuteReader();



Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.data.dll aufgetreten.

Zusätzliche Informationen: ExecuteReader erfordert eine offene und verfügbare Verbindung. Aktueller Verbindungsstatus: Closed.
 

bremse

Grünschnabel
Hallo Norbert,

hab jetzt folgende Fehlermeldung


[DBNETLIB][ConnectionOpen(Connect()).]SQL Server existiert nicht oder Zugriff verweigert.

Kannst du mir helfen?
 

MFC openGL

Erfahrenes Mitglied
Wo liegt das Problem, bekommst du keine Connection zu DB, oder wo ist das Problem ?

Evtl hast du keine Rechte um mit dem DBUser von außerhalb zuzugreifen, hast du das gechecked ?

Ansonsten kann ich dir nur raten, probiere mal die Lösung in dem Thread den ich dir gepostet hab, das läuft...


Gruss

MFC OpenGL