2009-03-18 3 views
3

Wir haben ein Feld mit der Bezeichnung Mitarbeiternummer in unserer Datenbank. Es ist char (10) Feld. Wir speichern die Zahlen rechtsbündig. Also speichern wir die Nummern als " 1", " 2" usw. Ich bin nicht sicher, warum wir damit angefangen haben, weil es passierte, bevor ich hier anfing zu arbeiten.Wo ist der richtige Ort, um eine Zeichenkette in .NET zu formatieren?

Aus diesem Grund muss jede Funktion in der Geschäftslogik, die eine Mitarbeiternummer als einen der Parameter hat, die Nummer korrigieren. Wenn wir das vergessen, wird die Datenbank nicht korrekt aktualisiert.

Meine Frage ist:

Gibt es einen besseren Weg, dies zu tun, so dass wir die Zahl in jeder Funktion nicht formatiert werden müssen?

Antwort

12

Speichern Sie Ihre Mitarbeiter-IDs nicht mehr rechtsbündig in der Datenbank und tun Sie dies, nachdem Sie sie ausgezogen haben, wenn Sie sie anzeigen möchten.

bearbeiten: Mitarbeiternummer sollte zumindest als varchar (10) gespeichert werden (unter der Annahme, dass es nicht numerische Zeichen akzeptieren kann) oder als ganze Zahl (wenn es eine tatsächliche „Nummer“ ist, wie es angenommen wird, Sein). Nach dem Abrufen der Nummer, dann würden Sie es richtig rechtfertigen, wenn nötig in welcher Anwendung Sie es in anzeigen.

Hinweis: Ich sagte dies in Kommentaren, aber es muss deutlich gemacht werden: Der Versuch, um die Arbeit Das zugrundeliegende Problem wird nur zu mehr Problemen auf der ganzen Linie und zu einem allgemeinen Gefühl der Verwirrung zwischen den verschiedenen Entwicklern führen, die an dem Projekt arbeiten und das Projekt in der Zukunft erben werden.

+0

+1 - Es tut uns leid, dass Sie downvoted, aber das ist die richtige Antwort. Vor allem, wenn seine IDs numerisch sind – JoshBerke

+0

+1, Datenbank ist absurd, muss es behoben werden. Pass nicht auf, sammle keine $ 200 ein. – mquander

+0

Der Versuch, einen riesigen WTF zu umgehen, ist ein WTF an und für sich. – TheTXI

0

Dies hängt natürlich von der Architektur des Systems ab. Verfügen Sie über einen Datenlayer für das Geschäft? Vielleicht kannst du dort die Formatierung machen?

Ich nehme an, es ist ein großer Refaktor, die DB in int oder bigint zu ändern, wenn nicht, tu das.

1

Auch wenn es eine schlechte Praxis, wie andere geschrieben haben, könnten Sie nicht nur lesen Eigenschaft von ihnen Mitarbeiter Klasse aussetzen, die Pflege der Formatierung nimmt

0

Vielleicht möchten Sie eine Erweiterungsmethode zu berücksichtigen, dass die verlängern würde (vermutlich als ganzzahliger Typ Ihrer Mitarbeiter-ID.

public static int ToRightAlignedString(this int obj) 
{ 
    return ("   " + obj.ToString()).Right(10); 
} 
1

Ich stimme den anderen zu, dass Refactoring der erste Vorschlag wäre. Speichern Sie die Mitarbeiter-IDs als Rohdaten und führen Sie alle Formatierungen durch, für die auf Sichtenebene die richtige Begründung erforderlich ist.

Wenn dies absolut keine Option ist, würde ich eine Erweiterungs-Methode auf Zeichenfolge schreiben, um dies zu behandeln. Dann können Sie someString.RightJustify (10) speichern. Erweiterungsmethoden müssen statische Methoden in einer statischen Klasse sein. So etwas wie die folgenden funktionieren würde:

public static class ExtensionMethods 
{ 
    public static string RightJustify(this string s, int chars) 
    { 
     if (s.Length > chars) 
      return s.Substring(0, chars); 
     else 
      return s.PadLeft(chars, ' '); 
    } 
} 
+0

Der Nachteil der Erweiterungsmethode ist, dass * alle * sich daran erinnern müssen, sie anzurufen oder die Aktualisierungen fehlschlagen. Das ist ein Punkt, den das OP zu vermeiden versucht. –

+0

Aus diesem Grund sollte er den Treffer nehmen und nur die db refaktorieren und numerische IDs als ein einfaches numerisches Feld speichern. – Rich

2

Ich bin nicht mit der Verwendung des char-Datentyp übereinstimmen, aber die Frage zu beantworten, ein Weg, dies tun könnte, mit einem Trigger ist. Aktualisieren Sie eine Tabelle mit der Zahl in ihrer Ganzzahlform, und lassen Sie sie dann vom Auslöser formatiert und in der richtigen Tabelle gespeichert werden.

Noch einmal, ich würde nur den Datentyp umgestalten, aber es klingt wie Sie sind nicht in der Lage, das zu tun.

0

Sie könnten einen Typ (struct, am wahrscheinlichsten) definieren, der eine Ganzzahl umschließt, und diesen in Ihrem Code für die Mitarbeiternummer verwenden. So etwas (C#).

struct EmployeeNumber 
{ 
    private int empNumber; 

    public String EmpNum 
    { 
     set 
     { 
      int test; 
      if (Int32.TryParse(value, out test)) 
      { 
       empNumber = test; 
      } 
     } 

     get 
     { 
      return empNumber.ToString("D10"); 
     } 
    } 
} 

HINWEIS: Ich bin damit einverstanden, dass die Datenbank zur Festsetzung der Richtige ™ zu tun ist. Ich weiß jedoch auch, dass diese Option nicht immer verfügbar ist. Die Verwendung eines benutzerdefinierten Datentyps anstelle eines int in Ihrem Code wäre eine praktische Möglichkeit, Probleme bei der Konvertierung in die Datenbankstrings zu vermeiden.

0
Public Function foo(ByVal valToStore As Object) As String 
    Dim RetVal As String = String.Empty 
    If TypeOf valToStore Is String Then 
     RetVal = DirectCast(valToStore, String) 
    ElseIf TypeOf valToStore Is Integer Then 
     RetVal = DirectCast(valToStore, Integer).ToString 
    End If 
    RetVal = RetVal.Trim.PadLeft(10, " "c) 
    Return RetVal 
End Function 

ich stimme zu, dass die Datenbank dies als eine Nummer, nicht als eine Zeichenfolge speichern soll. Ich nahm an, dass Sie eine VB-Antwort wollten.

Verwandte Themen