Laden...

[gelöst] Daten verdoppeln, verdreifachen etc. in SQL Abfrage

Erstellt von erdal25 vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.783 Views
E
erdal25 Themenstarter:in
17 Beiträge seit 2014
vor 10 Jahren
[gelöst] Daten verdoppeln, verdreifachen etc. in SQL Abfrage

Daten kommen aus ner mdb access db.

Folgendes, ich habe Datenbank dort sind mehrere Tabellen welche auch relationen etc. haben, diese hole ich mir mittels eines DataSet setze die relationen etc. klappt alles wunderbar.
Jetzt möchte ich folgendes:
Ich habe eine Tabelle "Customer", dort sind z.B. 100 Datensätze drin, nun habe ich eine Einstellung dort könnte man z.B. 200 eingeben (für Anzahl Datensätze).
Im CreateDataSet füll ich die Tabellen mittels nen DataAdapter->


DataTable table = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, restrictions);

            //D: Durch alle Tabellen iterieren und in das DataSet aufnehmen
            //US: Iterate all tabels and add them to the DataSet
            foreach (DataRow dr in table.Rows)
            {
                string tableName = dr["Table_Name"].ToString();
                OleDbDataAdapter dataAdapter;

                //D: Die "Orders" und "Order Details" Tabelle einschränken.
                //US: Limit the "Order" an "Order Details" table. 
                if (tableName == "Orders" || tableName == "Order Details")
                    dataAdapter = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM [" + tableName + "] WHERE OrderID > 11040", conn));
                else
                    dataAdapter = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM [" + tableName + "]", conn));

                dataAdapter.FillSchema(ds, SchemaType.Source, tableName);
                dataAdapter.Fill(ds, tableName);

            }



Es werden ja hier jetzt nur die 100 Datensätze geholt, wie kann ich es nun machen das die Anzahl der Datensätze abhängig von dem Wert in den Einstellungen ist.
Klar wenn <100 könnte ich ein Limit in die query eintragen..aber wie wenn mehr? (das Programm dient zur Anzeige von Beispieldatensätzen, daher kann es auch mal 1000 sein).

In einer anderen MDB (nur eine Tabelle) mache ich es über ein DataTable da geht es ohne Probleme->

 OleDbDataReader reader = cmd.ExecuteReader();
            dt.Load(reader);

            int anzahlRows = dt.Rows.Count;
            int anzahlRecords = Properties.Settings.Default.ARTKRECCOUNT - anzahlRows;
            int zaehler = 0;
            for (int i = 0; i < anzahlRecords; i++)
            {
                zaehler++;
                dt.ImportRow(dt.Rows[zaehler]);
                if (zaehler > anzahlRows)
                    zaehler = 0;
            }

Aber wie könnte ich es mittels einer SQL Abfrage lösen, geht das überhaupt..oder hat jemand noch ne Idee? Danke..

4.221 Beiträge seit 2005
vor 10 Jahren

Mein SQL ist zwar schon stark eingerostet... aber wäre das nicht "Select TOP 100 From ....."

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

1.029 Beiträge seit 2010
vor 10 Jahren

Hi,

nunja - grundsätzlich wirst du ohne ds.Fill(...) arbeiten müssen bzw. nach dem ds.Fill noch weiterarbeiten müssen - eigentlich nicht weiter kompliziert - wenngleich ich das mit dem Daten kopieren irgendwie komisch finde...

Würde es auf jeden Fall so in etwa lösen... (quick&dirty - und gugg mal, ob ds.EnforceConstraints nicht auch bei dir sinnvoll wäre - ich werd nämlich sofort mit Exceptions zugeworfen, sobald ich wild Datensätze hin und her kopiere - zu Recht^^)


OleDbDataAdapter dataAdapter;

dataAdapter = new OleDbDataAdapter(new OleDbCommand("SELECT TOP " + requestedRows + " * FROM [" + tableName + "]", conn));

dataAdapter.FillSchema(ds, SchemaType.Source, tableName);
dataAdapter.Fill(ds, tableName);

ds.EnforceConstraints = false;
if (ds.Tables[tableName].Rows.Count < requestedRows)
{
	DataTable dt = ds.Tables[tableName];
	if (dt.Rows.Count > 0) // only copy content from tables that have rows
	{
		int originalRows = dt.Rows.Count;
		int counter = 0;
		while (dt.Rows.Count < requestedRows)
		{
			dt.Rows.Add(dt.Rows[counter].ItemArray);
			counter++;
			if (counter > originalRows)
			{
				counter = 0;
			}
		}
	}
	else { } // maybe add some automatically generated content here?
}

LG

E
erdal25 Themenstarter:in
17 Beiträge seit 2014
vor 10 Jahren

Danke, der Ansatz war korrekt 😃 habe jetzt die Funktion welche ich für eine Tabelle verwende auch für den Durchlauf genommen.


ds.EnforceConstraints = false;
if (ds.Tables[tableName].Rows.Count < requestedRows)
{
    DataTable dt = ds.Tables[tableName];

Und dann die funktionen..
Kurze Frage noch, ist es relevant ob ich Rows.Add verwende oder ImportRow?

Danke

Zum Hintergrund:
Ich habe ein Beispielprogramm welches 100 Basisdatensätze hat, nun ist es so, dass man für manche Tests mehr als 100 benötigt..hierfür benötige ich das, da ich die Datenquelle nicht ändern möchte/kann.
Danke

1.029 Beiträge seit 2010
vor 10 Jahren

Hi,

du hast leider nicht die Methodenbeschreibungen gelesen?^^

ImportRow macht in deinem Zusammenhang keinen Sinn - oder interessieren dich Current- und OriginalValue einer DataRow, die du soeben persönlich aus der DB geholt hast wirklich?^^

LG