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.
http://en.wikipedia.org/wiki/SQL_injection. Lesen. Lernen. – SecurityMatt
nicht ExecuteScalar() in dieser Situation - was passiert, wenn Sie mehrere Produkte mit dem gleichen Namen haben ... – MUG4N
Ja, ich weiß es, aber jedes Produkt haben einen anderen Namen (complitly diffrent) – ShmuelCohen