• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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();
}
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.826
Ort
Midgard
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.
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
bei der Lösung mit den IDs musst du beachten, dass du später nichts mehr löschen darfst.
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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 ?
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.826
Ort
Midgard
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.
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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.
 

alter_Bekannter

N.A.C.J.A.C.

Registriert
14 Juli 2013
Beiträge
4.826
Ort
Midgard
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.
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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.
 

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
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.
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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]
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.757
Ort
in der Zukunft
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.
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
@Mr Speicher: 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]
 

Mr Speicher

Neu angemeldet

Registriert
22 Dez. 2013
Beiträge
83
  • 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:

KaPiTN

♪♪♫ wild at heart ♪♫♫♪

Registriert
14 Juli 2013
Beiträge
29.138
OT: Für das DB Thema, habe ich mal eine eigenen Thread gemacht.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
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.
 
Oben