Legen Sie die numerische (dezimal -) Daten aus textbox-Werte
Ich bin verwirrt, indem Sie das folgende Problem;
Habe ich ein C# (WindowsForms) Anwendung, die ich eine Verbindung zu einer SQL Server-DB und habe kein problem, INSERT, SELECT, UPDATE... bis ich anfing zu arbeiten mit numerischen Daten;
Zweck dieser Anwendung ist die Verwaltung der Mitarbeiter, Ihre Verträge, die Geschwindigkeit der Arbeit, Verträge, Laufzeiten, Stundensätze... und einige lustige Berechnungen mit nichts Magie.
Grundsätzlich, ich brauche, um zu speichern einige Werte (dezimal? doppelt? float?) mit dem format "0000,0000" in meiner DB.
-
In meiner DB, ich habe meine Tabelle mit allen Spalten, wo ich diese erfordern "000,0000" Werte auf dezimal
-
In meine Formulare, die ich noch nicht angegeben, jede spezifische Eigenschaften, um meine Textboxen,
-
Einfügen, benutze ich eine Methode, für die ich definierte dezimal-Argumente
public void createNewContract(int employeeId, string agency, string role, string contractType, string startDate, string endDate, string lineManager, string reportTo, string costCenter, string functionEng, string atrNo, string atrDate, string prNo, string prDate, string poNo, string poDate, string comments, decimal duration, decimal workRatePercent, string currency, decimal hourlyRate, decimal value) { if (conn.State.ToString() == "Closed") { conn.Open(); } SqlCommand newCmd = conn.CreateCommand(); newCmd.Connection = conn; newCmd.CommandType = CommandType.Text; newCmd.CommandText = "INSERT INTO tblContracts (CreatedById, CreationDate, EmployeeId, Role, ContractType, StartDate, " + "EndDate, Agency, LineManager, ReportTo, CostCenter, FunctionEng, AtrNo, AtrDate, PrNo, PrDate, PoNo, PoDate, Comments, Duration, WorkRatePercent, Currency, HourlyRate, Value)" + "VALUES ('" + connectedUser.getUserId() + "','" + DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + "','" + employeeId + "','" + role + "','" + contractType + "','" + startDate + "','" + endDate + "','" + agency + "','" + lineManager + "','" + reportTo + "','" + costCenter + "','" + functionEng + "','" + atrNo + "','" + atrDate + "','" + prNo + "','" + prDate + "','" + poNo + "','" + poDate + "','" + comments + "','" + duration + "','" + workRatePercent + "','" + currency + "','" + hourlyRate + "','" + value + "')"; newCmd.ExecuteNonQuery(); MessageBox.Show("Contract has been successfully created", "Completed", MessageBoxButtons.OK, MessageBoxIcon.Information); }
(durch diese Methode, die ich nur einfügen muss, wie 00,0000 eine Dauer (nb Stunden), Arbeitsgeschwindigkeit Prozentsatz, der Stundensatz (das Geld in einer anderen Währung) und einen Wert (Geld in einer anderen Währung))
- Zu erfassen, meine Textfelder Werte ein und senden Sie durch meine Methode 'createNewContrat', die ich versucht habe
Konvertieren.ToDecimal(dies.txtDuration.Text) und viele andere Dinge, die schien gut zu mir, aber ich Schaffe es nicht zu verstehen, die Mechaniker und ich bin sicherlich nicht der mit der meisten praktische/clevere Lösung...
Bekomme ich immer die folgende Fehlermeldung;
System.FormatException: Le format de la chaîne d ' entrée est incorrect. = Das format der Eingabe/Eingabe-string ist falsch
à-System.Anzahl.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
à-System.Anzahl.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)
à-System.Konvertieren.ToDecimal(String value)
Was würden Sie empfehlen?
- Ihre SQL-Anweisung wäre viel sicherer und besser lesbar, wenn es parametrisiert
- SQL-Injection: Exploits Of A Mom
- Ich würd dir empfehlen einen Kontrakt anlegen, der Klasse, die als container für alle Felder, anstatt eine Methode mit 20+ Parameter.
- Cheers Filburt, Beispiel von Bild ist ganz klar :DD
- Sie sind herzlich willkommen. Auch, weil Sie neu sind, auf StackOverflow, ich möchte Sie informieren, dass Sie upvote gute Antworten-und die Antwort akzeptieren, dass Ihnen geholfen, die meisten durch ankreuzen der tick daneben die Antwort. Auf dieser site wird ein upvote oder eine akzeptierte Antwort zählt als ein "danke".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Immer an der ersten Stelle verwenden Sie
using
beim Umgang mitSqlConnection
undSqlCommand
und alle anderen Klassen, die implementiertIDisposable
nur mehr darüber zu Lesen..Zweite Sache, Immer Parameter verwenden, mit
SqlCommand
und nie die Werte als string an die sql-Zeichenfolge. Das ist ein ernstes Sicherheitsproblem. Zusätzlich zu diesem Parameter lässt sich der code menschlichen freundlich!Dies ist keine direkte Antwort auf deine Frage, aber bitte (!) ersetzen Sie das hässliche Methode, die von diesem:
Erstellen Sie eine Klasse für Ihre Verträge. Dadurch wird es viel einfacher zu handhaben Verträge. Wenn Sie mehrere Methoden, Handhabungen Verträge in irgendeiner Weise, werden Sie nicht haben, ändern Sie die fast unendliche parameter listet alle von Ihnen, wenn Eigenschaften werden Hinzugefügt, um den Vertrag.
und ändern Sie die Signatur der Methode zu
Kopfzeilen der Methoden be-Verträge bilden die Datenbank würde so Aussehen
Viel einfacher als die Rückkehr 1000 Variablen!
Können Sie einen neuen Vertrag mit
Auch (wie andere haben darauf hingewiesen, bereits) der Befehl Parameter.
(HaLaBi ' s post zeigt, wie formulieren Sie Ihre insert-Befehl string aus.)