MS SQL Server Management Studio 2012 Reihenfolge von Daten festlegen

DanielW

Benutzer
Beiträge
11
Hallo Liebe Community,

ich hoffe ich bin an der Richtigen Stelle gelandet.
Ich möchte die Reihenfolge meiner Datensätze ändern.

Ich habe eine Tabelle mit 2 Spalten. KundenNr. und Kunde
KundenNr. ist der Primärschlüssel nachdem auch geordnet wird.
Ich hätte es aber gerne, dass die Datenbank meine Daten nach dem Namen ordnet.

Wie ich mir die Daten in gewünschter Reihenfolge anzeigen lassen kann, ist mir klar. Aber die liegen dann ja so nicht im Speicher.

Auf meine Datenbank greift ein c# Programm zu. Dies zeigt mir in einer Combo-box alle möglichen Kunden an. Da diese dort geordnet auftauchen sollen, versuche ich aktuell die Daten in meiner Datenbank nach dem Namen geordnet zu speichern.

Ich hoffe ich konnte mein Problem verständlich schildern und hoffe auch, das Ihr mir helfen könnt.

Ich danke im Voraus

Daniel
 
Werbung:
Die Combobox die die Einträge aufruft muss das ebenfalls mit ORDER BY tun.

Unter keinen Umständen wirst du die Datenbank dazu bewegen können, die Einträge nach einer Sortierung abzulegen und zu verwalten. Dann kannst du dir auch direkt wieder Karteikarten dahin legen, das wird schneller sein.
 
Die interne Sortierung der Daten kann Dir völlig egal sein. Wenn die nach Namen sortiert sind, dann hänge an das Select ein ORDER BY name an, that's all.

Wenn ich in meiner DB eine Abfrage mache, die so aussieht:

Select *
From Tabelle
Order By Name ASC

dann zeigt der mir nur die Daten einmalig in der Reihenfolge an. Wenn dann ein zweites Programm kommt, und sich die Daten holt, sind die wieder ungeordnet. Und das soll so nicht sein. Ich dachte am einfachsten wäre es, wenn ich einfach die DB Sortierung umändere.
Muss es aber scheinbar wie Ukulele beschrieben hat machen.
 
Wenn ich in meiner DB eine Abfrage mache, die so aussieht:

Select *
From Tabelle
Order By Name ASC

dann zeigt der mir nur die Daten einmalig in der Reihenfolge an. Wenn dann ein zweites Programm kommt, und sich die Daten holt, sind die wieder ungeordnet. Und das soll so nicht sein. Ich dachte am einfachsten wäre es, wenn ich einfach die DB Sortierung umändere.
Muss es aber scheinbar wie Ukulele beschrieben hat machen.

Noch einmal: der Datenbank steht es vollkommen frei, wie die Daten physisch abgelegt sind. Diese Reichenfolge entspricht oft der, wie die Daten kommen, aber, um mal es bei PostgreSQL zu erklären: wenn ein Record geändert wird (UPDATE) dann bleibt der alte Record bestehen und ein neuer Record wird hinten angehangen (vereinfacht gesagt, es ist komplizierter). Oder Du machst einen JOIN über mehrere Tabellen: da steht es der DB frei, wie dieser erfolgt. Das kann z.B. über einen Hash erfolgen -> du hast eine absolut unsortierte Menge. Oder, wieder PostgreSQL: du hast 2 Abfragen auf die selbe Tabelle, die sehr groß ist (100 Millionen Zeilen). Die erste Abfrage läuft und hat die ersten 1 Million schon gelesen. Nun starten die zweite, gleiche Abfrage. PostgreSQL optimiert jetzt: beide Clients bekommen denselben 'Stream' geliefert, also Client 2 bekommt die Daten ab dem 1 Million-sten Datensatz zuerst geliefert und erst nach dem 100 Millionsten dann noch von 1 bis 1 Million 'nachgereicht'.

(Dinge wie CLUSTER http://www.postgresql.org/docs/9.4/static/sql-cluster.html lasse ich jetzt mal außen vor)


Fazit: willst Du eine Sortierung, dann sortiere. ORDER BY ist und bleibt Dein Freund.
 
ok, soweit so gut.
Dann stellt sich mir gerade die Frage, wie ich sortieren soll, denn wenn ich in c# versuche zu sortieren, sagt er mir folgendes:

"Eine ComboBox mit festgelegter DataSource kann nicht sortiert werden. Sortieren Sie die Daten mit dem zugrunde liegenden Datenmodell."
sortieren nicht möglich.JPG
 
Den Code für einen Button der deine ComboBox befüllt:
Code:
void BtnFillClick(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
          
            using(SqlConnection Con = new SqlConnection("ConnectionString"))
            {
                using(SqlDataAdapter sqldta = new SqlDataAdapter("deine_Daten_Procedure", Con))
                {
                    sqldta.SelectCommand.CommandType = CommandType.StoredProcedure;
                  
                    sqldta.Fill(dt);
                  
                    cbxTestbox.DataSource = dt;
                    cbxTestbox.DisplayMember = "Kunde";
                    cbxTestbox.ValueMember = "KundenNr";
                }
            }
        }
Der Code für die SP "deine_Daten_Procedure":
(War das so? Ich glaube zumindest das ist richtig... :D )
Code:
Create Procedure deine_Daten_Procedure As
Begin
   Select KundenNr
         ,Kunde
   From Kunden
   Order By Kunde Asc
End

Mehr braucht es nicht um sich die Daten zu sortieren :)
 
Schickst Du da ein SQL an die DB?

Was meinst du ?
Ich wollte die sorted Eigenschaft auf true setzten
ich habe gesagt "this.dataGridViewTextBoxColumn2.Sorted = true;"


Distrilec, die combobox hab ich etwas anders erstellt :D:D
recht klick auf meine Tabelle, dann spalten bearbeiten, dann die Spalte ausgesucht, und den Typ geändert.

zu der SQL abfrage: Wenn ich das mache, zeigt SQL mir die Daten sortiert an, sie liegen aber nicht in der DB sortiert.
Schließe ich das Fenster, wo mir dir Daten angezeigt werden, und lasse mir dann erneut die Daten anzeigen, sind sie wieder "Unsortiert".
Wie Sie in der DB liegen ist mir ansich egal. Die dienen nur zur Weiterverarbeitung.
Wichtig ist, wie mein c# Programm mir diese anzeigt.
 
Was meinst du ?
Ich wollte die sorted Eigenschaft auf true setzten
ich habe gesagt "this.dataGridViewTextBoxColumn2.Sorted = true;"


Distrilec, die combobox hab ich etwas anders erstellt :D:D
recht klick auf meine Tabelle, dann spalten bearbeiten, dann die Spalte ausgesucht, und den Typ geändert.
Ehm... Was ? Du sprichst von einer ComboBox (die du "etwas anders" erstellt hast) und direkt davor willst du eine GridView sortieren?.... Also worum geht es hier jetzt?
zu der SQL abfrage: Wenn ich das mache, zeigt SQL mir die Daten sortiert an, sie liegen aber nicht in der DB sortiert.
Schließe ich das Fenster, wo mir dir Daten angezeigt werden, und lasse mir dann erneut die Daten anzeigen, sind sie wieder "Unsortiert".

Tut mir leid... Aber ich verstehe überhaupt nicht was du eigentlich willst.
Deine Frage ist einfach beantwortet: Ein Order By wird immer sortieren PUNKT, AUS, ENDE... Wenn deine Daten unsortiert ankommen liegt es nicht an der Datenbank... Und trotzdem drehst du dich immer wieder im Kreis und fängst damit an "aber in der DB"...

Wie du am Ende ganz schön gesagt hast...
Wie Sie in der DB liegen ist mir ansich egal. Die dienen nur zur Weiterverarbeitung.
Wichtig ist, wie mein c# Programm mir diese anzeigt.
Es ist kein Datenbank-Thema sondern dreht sich 100% um C#... Richtige Feststellung, oder? :)
 
Ein Order By zeigt mir die Daten sortiert an, und ändert nicht die Reihenfolge wie sie gespeichert werden, oder lieg ich da falsch ?
Das ist meine erste Datenbankanwendung und daher tue ich mir noch relativ schwer mit all den Begrifflichkeiten etc.
Ich erkläre mal was ich gemacht habe...

Ich habe zwei Tabellen in der selben DB
1. Tabelle mit 7 Spalten
2. Tabelle mit 2 Spalten

1. Windows Form Projekt erstellt
2. eine Datenquelle angebunden (über Projekt, Datenquelle hinzufügen)
3. per Drag and Drop die gewünschte Tabelle in meine Windows Form gezogen (Tabelle 1)
----------------------------------------------------
beim ausführen meines Programms, bekomme ich jetzt die Daten angezeigt, die in Tabelle 1 Liegen.
Feld Nummer 2 soll aus Tabelle 2 befüllt werden. Die zweite Spalte aus Tabelle 2 soll mir in dem Feld angezeigt werden und die erste Spalte soll in Tabelle 1 in Feld 2 gespeichert werden.
Deshalb hab ich hier eine ComboBox erstellt. (Über Rechtsklick auf meine Tabelle, Spalten Bearbeiten und dort die Eigenschaft auf Combobox gestellt.)
Tabelle 2 hat wie erwähnt 2 Spalten. Die, die Intern Gespeichert wird ist der Primärschlüssel (Nr). Nach dem Sortiert die Datenbank.
Angezeigt wird mir der Name. Da in der Tabelle nach Nr sortiert wird, zeigt mir meine Combobox die Namen so an, wie sie die DB sortiert.
Bei 100 Namen wird es dann relativ schwer, einen Speziellen namen zu finden, da diese nicht alphabetisch sortiert sind. Deshalb brauche ich eine Sortierung.
Zu beginn habe ich gedacht, es sei der einfachste weg die DB neu zu sortieren, da mir meine Combobox die Daten so anzeigt, wie die DB die Daten sortiert. Dies ist scheinbar nicht möglich (anzeigen lassen funktioniert über Select* From tabelle Order By name, aber die werden dann nicht so gespeichert)

Daher ist es mittlerweile zu einem c# Problem geworden. Insofern hat mich das schon mal ein Stück weiter gebracht, da ich nun weiß, wo ich weiter ansetzen muss.

Zu dem ...dataGridView... So spreche ich meine einzelnen Felder in der Tabelle an. deshalb Oben mein codeauszug "this.dataGridView.....Sorted = true"

Jetzt muss ich schauen, ob ich in c# weitere Möglichkeiten habe, Daten geordnet anzeigen zu lassen, da der letzte versuch über Sorted = true nicht funktioniert, da eine Combobox mit festgelegter DataSource nicht sortierbar ist.

Aufjedenfall sage ich an alle die mir bislang geholfen haben VIELEN DANK :)
 
Werbung:
Hallo zusammen,

ich nochmal...
Ich hab eine weitere Idee bekommen, wie ich mein Problem lösen könnte.
Bräuchte da aber ein wenig Hilfe.

Ich habe vor eine weitere Spalte anzulegen. Nennen wir sie mal Hilfsspalte.
Dann habe ich in meiner Tabelle 3 Spalten ( Nr, Firma, Hilfsspalte)
Nr ist nach wie vor der primär schlüssel.
Nr und Firma werden aus einer Tabelle auf einem anderen Server über eine Procuder befüllt.

Ist es möglich, das ich sage: Hilfsspalte = die geordnete Firmenspalte

also die firmenspalte mit per order by ordnen lasse und dann sage, pack sie genau so in die hilfsspalte

Ich danke im Vorraus
 
Zurück
Oben