Autor Beitrag
waldemar
Hält's aus hier
Beiträge: 6

Win XP (Home + Prof), Vista, Ubuntu 8.10, SuSE 10.3

BeitragVerfasst: Di 10.03.09 10:47 
Hallo zusammen,

ich bin noch ein ziemlicher Neuling was CSharp angeht, also bitte entschuldigt die wahrscheinlich triviale Frage.

Ich habe folgendes Problem, ich soll eine eigene Datenquelle erstellen, die SQL-Befehle entgegennimmt, und diese intern in ein proprietäres Format umbaut, und ausführt.
Dazu dachte ich mir ich könnte einfach die Klassen SqlDataSource und SqlDataSourceView ableiten und zum Beispiel die Methode SqlDataSourceView.ExecuteSelect
überschreiben. Allerdings verlangt der Konstruktor von SqlDataSource eine Referenz auf den aktuellen HttpContext, welcher in meiner nativen Anwendung natürlich nicht vorhanden ist.

Hat jemand einen Lösungsansatz für mich?

Grüße
Waldemar
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 10.03.09 11:37 
Hallo Waldemar und :welcome:

Du glaubst, das ist eine triviale Frage? Selbst das glaube ich nicht, aber die Antwort ist noch viel komplexer.

In welchem Zusammenhang willst Du die Daten verarbeiten? Deine Stichworte SqlDataSource und HttpContext weisen auf eine ASP.NET-Anwendung (WebForms) hin, die Formulierung "native Anwendung" dagegen auf WinForms oder vielleicht WPF. Bitte kläre dies.

Als Einführung in die DB-Verarbeitung unter NET kann ich vor allem auf OpenBook Visual C# Kap.25 ff. verweisen. Eine (sehr knappe und unvollständige) Einführung ist auch unter Datenbanken How-To zu finden.

Was ist mit "eigener Datenquelle" gemeint, die "SQL-Befehle entgegennimmt"? Eine SQL-Datenbank? Dann musst Du Dich damit befassen; und die o.g. Einführungen sollten helfen. Aber die Datenbank kann normalerweise nicht mit den normalen Klassen von NET aus erstellt werden; das geht über eine Benutzeroberfläche des betreffenden DBMS. (OK, es geht über DbCommands "Create Database" und "Create Table", aber nur über umständliche manuelle Befehle.) Oder eine Datenmenge nur im Arbeitsspeicher? Das sind DataSet/DataTable, aber die verstehen kein SQL. Allenfalls über LINQ ist etwas SQL-Ähnliches eingeführt worden.

Was soll "in ein proprietäres Format" bedeuten? Wenn es das externe Speichern in einem speziellen Format bedeutet, musst Du es manuell mit den File.Write-Methoden oder FileStream/StreamWriter u.a. erledigen. Wie die "interne" Vorarbeit am besten aussieht, kann man nur raten, wenn man das gewünschte Format besser kennt. Vorzugsweise ist auf StringBuilder.AppendFormat hinzuweisen (passende Überladung aussuchen!); aber es kommen auch viele andere Methoden und Klassen in Frage.

Auch CodeProject ist immer eine gute Adresse, wenn spezielle Verfahren oder Controls benötigt werden.

Ich hoffe, ich habe Dich nicht nur verwirrt, sondern auch einige Wege aus einer Sackgasse aufzeigen können. Jürgen
waldemar Threadstarter
Hält's aus hier
Beiträge: 6

Win XP (Home + Prof), Vista, Ubuntu 8.10, SuSE 10.3

BeitragVerfasst: Di 10.03.09 12:30 
Hallo Jürgen,

vielen dank für die schnelle Antwort. :D

Zitat:
In welchem Zusammenhang willst Du die Daten verarbeiten? Deine Stichworte SqlDataSource und HttpContext weisen auf eine ASP.NET-Anwendung (WebForms) hin, die Formulierung "native Anwendung" dagegen auf WinForms oder vielleicht WPF. Bitte kläre dies.


Also momentan ist es nur eine ASP.NET-Anwendung, allerdings wird später auch noch eine WinForms-Anwendung erstellt, d. h. die Datenquelle muss beides unterstützen.

Zitat:
Als Einführung in die DB-Verarbeitung unter NET kann ich vor allem auf OpenBook Visual C# Kap.25 ff. verweisen. Eine (sehr knappe und unvollständige) Einführung ist auch unter Datenbanken How-To zu finden.


Das klingt interessant werde ich mir mal genauer durchlesen

Zitat:
Was ist mit "eigener Datenquelle" gemeint, die "SQL-Befehle entgegennimmt"? Eine SQL-Datenbank? Dann musst Du Dich damit befassen; und die o.g. Einführungen sollten helfen. Aber die Datenbank kann normalerweise nicht mit den normalen Klassen von NET aus erstellt werden; das geht über eine Benutzeroberfläche des betreffenden DBMS. (OK, es geht über DbCommands "Create Database" und "Create Table", aber nur über umständliche manuelle Befehle.) Oder eine Datenmenge nur im Arbeitsspeicher? Das sind DataSet/DataTable, aber die verstehen kein SQL. Allenfalls über LINQ ist etwas SQL-Ähnliches eingeführt worden.

Was soll "in ein proprietäres Format" bedeuten? Wenn es das externe Speichern in einem speziellen Format bedeutet, musst Du es manuell mit den File.Write-Methoden oder FileStream/StreamWriter u.a. erledigen. Wie die "interne" Vorarbeit am besten aussieht, kann man nur raten, wenn man das gewünschte Format besser kennt. Vorzugsweise ist auf StringBuilder.AppendFormat hinzuweisen (passende Überladung aussuchen!); aber es kommen auch viele andere Methoden und Klassen in Frage.


Also das ist nicht so einfach zu erklären.
Man muss dazu das gesamte Szenario kennen. Die momentane Umgebung sieht folgendermaßen aus.
Es gibt eine SQL-Datenbank (Firebird), welche nicht direkt angesprochen werden kann, sondern nur über einen JavaServer, und einen WindowsClient geschrieben in Delphi, der mit dem Server kommuniziert.
Nun soll für diese Datenbank eine WebAnwendung erstellt werden, und außerdem wurde beschlossen in Zukunft jegliche Software in CSharp zu programmieren.
Darum wird temporär eine weitere Zwischenschicht eingeführt, die in der Zukunft den bestehenden Server ersetzt, aber momentan den bestehenden Server kontaktiert um Zugriff auf die Daten zu bekommen.
Um sich das Szenario besser vorstellen zu können hab sollte die angehängte Grafik helfen.

Grüße
Waldemar
Einloggen, um Attachments anzusehen!
waldemar Threadstarter
Hält's aus hier
Beiträge: 6

Win XP (Home + Prof), Vista, Ubuntu 8.10, SuSE 10.3

BeitragVerfasst: Mo 16.03.09 09:22 
Hat denn keiner eine Lösung?

Grüße
Waldemar
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 16.03.09 17:22 
Es gibt also den alten DB-Server mit einer proprietären Schnittstelle
und irgendwann einen neuen mit SQL?

Um mit beiden über SQL kommunizieren zu könne, bräuchtest du natürlich einen full-blown SQL-Parser - nicht gerade trivial. Ein IRepository Pattern bietet sich da viel eher an: Du hast beispielsweise ein ICustomerRepository-Interface mit einer Methode Customer[] GetAllCustomers();. Für beide Server hast du dann jeweils eine Implementation davon, die die Query im richtigen Format abschicken.

Wie stark ähnelt das andere Format denn SQL?

_________________
>λ=
waldemar Threadstarter
Hält's aus hier
Beiträge: 6

Win XP (Home + Prof), Vista, Ubuntu 8.10, SuSE 10.3

BeitragVerfasst: Di 17.03.09 09:41 
Hi Kha,

danke für deine Antwort.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt also den alten DB-Server mit einer proprietären Schnittstelle
und irgendwann einen neuen mit SQL?

Das ist richtig.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Um mit beiden über SQL kommunizieren zu könne, bräuchtest du natürlich einen full-blown SQL-Parser - nicht gerade trivial. Ein IRepository Pattern bietet sich da viel eher an: Du hast beispielsweise ein ICustomerRepository-Interface mit einer Methode Customer[] GetAllCustomers();. Für beide Server hast du dann jeweils eine Implementation davon, die die Query im richtigen Format abschicken.

Dabei habe ich aber das Problem das ich nicht weiß welche Methoden das Interface benötigt, da es ja beispielsweise direkt von einer Instanz von DataGridView benutzt werden soll.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Wie stark ähnelt das andere Format denn SQL?


Sehr wenig, mal davon abgesehen, in beiden Formaten Tabellen, Spalten und Werte vorkommen.

Grüße
Waldemar
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 17.03.09 14:58 
user profile iconwaldemar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Um mit beiden über SQL kommunizieren zu könne, bräuchtest du natürlich einen full-blown SQL-Parser - nicht gerade trivial. Ein IRepository Pattern bietet sich da viel eher an: Du hast beispielsweise ein ICustomerRepository-Interface mit einer Methode Customer[] GetAllCustomers();. Für beide Server hast du dann jeweils eine Implementation davon, die die Query im richtigen Format abschicken.

Dabei habe ich aber das Problem das ich nicht weiß welche Methoden das Interface benötigt, da es ja beispielsweise direkt von einer Instanz von DataGridView benutzt werden soll.
Ich kenne das Pattern eher aus dem Web-Bereich, aber es sollte auch mit Winforms funktionieren. Etwas dynamischere Methoden wären aber natürlich auch möglich:
ausblenden C#-Quelltext
1:
2:
3:
DataTable Get(string tableName);
void Update(DataTable table);
... // Speziellere Methoden
Also eine Variation von IDbDataAdapter. Und die Anbindung an den neuen Server würde dann eben auch den entsprechenden DataAdapter benutzen.

_________________
>λ=
waldemar Threadstarter
Hält's aus hier
Beiträge: 6

Win XP (Home + Prof), Vista, Ubuntu 8.10, SuSE 10.3

BeitragVerfasst: Di 17.03.09 16:35 
Vielen dank.

Ich werde mich damit mal beschäftigen und dann berichten wenn es mir gelungen ist.

Grüße
Waldemar