2013-03-22 9 views
5

Ich versuche, Produktpreis durch Verwendung des Produktnamens zu erhalten. Unten ist die Funktion, die ich verwende.Versuchen, ExecuteScalar zu verwenden, und erhalten "Angegebene Cast ist nicht gültig" Fehler

public int GetProductPrice(string ProductName) 
{ 
    cnn.Open(); 
    SqlCommand cmd = new SqlCommand("SELECT ProductPrice FROM Products WHERE ProductName ='" + ProductName + "'", cnn); 
    int price = (int)cmd.ExecuteScalar(); 
    return price; 
} 

Jetzt halte ich diesen Fehler Specified cast is not valid, und ich weiß nicht, warum. Kann mir jemand helfen ?

+1

http://en.wikipedia.org/wiki/SQL_injection. Lesen. Lernen. – SecurityMatt

+0

nicht ExecuteScalar() in dieser Situation - was passiert, wenn Sie mehrere Produkte mit dem gleichen Namen haben ... – MUG4N

+0

Ja, ich weiß es, aber jedes Produkt haben einen anderen Namen (complitly diffrent) – ShmuelCohen

Antwort

10

Zuerst sollten Sie parametrisierte SQL verwenden, anstatt den Parameter direkt in SQL zu setzen. Außerdem sollten Sie eine Anweisung using verwenden, um den Befehl - und die Verbindung - zu schließen, wenn Sie fertig sind. Oh, und erstellen Sie eine neue SqlConnection für jede Operation. So etwas wie:

public int GetProductPrice(string productName) 
{ 
    // Quite possibly extract the connection creation into a separate method 
    // to call here. 
    using (var conn = new SqlConnection(...)) 
    { 
     conn.Open(); 
     using (var command = new SqlCommand(
      "SELECT ProductPrice FROM Products WHERE ProductName = @ProductName", 
      conn)) 
     { 
      command.AddParameter("@ProductName", SqlDbType.VarChar) 
        .Value = productName; 
      object price = command.ExecuteScalar(); 
      // And you'd do the casting here 
     } 
    } 
} 

Als nächstes wir wissen nicht, den Typ des ProductPrice Feld. Es könnte sein, dass Sie eine long zurückgegeben bekommen, oder vielleicht ist es decimal. Der einfachste Weg, um herauszufinden, ist nur zu verwenden:

object tmp = cmd.ExecuteScalar(); 

... und dann im Debugger suchen. Schau dir auch die Art des Feldes in der Datenbank an - das sollte dir wirklich sagen, was zu erwarten ist. Werfen Sie einen Blick auf die SqlDbType Aufzählung für Zuordnungen zwischen den beiden.

+0

gut ich kann es nicht glauben, das Feld ProdcutPrice war Nvarchar, ändere es in int und alles funktioniert super, danke – ShmuelCohen

+1

@ user2120874: Aber bitte nehmen Sie den Rest der Antwort in Betracht - sonst sind Sie offen für SQL-Injection-Angriffe und alle Arten von Problemen. –

+0

Nun, ich werde es für meine anderen Projekte nehmen, aber dies ist ein Schulprojekt, also versuchen sie nicht, SQLI mich. Danke für die Hilfe – ShmuelCohen

Verwandte Themen