2017-02-07 1 views
0

In SQL Server Management Studio:Gespeicherte Prozedur mit dem Ausgangsparameter gibt immer 1 in Anwendungscode vs SQL

  1. Rechtsklick auf das Verfahren
  2. Execute
  3. Sie
  4. nicht Wert für den Parameter OUTPUT eingeben Geben Sie den Wert für einen anderen Zeichenfolgenparameter ein
  5. Der korrekte Wert wird zurückgegeben (z. B .: 12+)

Telefonvorwahl:

DECLARE @return_value int, 
     @CustomerID bigint 

EXEC @return_value = [dbo].[InsertCustomer] 
      @CustomerID = @CustomerID OUTPUT, 
      @Name = N'CustomerName' 

SELECT @CustomerID as N'@CustomerID' 
SELECT 'Return Value' = @return_value 

In Anwendungscode:

  1. Führen Sie den folgenden Code
  2. Der Rückgabewert für CustomerID ist immer 1

Code:

ObjectParameter ob = new ObjectParameter("CustomerID", typeof(long)); 
var CustomerID = db.InsertCustomer(ob, "CustomerName"); 

Ich habe versucht, den zweiten Parameter ObjectParameter(,) zu ändern, indem ich einen Typ und oft ein Objekt nach Wert übergebe (zB 0, 1 usw.), aber ohne Erfolg.

Was könnte hier schief gelaufen sein?

aktualisieren:

Dies ist, wie der Look-Prozedur-Code Entity Framework wie:

public virtual int InsertCustomer(ObjectParameter customerID, string name) 
{ 
    var nameParameter = name != null ? 
      new ObjectParameter("Name", name) : 
      new ObjectParameter("Name", typeof(string)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("InsertCustomer", customerID, nameParameter); 
} 
+1

Es sieht nicht, wie Sie den Ausgabeparameter im Code als Ausgabeparameter angeben. –

+0

Mögliches Duplikat von [Ausgabeparameter mit Entity Framework] (http://stackoverflow.com/questions/9367688/output-parameter-with-entity-framework) –

Antwort

2

Gerade ADO:

dieser link. verweisen. Sie müssen Ihren Ausgabeparameter im proc angeben, und Sie müssen ihn im aufrufenden Code angeben.

SqlParameter outParam = new SqlParameter("CustomerID", 0); 

using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["StringName"].ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("InsertCustomer", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure;    
     cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = CustomerName; 
        cmd.Parameters.Add(outParam.ParameterName, SqlDbType.BigInt).Direction = ParameterDirection.Output;     
     con.Open(); 

     var CustomerID = Convert.ToInt64(cmd.Parameters["CustomerID"].Value); 
    } 
} 

Entity Framework:

Siehe diese zu link

ObjectParameter ob = new ObjectParameter("CustomerID", 0); 

// Wrong 
var CustomerID = db.InsertCustomer(ob, "CustomerName"); 

// Right 
db.InsertCustomer(ob, "CustomerName"); 
var CustomerID = (long)ob.Value; 
+0

Könnten Sie bitte erklären, was Sie meinen "indem Sie Ihren Ausgabeparameter angeben. ..der Anrufcode "? Der Parameter ist bereits in der SQL-Prozedur angegeben, nicht sicher über den aufrufenden Code. Ich habe die Frage mit dem EF-Code aktualisiert. – usefulBee

+1

Für den Anfang war das obige für gerade ADO gedacht, für das ich persönlich ein wenig einfacher finde, gespeicherte Prozeduren zu verwenden, aber das ist eine Frage der Meinung. Hier ist ein Link, der Ihnen helfen sollte: http://stackoverflow.com/questions/22068027/executing-sql-stored-procedure-with-output-parameter-from-entity-framework –

+0

Wenn EF als Haupttechnologie ausgewählt ist , Ich sehe keinen Grund, gerade ADO zu verwenden, da es ausführlicher ist und mehr Codezeilen erfordert.Ein paar Mal musste ich aufgrund von Einschränkungen von EF zu ADO wechseln. Dein Link war aber sehr hilfreich, genauer gesagt die letzte Antwort von @Augis http://stackoverflow.com/a/41488387/2093880 – usefulBee