Laden...

Forenbeiträge von EvilTK Ingesamt 265 Beiträge

06.04.2006 - 16:23 Uhr

Antwort versuch zur 2. Frage.

Beide ComboBoxen verwenden den gleichen BindingContext. Der BindingContext hat intern einen Zeiger auf eine Row.

2 ComboBoxen 1 Zeiger funktioniert nicht.

Die einzige Lösung die ich gefunden habe, hab die 1. beste genommen gg, ist die DataTable die als DataSource für die ComboBoxen fungiert 2 mal zu erstelllen.
TABELLE und TABELLE_
Da die Tabelle höchstwahrscheinlich eine Stammtabelle ist, ist es unwahrscheinlich das sie geupdatet werden muss. Beide tabellen befüllen binden und es sollte funktioniert.

06.04.2006 - 16:14 Uhr

Hm, ich sollte mir mal den Post durchlesen ^^;; Ich hab den titel gelesen, mir die OnPaint methode angesehen und geantwortet.

*post les*

🤔 Also ich weis nicht.
Der Hauptteil kommt aus einem Tutorial. Aber wer fängt nicht mit einem Tutorial an?

> (Stichworte: Code wird von der Grafikkarte ausgeführt, ...
Hab ich nirgends gelesen.

> ... schwarzes Dreieck, Flickering)
Ich führe das eher auf learing by doing zurück. Er hat den tutorial code genommen und daran herumgespielt. Irgendwann kam ein flackerndes schwarzes dreieck heraus.

Wer aktiviert das licht ohne eine lichtquelle anzugeben? Nur die die es nicht wissen. Das extra Present kam wahrscheinlich dadurch zustande das er code rumkopiert hat.
Also ich nehme schon an das es sein code ist. (Ansonsten würd ich den tutorial schreiber verklagen 😁 )

> Es ist das bisher frechste Posting (einschliesslich unschuldig-ahnungslos tun), das ich hier seit meinem Einstieg gelesen habe.
Freches in seinem Posting konnt ich auch nicht erkennen ...
Außerdem, "Dabei seit: 11.03.2006", Wundert mich nicht das du noch nix erlebt hast 😁 (der war jetzt gemein 8))

@Blue_Dragon wenn du wieder on bist sag bescheid ob du es zum laufen gebracht hast.

06.04.2006 - 11:30 Uhr

Original von pmSyS
Gibt es aber nicht eine Möglichkeit in der alten DataTable alle Rows als "verändert" zu markieren?

Ja.
row.BeginEdit();
row.EndEdit();
Aber was bringt es dir wenn die Rows "Modified" sind? Bei einem Modiefied wird ein UPDATE ausgeführt. Was du willst ist ein INSERT, die rows brauchen also den State Added.

Die Lösung des ganzen ist ganz einfach und wurde von boco25 schon genannt. AccepChangesDuringFill.


EZDaten.AcceptChangesDuringFill = false;
EZDaten.Fill(ds.TABELLE); //Alle Rows die in das DataSet hinzugefügt wruden haben den State Added, da kein AcceptChanges aufgerufen wurde.

dbEZ.Update(ds.TABELLE); //Da alle rows ADDED sind, wird ein INSERT aufgerufen.

06.04.2006 - 11:23 Uhr

Original von nop

  1. Code selber erst mal lesen. (Nicht nur was das "schwarze Dreieck" betrifft.)

Stimm ich zu.
Wenn du dir deinen code genau durchliest (OnPaint) dann solltest den Fehler von alleine finden.

Original von nop
3. Forumsuche benutzen.

Und nach was soll er suchen? Das ist ein mini fehler, den wird man in keinem Forum finden, IMHO.

Dein Code macht folgendes.

Clear - Blue
Present
Draw Triangle
Present

Clear - Blue
Present
Draw Triangle
Present

Ich hoffe es ist dir jetzt klar welche Zeile du entfernen musst damit das flickern aufhört.

04.04.2006 - 17:07 Uhr

Sollte eigentlich funktionieren 🤔

04.04.2006 - 16:47 Uhr

Zitat aus der MSDN - ExecuteScalar.

Return Value
The first column of the first row in the result set, or a null reference if the result set is empty.

Dein SELECT gibt dir eine 0 zurück.
Habs selbst ausprobiert, ich bekomm ein null zurück wenn das SELECT keine zeile zurückliefert.

04.04.2006 - 16:37 Uhr

ExecuteScalar liefert den Wert aus der 1. Spalte/Zeile zurück. Wird keine zeile zurück gegeben bekommst du ein null.
Explizit abfragen ob du ein null zurückbekommen hast und wenn ja, error handling betreiben.

04.04.2006 - 16:32 Uhr

Der Vorschlag von herbivore ist verständlich und einfach umzusetzen.

Wahrscheinlich hilft etwas Code 😉


public class MyListView : ListView
{
	private bool FireSelectedIndexChangedEvent = true;

	protected override void OnSelectedIndexChanged( EventArgs e )
	{
		if( FireSelectedIndexChangedEvent )
		{
			base.OnSelectedIndexChanged( e );
		}
	}
	private void MyView_KeyDown( object sender, KeyEventArgs e )
	{
		if( e.KeyCode == Keys.A && e.Control )                // If Shift + A is pressed
		{
			FireSelectedIndexChangedEvent = false;
			foreach( ListViewItem item in this.Items )        // then select all items.
				item.Selected = true;
			FireSelectedIndexChangedEvent = true;
		}
	}
}


04.04.2006 - 16:11 Uhr

Alles so wie es sein soll.

Der 1. SplitContainer wird "splitContainer1" benannt. Ich benenn ihn um auf "abc". Ich ziehe nun einen 2. SpliterContainer in ein Panel vom 1. Container. Er bennent den 2. SplitContainer "splitContainer1" (der name ist ja frei).

... Ein sache passt nicht, laut designer haben beide splitContainer als Panel "splitContainer1.Panel1" und "splitContainer1.Panel2". (Nachdem man die Form neulädt (schließen,öffnen) stimmen die namen)

Nichts ungewöhnliches. 🤔

04.04.2006 - 16:02 Uhr

Erstell dir eine TabControl per Designer zieh dir ein paar componenten in die TabPages. Danach schaust du dir den Code an den Visual Studio erstellt hat (InitializeComponent).

So sollte es funktionieren.


//TabPage erstellen
pages[i] = new TabPage();
pages[i].Text = "Gruppe " + i;

//TextBox erstellen
TextBox tb = new TextBox();
tb.Location = new Point( 10, 10 );
tb.Size = new Size( 100, 20 );
tb.Name = "TextBox" + i;

//TextBox zur TagPage hinzufügen
pages[i].Controls.Add( tb );

//TagPage zum TabControl hinzufügen
tabControl1.TabPages.Add( pages[i] );

PS: Die OutOfRange exception hättest auch debuggen können.

04.04.2006 - 15:49 Uhr

Die Variablen bezeichnung des SplitContainers kannst du nach belieben ändern. Die Panels in einem SplitContainer nicht. Die müssen Panel1 und Panel2 heißen.
Zumindest hab ich noch keinen weg gefunden die Panels umzubennenen.

04.04.2006 - 13:17 Uhr

Lösung wurde bereits von frisch genannt. Wurde wahrscheinlich überlesen.


//wirst früher oder später brauchen. EndCurrentEdit sagt den Datengebunden Steuerelementen "schreibt euren Wert in die aktuelle DataTable Zeile".
((CurrencyManager)BindingContext[ DataSet, "Tabellenname" ]).EndCurrentEdit(); 
//Speichert die Änderungen die an der DataTable vorgenommen wurden in die Datenbank.
sqlDataAdapter.Update( DataSet.Tables[Tabellenname] );

04.04.2006 - 10:55 Uhr

static void Main()
{
    Form1 frm = new Form1();
    try
    {
        frm.ProgStart(); //ProgStart muss natürlich public sein
        Application.Run(frm);
    }
    catch
    {
    }
}

Gibt es einen bestimmten grund wieso diese Lösung nicht vorgeschlagen wurde?
Was mir bei euren Lösungsvorschlägen nicht gefällt ist das ihr das Objekt während dem Konstruieren bereits wieder zerstört.

27.03.2006 - 18:02 Uhr

Datei im Solution Explorer selektieren.
File - Source Control - "Exclude File {datei} from Source Control".

16.03.2006 - 15:57 Uhr

Mach mal Taskmanager auf und schau unter Systemleistung wie dein ram zu neige geht während deine applikation läuft.
Du allokierst in jedem schleifen durchgang einmal das gesamte bild und gibst den Speicher nie wieder frei, irgenwann ist halt schluss.
Wenn es kein speicher problem ist, bin ich für den moment überfragt.

Wenn ich also beispielweise Rot (#FF0000) Transparent machen möchte, müsste ich was machen?

Ich mach das etwas "umständlich", keine ahnung ob das so korrekt ist. Es funktioniert und das reicht mir als hobby programmierer.


Color color = Color.Red;

System.Drawing.Bitmap bmp = new System.Drawing.Bitmap( ".\\test.bmp" );
bmp.MakeTransparent( color );

Sprite s = new Sprite( m_Device );
s.Begin( SpriteFlags.AlphaBlend ); //WICHTIG
s.Draw( new Texture( m_Device, bmp, Usage.None, Pool.Managed), //Texture muss nun anders geladen werden
Rectangle.Empty,
Vector3.Empty,
Vector3.Empty,
Color.White );
s.End();

08.03.2006 - 15:33 Uhr

e.Item.DataSetIndex
Hab gerade kein WebProjekt zur hand um es zu testen, aber das hört sich doch schonmal sehr viel versprechend an.

02.03.2006 - 21:09 Uhr

Ich hab keine ahnung.
Deshalb rate ich mal und sage user ist ein schlüsselwort und kann deshalb nicht verwendet werden. Tabelle umbennen oder zuerst mal mit [user] versuchen.

02.03.2006 - 17:50 Uhr

Liegt die Datenbank auf einem remote rechner und wenn ja erlaubt diese einen remote login?

02.03.2006 - 17:44 Uhr

Zuerst, wenn value = null ist kommt es immer zu einer NullReferenzException.

Ich hab das nachgebaut und bei mir funktioniert es ohne probleme. Abgesehen von der null exception.

google mal nach IExtender, ist ein mechanismus der so etwas ähnliches macht wie du es willst, vielleicht funktioniert es damit genauso/besser.

02.03.2006 - 17:25 Uhr

Entwender den CommandBuilder zum laufen bringen, aka der Tabelle in der Oracle Datenbank einen Primarschlüssel geben.
Oder das Updaten manuell machen, ohne DatenAdapter und ohne CommandBuilder.
Beim manuellen updaten ist zu beachten dass das DataSet davon nichts mitbekommt und somit alle DataRows ihren Modified state behalten.

OracleCommand instanzieren CommandText zuweisen und befehl ausführen.


OracleCommand cmd = new OracleCommand();
cmd.Connection = _oracleConnection;
cmd.CommandText = "UPDATE IMPORT SET ROW = ROW("+this._archiv+", "+this._vol_nr+", "+this._max_size_kb+", "+this._akt_size_kb+", "+this._akt_size_carry+", "+this._location+", "+this._last_dir+", "+this._next_file+")WHERE ARCHIV= "+this._archiv;
cmd.ExecuteNonQuery();

02.03.2006 - 15:13 Uhr

Wir reden von dieser Exception, oder?

'Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.data.oracleclient.dll aufgetreten.
Zusätzliche Informationen: Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.'

Nun, die ist doch schon sehr aussage kräftig.
In der Tabelle, die im SELECT angegeben wurde, konnte keine PrimaryKey spalte gefunden werden. Und ohne PrimaryKey kann der CommandBuilder nichts machen.

SELECT ID,NAME FROM TEST001 = PK gefunden
SELECT NAME FROM TEST001 = kein PK gefunden

[EDIT] Ich glaube der CommandBuilder schaut nicht in der DataTable (kann er gar nicht, er hat keinen verweis auf ein DataTable objekt) sondern direkt in der Datenbank nach.

02.03.2006 - 14:48 Uhr

@turndevil
Im PlayFrom instanzierst du das Audio objekt und rufst Play auf.
Wenn du das Lied stoppen willst musst du auf der gleichen Instanz Stop() aufrufen, da die instanz nach dem aufruf von PlayFrom( .. ) verloren geht ist das nicht möglich.
Lösung: Du musst dir die Audio Instanz merken.

@Gromminger
Die foreach Schleife sieht richtig aus. Ich glaub du bist im falschen Event (SelectedIndexChanged).
Versuch mal zu test zwecken das ganze über einen ButtonClick zu starten.

02.03.2006 - 14:40 Uhr

Ah sorry für die falsche anschuldigung, muss ich mich gleich schlau machen.

Der Code sieht richtig aus.
Wird beim zuweisen von ItemArray der RowState auf modified gesetzt? Wenn nicht macht der DataAdapter auch nix 🙂

Um den RowState auf Modifized zu setzen siehe Code.


//.NET 1.1
dr.BeginEdit();
dr.EndEdit();
//.NET 2.0
dr.SetModified();

Was auch noch eine möglichkeit ist, verwende direkt die DataRow und nicht ItemArray. So mach ich es zumindest.

02.03.2006 - 14:35 Uhr

Die CurrentRow bekommst du über das CurrentCell Property.
Über den Indexer kannst du dann die Werte aus der Grid auslesen.

Ich hätte variablen statt zahlen verwenden sollen.
object valueInGrid = dataGrid[ row, column ];

02.03.2006 - 14:10 Uhr

so?


DataGrid dg = ...;
int blub = (int)dg[ 4, 3 ];

02.03.2006 - 14:07 Uhr

Wenn du dir dein eigenes UPDATE Command schreibst (das falsch ist s.h. FerryG) wozu soll der CommandBuilder ein 2. erzeugen?

Am besten in der MSDN nach Sql|OleDbCommandBuilder suchen und nachschlagen wie die Klassen funktionieren.

01.03.2006 - 19:02 Uhr

ToString() funktioniert immer außer das objekt ist null.
Ob es sinn macht bei einer string variable ToString() aufzurufen ist jedem selbst überlassen.


string name = (string)ds.Tables[ 5 ].Rows[ 0 ][ "Name" ];

01.03.2006 - 18:58 Uhr

Am besten debuggst du zeile für zeile und schaust warum welcher code nicht ausgeführt wird. Vielleicht geht dir dann ein licht auf.

Zu bemerkung ist auch noch das das Property "DesignMode" im konstruktor immer false ist. Der Wert wird erst nach dem Instanzieren verändert.

01.03.2006 - 18:48 Uhr

Ich hab mich mal an einem PocketPC Projekt versuchst. Braucht der Debugger immer 10 min zum starten 8o

Verwendet hab ich Visual Studio 2005.
Hab mit dem Server Explorer eine Connection erstellt. Datenbank datei hab ich nach c:\temp\MyDatabase.sdf erstellen lassen. Das Studio hat darauf gefragt ob ich die SDF Datei zum projekt hinzufügen will, ja, why not? (hat sich als richtig herausgestellt)
Die Datei wird nun beim build ins ausgabeverzeichnis sprich PocketPC kopiert.
Zur laufzeit wird dann folgender pfad generiert: "Data Source =\Program Files\DeviceApplication1\MyDatabase.sdf;"
Ich habs gewusst, es gibt kein c:\ am pocketpc.


//Dieser code wird vom Studio erzeugt
_connection.ConnectionString = ("Data Source =" +  (System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) +"\\MyDatabase.sdf;"));

Um auf deinen 1. Post zurückzukommen, der Pfad zur Datenbank datei stimmt nicht. Die Datenbank datei liegt lokal auf deinem Developer rechner, wie soll der PocketPC dorthin zugreifen?
Wie dieser pfad nun lautet musst du selbst rausfinden ^^;;
Für diese erkenntnis haben wir mehrere tage gebraucht seufz

26.02.2006 - 16:12 Uhr

Man kann dir nur schwer helfen wenn man keine infos bekommt.
Wir haben einen richtigen (vs) und einen falschen (deinen) ConnectionString. Den falschen so ändern das er aussieht wie der richtige.
Ich würd dir das ja gerne abnehmen (den ConnectionString korrigieren) aber dazu muss ich die 2 mal sehen (am besten die ganze zuweisung kopieren).

PS: Was mich sowieso stört, PocketPCs haben doch kein richtiges filesystem. Bist du dir sicher das der pfad c:* lautet?

25.02.2006 - 18:26 Uhr

Also bei mir funktioniert eine OleDbConnection genauso. (VS2003/VS2005)
Mein ConnectionString: "Integrated Security=SSPI;Data Source="PCEVILTK\SQLEXPRESS";Initial Catalog=TEST001;Provider="SQLOLEDB.1";"

Data Source=(lokal);
(lokal) (local) und local funktionieren bei mir nicht, ich muss explizit den computernamen angeben wo der SQLServer läuft.
Database=MeineDB;
Ich wusste gar nicht das es das schlüsselwort gibt, Initial Catalog gibt normalerweise die datebank an.

25.02.2006 - 18:11 Uhr

versuch mal Data Source=(local)
Dann wär ne exception ganz praktisch.

Und der catch is auch nicht so sauber, du verlierst nämlich den stacktrace dadurch, schreib lieber throw e; <-- falls das totaler quatsch ist bitte berichtigen.

25.02.2006 - 18:05 Uhr

puh, dein post ist heute noch genauso schwer zu verstehen wie gestern ^^;; (sorry)

Ist mit "Projektliste" der Tab "Projects" unter "Add Reference" gemeint?

Da ich in den Buildeinstellungen jedes Projektes direkt auf das Zielverzeichnis verweise.

Ich nehme an du meinst den "Output Path" (default: bin\debug)?

25.02.2006 - 17:58 Uhr

Dieser SQL 2005 Mobile Server ist ganz schön abgespeckt naja.
Kann ich die 2 ConnectionStrings sehen?

Die Sprache des Studios ist egal.

24.02.2006 - 19:57 Uhr

Wahrscheinlich stimmt der ConnectionString nicht, zusätzlich könnten die csharp tags gepfuscht haben.

  1. Anführungszeichen am anfang und am ende vom pfad vergessen.
    @"Data Source = 'C:\Dokumente und Einstellungen\Stefan Biegler\Eigene Dateien\test.sdf';"

  2. Datenbank vergessen anzugeben
    Initial Catalog=DatenbankName <-- bei dieser sdf datei bin ich mir nicht sicher ob darin mehrere datenbanken sein können, und ob das jetzt wirklich gebraucht wird. Laut fehlermeldung zumindest schon.

  3. Welche secuirty soll verwendet werden (windows authentication oder sql authentication)

Da ich noch nie mit einem Pocket gerät in berührung gekommen bin, kann ich dir keine garantie geben.

24.02.2006 - 19:23 Uhr

Rechte maustaste auf die Form, "Open With" -> "C-Sharp Code Editor" auswählen -> "Set Default", fertig.
Jetzt wird bei einem doppelklick auf eine Form Datei der Code Editor geöffnet, der Designer kann nur noch per "View Designer" geöffnet werden.

24.02.2006 - 19:19 Uhr

Laut Profil bist du weiblich, und Markus ist im normalfall ein männlicher name 😁

24.02.2006 - 19:15 Uhr

Ich hab eine Projektmappe mit 45 Projekten, so ziemlich jedes projekt verweist auf auf ein anderes und das wieder auf eines. Eine richtig schöner haufen wo sich keiner mehr auskennt.
Naja, ich hab diese Probleme nicht (mehr). Die projektemappe kompiliert ohne fehler durch.

Fragt lieber nicht wie diese Projektmappe entstanden ist, da war ein dau am werk und ich darfs richten X(

@cadi, AlfameisterT Wie referenziert ihr auf eine andere ProjektDLL? Add Reference -> Browse?

24.02.2006 - 18:42 Uhr

Hört sich ganz so an als würdest du die referenzen falsch setzen.
Lösch alle referenzen in allen projekten die sich auf ein anderes projekt beziehen. (geiler satz 😁 )
Beim hinzufügen der Referenzen bitte den Tab "Projekt"|"Project" verwenden. Dann solltest ohne probleme kompilieren können.

23.02.2006 - 15:56 Uhr

Ganz einfach, Form oder Component erstellen, toolbox aufmachen und unter der Kategorie Data, einen (Odbc|OleDb|Sql|Oracle)DataAdapter auf die Form ziehen. Rechte maustaste - "Konfigurieren".
Dieser wizard erstellt automatisch eine Connection und alle benötigten Commands, SELECT, INSERT, UPDATE, DELETE.

Parallelitätsverletzung, hm, ich versuchs zu erklären. Im erklären bin ich nicht gut ^^.
Wenn sich zwischen dem Fill und dem Update eine zeile ändert (an der datenbank) und du versuchst diese zeile zu aktualisieren bekommst du einen Parallelitätsverletzung. Besonders lästig in multiuser anwendungen.

23.02.2006 - 15:43 Uhr

Auf gut glück, versuch mal den code.


me.Text += (char)e.KeyValue;

[EDIT] Ah gut, weitere infos.


int val = e.KeyValue;

if( val == 29 )
{
	me.Text += "1D";
}
else
{
	me.Text += (char)val;
}

So besser?

23.02.2006 - 15:03 Uhr

Zuerst, der CommandBuilder verursacht keinen Fehler.
Und dann, ja, genau der bug den ich beschrieben hab.

Die Expression auf null bzw. string.Empty zu setzen sollte funktionieren, wieso eine Parallelitätsverletzung kommt versteh ich nicht.
Naja, die kann man ja umgehen, und zwar wenn du dir selbst die befehle schreibst.
Oder du verwendest den DatenAdapter Wizard, dort kann man unter den erweiterten optionen die "concurrency" (hab gerade kein deutsches visual studio zurhand) auschalten. Wenn die deaktiviert sind, kann keine Parallelitätsverletzung mehr entstehen.

23.02.2006 - 13:20 Uhr

Hast du in deiner DataTable eine spalte mit einer Expression?

Wenn ja, vergiss es, ist ein Bug im .NET Framework (1.*) der gemeldet und von microsoft bestätigt wurde.
Wenn eine Expression-Spalte in der DataTable ist kann diese Tabelle nicht per einen DatenAdapter geupdatet werden.
Ich weis nicht ob dieser Bug im 2.0 noch vorhanden ist (muss ich mal testen).
Und links zu diesem Bug hab ich auch nicht mehr, ist ein halbes jahr her, sorry.

Wenn das nicht der fall ist, brauch ich mehr infos 😁
SELECT Kommando wär interessant. Und wo genau der Fehler auftritt (code).

22.02.2006 - 17:41 Uhr

Willst du das Bild während der Run oder Developmenttime hinzufügen?

22.02.2006 - 17:34 Uhr

Ich verwende andere Variablenbezeichnungen aber ansonsten sieht er genauso aus 🙂


//am besten legst du dir ein OleDbConnection objekt an.
OleDbDataAdapter daUpdate = new OleDbDataAdapter( "SELECT * FROM Mitarbeiter", "connnection" );
OleDbCommandBuilder CB = new OleDbCommandBuilder( daUpdate );
daUpdate.Update( DS.Tables[0]) ;
//DS.AcceptChanges(); brauchst du nicht, Update( ... ) ruft automatisch ein AcceptChanges auf.

22.02.2006 - 17:15 Uhr

Original von Ishildur
Oder muss ich vielleicht für jede Tabelle im DataSet ein eigener SqlDataAdapter haben? Ich blicke da irgendwie überhaupt nicht mehr durch! X(

Korrekt, jede Tabelle bekommt einen eigenen DatenAdapter.

Wenn Beziehungen im spiel sind aufpassen das in der richtigen reihenfolge geladen wird -> Parents zuerst.
Und beim update wirds ganz lustig.
INSERT: Parent zuerst dann child.
DELETE: Child zuerst dann Parent.
UPDATE: egal.

22.02.2006 - 16:49 Uhr

🤔 Welchen datentyp gibt ExecuteScalar zurück? (und sag jetzt nicht object 😁 )
Dann könntest ein bischen performance gut machen mit casten.

22.02.2006 - 16:47 Uhr

Soundfiles abspielen -> Forumsuche, hatten wir bereits ein paar mal.

.NET 1.1:


[DllImport("kernel32.dll")]
public static extern bool Beep(int frequency, int duration);

Beep( 440, 500 );

.NET 2.0: (zur vollständigkeit)


System.Media.SystemSounds.Beep.Play();

22.02.2006 - 16:26 Uhr

Originial von MSDN
Return Value
The first column of the first row in the result set, or a null reference if the result set is empty.

Da wir nur eine zeile mit einer column zurückbekommen stimmt das.

Ich nehme an die funktion MAX() liefert ein null zurück (InvalidCastException) weil noch keine Zeilen in der Tabelle sind.