2017-07-24 2 views
1

Also, ich habe eine Nummer in einer Box, es kann entweder positiv oder negativ sein. Abhängig von dieser Wahl ändert sich mein Algorithmus.Die Dezimalvariationen für eine Zahl erhalten

Sagen wir 207 in der Box, und es läuft durch meinen Codeblock, ich möchte jede mögliche Dezimalvariation von 207 aus der Datenbank bekommen, obwohl ich genauso gut durch die anderen schauen könnte. Also, was ich tun ist, bekommen Zahlen größer als 207, aber weniger als eine Nummer darüber, es sieht ungefähr so ​​aus:

String DecimalValue = FilterUSD.Text.ToString().Trim(); 
Double Deci = Convert.ToDouble(DecimalValue); 
Double init = Deci; 
Double init2 = init + 1; 

Das gibt mir 207,50, 207,99, 207,13, usw. aus dem Backend.

Ich brauche dies für eine SQL-Anweisung später, aber das ist der wichtige Teil:

sbuilder.Append(" Amount_USD").Append(" >= ").Append("@init AND Amount_USD < @init2 "); 

Wenn die sbuilder (string Builder) aufgelöst wird, sieht es so etwas wie dieses:

Select * FROM Table WHERE Amount_USD >= @init AND Amount_USD < @init2 

Das funktioniert so, wie ich es erwarte, und ich bekomme jede Dezimalzahl einer gegebenen Nummer, einschließlich dieser Nummer.

Was ich brauche, ist die negative Variation. Ich bin nicht sicher, was ich falsch mache, aber die Gegenüberstellung des Codes funktioniert nicht, wenn ich versuche, es durch den SQL-Befehl zu filtern, würde es überhaupt keine Zeilen zurückgeben.

Hier ist der vollständige Code:

String DecimalValue = FilterUSD.Text.ToString().Trim(); 
Double Deci = Convert.ToDouble(DecimalValue); 
if(Deci < 0) 
{ 
    //Negative 
    Double init = Deci; 
    Double init2 = init - 1; 
    sbuilder.Append(" Amount_USD").Append(" <= ").Append("@init AND Amount_USD > @init2 "); 
} 
else 
{ 
    //Positive, as above 
} 

SQL Ausgabe des Codes für negative Basen:

Select * FROM Table WHERE Amount_USD <= @init AND Amount_USD > @init2 
+0

Wo fügen Sie 'init' und' init2' als Parameter hinzu, und welche Werte haben sie zum Zeitpunkt des Hinzufügens? –

+0

Ah, nun, sie sind Int-Datentypen und init ist gleich der angegebenen Basisnummer, und init2 ist gleich der Basis +/- 1, abhängig davon, ob die Basis negativ ist oder nicht. – Arvayne

+0

Führen Sie das SQL in Management Studio zuerst ohne die WHERE-Klausel aus. Dann fügen Sie den ersten Teil der Klausel hinzu, führen Sie ihn erneut aus und sehen Sie sich die Ergebnisse an. Sie sollten dann in der Lage sein, (basierend auf den zurückgegebenen Daten) herauszufinden, wie das letzte Bit davon zu formulieren ist. – pinkfloydx33

Antwort

3

Wenn wir bedenken:

if(Deci < 0) 
{ 
    //Negative 
    Double init = Deci; 
    Double init2 = init - 1; 
    sbuilder.Append(" Amount_USD").Append(" <= ").Append("@init AND Amount_USD > @init2 "); 
} 

Die Werte von init und init2 hier sind irrelevant - sie werden nirgends verwendet, und sie sind sicherlich nicht die in den Parametern verwendeten Werte. Stattdessen finden Sie wo Sie die Parameter hinzufügen, und sehen Sie, welche Werte Sie dort hinzufügen. Ich nehme an, dass Sie die "+1" Version verwenden, die einen unmöglichen Bereichstest ergeben würde.

hier wäre ein guter Ansatz sein, um die Variablen zu deklarieren außerhalb des if Test, sie innen, und dann die Werte danach verwenden füllen; zum Beispiel:

double init, init2; 
if(Deci < 0) { 
    init = Deci; 
    init2 = init - 1; 
    sqlBuilder.Append(" Amount_USD <= @init AND Amount_USD > @init2 "); 
} else { 
    init = Deci; 
    init2 = init + 1; 
    sqlBuilder.Append(" Amount_USD >= @init AND Amount_USD < @init2 "); 
} 
cmd.Parameters.AddWithValue("@init", init); 
cmd.Parameters.AddWithValue("@init2", init2); 

Dies wird Kraft Sie einen sinnvollen Wert für die Einheimischen (init, init2) in beiden Codepfade zuweisen.

Seitennotiz: Sie könnten decimal anstelle von double; Geld ist normalerweise kein Fließkomma.

+0

Bei näherer Betrachtung haben Sie Recht! Ich habe überprüft, wo ich die Parameter in meinen Befehl eingefügt habe und es scheint, dass ich den Block nur für Positives verwendet habe. Ich werde das klären. Überrascht konnte man feststellen, dass ich den Parameterblock gar nicht gepostet hatte! – Arvayne

+1

@Arvayne, weshalb ich nach dem Code gefragt habe :) aber: was ich * aus deinem Code * sagen kann ist, dass 'init' und' init2' ** niemals für irgendwas benutzt wurden **, was meine Ahnung angeheizt hat. –

+0

Nebenbei, könnten Sie ROUND dafür nicht verwenden - für positive und negative Zahlen? z.B. RUNDE (@ init1, 0, 1) = @ init2. SQL Server wurde nicht installiert und kann nicht überprüft werden. – bornfromanegg

Verwandte Themen