C# per Zufall Werte aus Datenbank auslesen

Mr Speicher

Neu angemeldet
Registriert
22 Dez. 2013
Beiträge
83
Hallo, ich habe angefangen mich mit C# auseinander zusetzen und bin noch relativ unerfahren auf dem Gebiet.
Vielleicht kann mir jemand Helfen folgendes Anliegen umzusetzen.

Situation ist folgende: Ich habe eine MS Access Datenbank, in ihr befindet sich eine Tabelle, die fünf Felder enthält mit Daten. Was ich bis jetzt hinbekommen habe in C#, ist der Zugriff auf die DB und die Ausgabe einer ganzen Zeile mit allen fünf Datenfeldern in der Kommandozeile und in einer extra erstellten Textdatei.

Wenn man das Programm jetzt ausführt wird natürlich immer die selbe Zeile aus der DB ausgelesen und angezeigt.
Was ich jetzt suche ist eine Möglichkeit das per Zufall eine Zeile in der DB ausgewählt und ausgegeben wird. Also jedes mal bei Programmaufruf eine andere Zeile ausgewählt und ausgegeben wird.

Code habe ich bisher folgenden:
[src=csharp]class Program
{
static void Main(string[] args)
{

OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB\TestDB.accdb");
con.Open();

string strSQL = "SELECT * FROM Tabelle1";

OleDbCommand cmd = new OleDbCommand(strSQL, con);
OleDbDataReader dr = cmd.ExecuteReader();

FileStream fw = new FileStream("Neue Textdatei.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fw);

dr.Read();

// Ausgeben der Datenfelder in
Console.WriteLine(dr[0].ToString());
Console.WriteLine(dr[1].ToString());
Console.WriteLine(dr[2].ToString());
Console.WriteLine(dr[3].ToString());
Console.WriteLine(dr[4].ToString());

// Schreiben der Datenfelder in die Textdatei
sw.WriteLine(dr[0]);
sw.WriteLine(dr[1]);
sw.WriteLine(dr[2]);
sw.WriteLine(dr[3]);
sw.WriteLine(dr[4]);
sw.WriteLine();
sw.Close();

dr.Close();
con.Close();

Console.ReadLine();
}
 
Gib den Datensätzen ID's, denn die sollten sie sowieso haben und dann kannst du das ganze viel effizienter und einfacher machen. Nämlich über Zufallszahlen aus C#.

Außerdem würde ich dringend davon abraten MSSql oder Access zu benutzen wenn du nicht aus historischen Gründen dazu gezwungen bist.
 
  • Thread Starter Thread Starter
  • #3
Ok, die Idee mit IDs hatte ich auch schon. Dann werde ich mal sehen das ich welche hinzufüge in Access.
Ich kenne mich mit Datenbanken nicht besonders aus. Warum würdest du von MSSql und Access abraten ?

Mir ist auch ein merkwürdiger Fehler aufgefallen. Das Programm so wie es da oben steht, ließt komischerweise nicht den ersten Wert aus der Tabelle aus. Das erste Feld ist alphabetisch geordnet und beginnt bei Aa, das Programm gibt aber den Wert der mit Ei anfängt aus.
 
bei der Lösung mit den IDs musst du beachten, dass du später nichts mehr löschen darfst.
 
  • Thread Starter Thread Starter
  • #5
Das wäre natürlich schlecht wenn ich aus der DB nichts mehr löschen kann. Gäbe es dann noch andere Möglichkeiten die Zufallsauwahl durchzuführen ?
 
Warum nichts mehr löschen?

Man muss sich nur ordentlich drum kümmern.

Worum gehts denn konkret, was willst du umsetzen?
Es gibt viele Möglichkeiten wie man trotzdem noch Datensätze löschen darf. Ein Ansatz wäre alle gelöschten ID's zu speichern und die zuerst wieder neu zu belegen bevor man was neues hinzufügt und bei der Auswahl kann man die dann ausnehmen.

Ohne ID's zu arbeiten bringt da deutlich mehr Probleme auf Dauer.
 
  • Thread Starter Thread Starter
  • #7
Also was ich Umsetzen will ist Primär das zufällige Auslesen von Daten aus der Datenbank mit C#.

Der Datensatz besteht aus besteht aus 5 Feldern, 6 Felder dann mit der eingefügten ID.
Ich dachte die DB sollte dann so aussehen: ID(Feld1) Wert1(Feld2) Wert2(Feld3) Wert3(Feld4) Wert4(Feld5) Wert5(Feld6).

In C# wird dann ein Zufallswert erstellt, der Zufallswert spiegelt die ID in der DB wieder. Und wenn die ID aufgerufen wird lassen sich die anderen Werte 1-5 aus der selben Zeile auslesen.

Es geht eigentlich nur um das Löschen von Daten aus der DB, ein einfügen neuer Daten wird es wohl nicht geben.
 
Also willst du nur spielen und machst dir trotzdem sorgen um ungelegte Eier?

So funktioniert das nicht, alles hat zumindest theoretische Probleme, es geht darum eben genau solche Entscheidungen zu treffen.
 
  • Thread Starter Thread Starter
  • #9
Die Entscheidung für eine ID muss dann ich dann wohl treffen, um die Umsetzung in c# weiterverfolgen zu können.

Momentan stehe ich aber vor einem neuen Problem, wenn in Access die ID eingefügen will, meckert er erst das die Größe des Abfrageergebnisse die maximal zulässige Größe einer Datenbank übersteigt.
 
Außerdem würde ich dringend davon abraten MSSql oder Access zu benutzen wenn du nicht aus historischen Gründen dazu gezwungen bist.

Ratschläge, ohne diese zu begründen, sind etwas unfair, oder? Zumal an einen Anfänger. (Nicht böse gemeint)

Aber ein guter Anlaß für einen eigenen Thread, meinst Du nicht? Welche DB ist momentan für was am besten geeignet?
Die wenigsten werden alle kennen und im professionellem Bereich wird man oft nicht gefragt, weil die DB entweder schon vorhanden ist oder zumindest festgelegt.
 
  • Thread Starter Thread Starter
  • #11
Habe es nun soweit hinbekommen mit ID in Access einfügen und auslesen der Daten aus der Datenbank in C# mit vorgegebener ID.

Die Frage ist nun, wie ich den Zufallswert aus der Variablen zufallsID in dem SQL-Befehl eingebaut bekomme.

[src=csharp]
// Zufalls ID generieren
Random roundID = new Random();
int zufallsID;
zufallsID = roundID.Next(1, 101);

.
.
.

// Test mit vorgegebener ID 50
string strSQL = "SELECT * FROM Tabelle1 where ID = 50";

[/src]
 
jo @KaPiTn vor allem hat auch Access durchaus eine Berechtigung auch wenn ich oft auch davon abraten würde.
Aber z.B. MSSQL ist meiner Meinung nach durchaus eine recht Leistungsfähige Enterprise-DB - das alles passt aber eigentlich nicht zum Thema.

@TS du kannst das auch ohne ID lösen.
Du machst zuerst einen "Select Count(*) From Tabelle1" und liest das einzig zurückgebene Feld aus >> Gesamtzahl an Zeilen.
Erzeugst dann wie du es schon gerade getan hast eine Zufallszahl.
Im nächsten Schritt führst du das dr.Read(); so oft aus die Zufallzahl. Der Rest kann so bleiben wie bisher.
 
Falls du drfuture's Lösung doch nicht folgen willst (sie ist aber sinnvoll), reicht es, wenn du deine Zufallszahl an den String anhängst, anstatt deine ID festzulegen. Für gewöhnlich sollte man möglichst alle SQL-Abfragen, in denen Variablen vorkommen, über Prepared Statements machen, ist in diesem Fall aber nicht unbedingt nötig.

[src=csharp]
// Zufalls ID generieren
Random roundID = new Random();
int zufallsID;
zufallsID = roundID.Next(1, 101);

// Test mit vorgegebener ID 50
string strSQL = "SELECT * FROM Tabelle1 where ID = " + zufallsID;

[/src]
 
  • Thread Starter Thread Starter
  • #14
@TS du kannst das auch ohne ID lösen.
Du machst zuerst einen "Select Count(*) From Tabelle1" und liest das einzig zurückgebene Feld aus >> Gesamtzahl an Zeilen.
Erzeugst dann wie du es schon gerade getan hast eine Zufallszahl.
Im nächsten Schritt führst du das dr.Read(); so oft aus die Zufallzahl. Der Rest kann so bleiben wie bisher.

Die Umsetzung werde ich mir nachher nochmal genauer ansehen.
Gibt es eine Möglichkeit die zufallsID mit in die SQL-Abfrage einzubauen ?

Edit: Ok, Danke GameChamp98. Das funktioniert dann schon mal.
 
Zuletzt bearbeitet:
OT: Für das DB Thema, habe ich mal eine eigenen Thread gemacht.
 
so würde es ohne IDs gehen. Aber in Access geht dies wohl nicht

Zuerst:
Du machst zuerst einen "Select Count(*) From Tabelle1" und liest das einzig zurückgebene Feld aus >> Gesamtzahl an Zeilen.

hier erhälst du z.B. 50

dann brauchst du eine Zufallszahl ( 0 bis 49 )

die Zufallszahl ist dann z.B. 22

und so holst du dir die 22 Zeile:
[src=mysql]SELECT * FROM tbl LIMIT offset, count

SELECT * FROM Tabelle1 LIMIT 22, 1
[/src]

in Access hollt man sich alle zeilen und muss bis zur 22 Zeile iterieren?
Im nächsten Schritt führst du das dr.Read(); so oft aus die Zufallzahl. Der Rest kann so bleiben wie bisher.
 
Zurück
Oben