Du hast da drei unabhängige Anweisungen, die nichts miteinander zu tun haben. Wenn, dann mußt du das schon alles in eine Anweisung packen:
select Bezeichnung from Teilestamm tsa
where Teilnr in (select Oberteilnr from TeileStruktur tsu);
(wobei, für die Abfrage hätte ich eher einen JOIN zwischen den Tabellen verwendet)
Kannst du wirklich garantieren, daß alle Zeilen der Tabelle den selben Wert in der Spalte "num" haben? Wenn ja, was für einen Sinn hat diese Spalte überhaupt?
Irgendeine .NET-Sprache. C# oder VB.Net.
Dann ein kleines und einfaches Klassenmodell für die Prüfungen bauen. Die Klassen als [Serializable] markieren und alles mit drei Zeilen Code in eine XML-Datei serialisieren und ebenso einfach wieder laden.
Schneller und einfacher geht's wohl nicht.
Server ist nur ein abstraktes Wort - auch dein eigener Rechner kann ein Datenbank-Server sein (einfach "127.0.0.1" bzw. "localhost" als Verbindungsadresse eingeben
Und die Unterschiede zwischen den verschiedenen Datenbanksystemen sind eher im Detail zu suchen, d.h. such dir die Datenbank aus, mit der du am besten klarkommst (einfache Installation, Administrationsprogramm, C++ Schnittstelle).
Du kannst ja erstmal mit SQLite anfangen (und wenn du dann auf einen "echten" Datenbankserver wechseln willst, dann z.B. PostgreSQL, MySQL oder auch MS SQL Server Express).
Du kannst auch dann gerne im C-Sharp-Forum nachfragen (da ich dort Moderator bin und häufiger lese als hier).
Oder natürlich im entsprechenden C#-Unterforum hier...
Mit Label meinst DU wohl ASPNET LABEL welches wieder eine bestimnmter HTML-Code ist.
Du musst eben aus MySQL einen Eintrag auslesen und den dann in den "Label" schreiben.
MySQL auslesen
LABEL.Text = "was aus MySQl kommt"
Mit INNER JOIN
SELECT
t.[id]
FROM (
SELECT DISTINCT [id]
FROM [tabellenname]
) AS t
INNER JOIN [tabellenname] AS t1
ON t1.[id] = t.[id] AND t1.[key] = 'farbe' AND t1.[value] = 'rot'
INNER JOIN [tabellenname] AS t2
ON t2.[id] = t.[id] AND t2.[key] = 'form' AND t2.[value] = 'eckig'
Das kann IDs doppelt liefern, wenn es z.B. 2x einen Eintrag "farbe = rot" mit der gleichen ID gibt.
Mit EXISTS
SELECT
DISTINCT t.[id]
FROM
[tabellenname] AS t
WHERE
EXISTS (
SELECT * FROM [tabellenname] AS t1
WHERE t1.[id] = t.[id] AND t1.[key] = 'farbe' AND t1.[value] = 'rot'
)
AND EXISTS (
SELECT * FROM [tabellenname] AS t2
WHERE t2.[id] = t.[id] AND t2.[key] = 'form' AND t2.[value] = 'eckig'
)
Das liefert garantiert keine IDs doppelt.
Hallo,
danke für die Links.
Jetzt habe ich es gelesen und ich muss sagen, es gefällt mir nicht.
Ständig diese wiederkehrenden Altlasten.
Mindestens genau so oft hab ich gelesen, daß man aus Performance-Gründen
OleDB gegenüber ODBC vorziehen soll, und nun das.
Werde weiter am Ball bleiben und recherchieren ob der Quark ernst
gemeint ist.
Hi.
(Ich halte die Erklärungen relativ kurz. Wer mit nHibernate vertraut ist wird das Problem sofort verstehen)
Außerhalb einer nHibernate-Session funktioniert LazyLoading nicht. Die Session will ich nicht offen halten (Winforms-Anwendung) und suche jetzt eine andere Lösung.
//Die Entitäten. Benutzer und Kommentare von diesem Benutzer z.B. in einem Forum (Fantasiecode).
//Es besteht eine one-to-many-Beziehung aus Sicht des Users.
public class User
{
public virtual int Id { get; set; }
public virtual string NickName { get; set; }
private ISet<Comment> comments = new HashedSet<Comment>();
public virtual ISet<Comment> Comments { get { return comments; } set { comments = value; } }
}
public class Comment
{
public virtual int Id { get; set; }
public virtual string Text {get; set;}
}
//////////////////////////////////////////////////////////////////////////////////////////
//Verwendung in der GUI
var list = userStorage.GetAll(); //Alle User laden.
foreach (User user in list)
{
Console.WriteLine(user.Nickname); //Klappt
Console.WriteLine(user.comments.Count); //LazyInitializationException
}
Das XML-Mapping ist trivial und erspare ich euch (LazyLoading ist default).
Die comments sollen "Lazy" geladen werden. Das geht aber schief weil nHibernate aus mir nicht ersichtlichen Gründen nicht
in der Lage ist, selbstständig eine neue Session zu öffnen.
Hier meine unschöne Lösung:
//Code für userStorage
public class GenericStorage<Entity> where Entity : class
{
public virtual void Lock(Entity entity, Action action)
{
using (ISession session = sessionFactory.OpenSession())
{
session.Lock(entity, NHibernate.LockMode.None);
action();
}
}
}
//Wieder in der GUI
var list = userStorage.GetAll();
foreach (User user in list)
{
Console.WriteLine(user.Nickname);
userStorage.Lock(user, () =>
{
Console.WriteLine(user.comments.Count);
}
}
Die Lösung ist also, die user-Objekte im "detached"-Zustand wieder explizit in den "persistent"-Zustand zu überführen.
Damit ziehen sich Implementierungsdetails der Datenschicht bis zur GUI durch!Das kann doch nicht die Lösung sein.
Hat jemand eine bessere Lösung? (Lazy-Loading ist erwünscht! Eine andere Fetching-Strategie bringt mir im Anwendungsfall nichts)
Danke, µ
Huhu,
das Datenbankformat ist auch recht komplex. Ich hatte das Problem in ein Beispiel umgewandelt. Die Datenbank stammt nicht von mir, sondern die nutzt eine ganze Industrie und da sind > 50GB Daten drinnen.
Aber danke für die Hilfe damit sollte ich weiter kommen, wegen den null werde ich es dann noch left bzw. right join mal versuchen.
Grunzy
Liegt evtl. daran, dass er dir auch noch die Table-Attribute als Zeile zurückliefert. line enthält dann die Anzahl der Zeilen, die du haben möchtest. Die erste Zeile besteht aber aus den Attributen!
Kenne mich mit SQLite ehrlich gesagt nicht sonderlich gut aus, aber ein kurzes Nachschlagen in der Referenz ließ diese Vermutung aufkommen.
Ist mir trotzdem nicht klar. Hast du jetzt die DB auf deinem USB-Stick geschrottet oder die DB auf dem Schulrechner?
Oder benutzt der Schulrechner auf magische Weise die DBs von deinem USB-Stick?