2016-04-27 22 views
1

Ich versuche, den folgenden Code mit SQL-Befehl ausführen, um die Ausgabe zu erhalten und speichern Sie es in einem Integer-Varable. Der Code gibt -1 für die Nullwerteinfügung zurück, was in Ordnung ist.sql commnad funktioniert nicht für eine Select-Anweisung in C#

Wenn jedoch Werte in der Datenbanktabelle vorhanden sind und wenn richtige Eingaben angegeben werden, gibt der Code den gleichen Wert -1 zurück.

Kann mir jemand in die richtige Richtung zeigen?

try { 
    con.Open(); 
    SqlCommand cmd1 = new SqlCommand(@"(Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)", con); 

    if (comboBox_ConfacValue.Text == "") 
    { 
     cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = DBNull.Value; 
    } 
    else 
    { 
     cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = comboBox_ConfacValue.Text; 
    } 

    if (combobox_conversionDescription.Text == "") 
    { 
     cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = DBNull.Value; 
    } 
    else 
    { 
     cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = combobox_conversionDescription.Text; 
    } 

    string sql = "Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND  [ERSConversionFactor_Desc] = @convDescription)"; 

    int conversionvalue = cmd1.ExecuteNonQuery(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error : " + ex.Message); 
} 
finally 
{ 
    con.Close(); 
} 

Dank

+0

Sie müssen diese studieren - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar%28v=vs.110%29.aspx?f= 255 & MSPPError = -2147217396 – techspider

Antwort

4

ExecuteNonQuery ist nicht auf Rückgabewerte aus der Abfrage verwendet werden soll. Sie führt die Abfrage aus, gibt jedoch nur die Anzahl der Zeilen zurück, die von einer INSERT-, UPDATE- oder DELETE-Anweisung betroffen sind.

Wenn Sie den Abschnitt BEMERKUNGEN auf ExecuteNonQuery Seite auf MSDN betrachten, finden Sie den Grund des Rückgabewerts von -1.

Mit einem SELECT-Befehl können Sie ExecuteReader oder besser ExecuteScalar verwenden, wenn Sie nur die erste Spalte der ersten Zeile möchten, die von der SELECT-Anweisung abgerufen wird.
Da jedoch Ihre Abfrage eine WHERE-Anweisung hat, die abgerufen keine Zeile führen könnte, sollten Sie einen Scheck für null auf den Rückgabewert von ExecuteScalar

object result = cmd1.ExecuteScalar(); 
if(result != null) 
{ 
    int conversionvalue = Convert.ToInt32(result); 
    ..... 

} 
+0

super danke für die information es hat funktioniert ... ich werde dies als die antwort :) –

3

Versuchen ExecuteScalar

int conversionvalue = cmd1.ExecuteScalar(); 
1

Sie hinzufügen müssen Verwenden Sie entweder ExecuteReader oder ExecuteScalar für einzelne Werte. In diesem Fall würde ich einen ExecuteReader verwenden, da es anscheinend keinen Gaurentee gibt, der eine einzelne Zeile immer zurückgibt.

int? conversionvalue = null; // this will stay null if there is nothing read back 
using(var reader = cmd1.ExecuteReader()) { // place the use of the reader in a using block to ensure it is cleaned up 
    if(reader.Read()) // reader will return true if a record can be read. if you have multiple records you can turn the if into an while loop 
     conversionvalue = reader.GetInt32(0); // read the value at ordinal position 0 as an int32 
} 
+0

Es ist wahr, dass intern ExecuteScalar ExecuteReader verwendet, aber werfen Sie einen Blick auf den Abschnitt Bemerkungen auf [ExecuteScalar Seite auf MSDN] (https : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar%28v=vs.110%29.aspx) oder sogar [hier auf StackOverflow] (http://stackoverflow.com/questions/2400005/does-executscalar-haben-irgendwelche-Vorteile-over-exec) – Steve

+1

@Steve - danke, ich bin mir bewusst. Ich habe erwähnt, ExecuteScalar war in Ordnung für einzelne Werte, aber mein Beispiel enthalten ExecuteReader wegen der Syntax in der Auswahl. Wenn es "SELECT TOP 1 ..." oder "SELECT COUNT()" oder etwas anderes wäre, das anzeigt, dass immer genau ein Wert (oder Null) zurückgegeben würde, hätte ich auch mit einem Beispiel von "ExecuteScalar" beantwortet (oder überhaupt nicht beantwortet, wenn man bedenkt, dass ExecuteScalar bereits zwei gute Antworten (deine und techspider) hatte). – Igor