2016-07-25 9 views
0

etwas wirklich komisches heute zurückgeben.ExecuteStoreCommand kann keine Zeichenfolge mit SqlParameter Ausgabe

Wenn ich versuche, eine gespeicherte Prozedur in SQL Server mit der objectContext von Entity Framework mit der Funktion ExecuteStoreCommand aufrufen, versucht es immer zu 'String' Wert in 'Int' zu konvertieren .. Ich weiß nicht warum.

Auch wenn ich den Ausgang als NvarChar Typ festlegen.

Meine Ausnahme ist

konnte nicht varchar Wert 'text' Umwandlung

Datentyp Hier int ist mein C# -Code:

public virtual string GetCardCodeLinkedToAttestation(string atBuisnessCode) 
{ 
    // Input param - String 
    SqlParameter atBuisnessCodeParameter = new SqlParameter("atBuisnessCode", atBuisnessCode); 

    // The output param - String 
    SqlParameter retval = new SqlParameter("retval", SqlDbType.NVarChar,15); 
    retval.Direction = ParameterDirection.Output; 

    ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("exec @retval = sp_GetCardCodeLinkedToAttestation @atBuisnessCode", atBuisnessCodeParameter, retval); 

    return (string)retval.Value; 
} 

Hier ist meine gespeicherten Prozedur in SQL Server (ich gebe explizit 'test' zurück, um sicherzustellen, dass es sich um eine Zeichenfolge handelt):

ALTER PROCEDURE [dbo].[sp_GetCardCodeLinkedToAttestation] 
    @atBuisnessCode nvarchar(9) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @retval varchar(15); 
    set @retval= ''; 

    -- Insert statements for procedure here 
    SET @retval = (SELECT TOP 1 [CardCode] 
        FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR] 
        WHERE [U_Attestation] = @atBuisnessCode) 

    RETURN 'test'; 
END 
GO 

Ausnahme:

Fehler beim VARCHAR Wert 'Text' Umwandeln in int Datentyp

enter image description here

ich versuchte, den Wert ohne Rückkehr zu setzen es und erklären die Ausgabe in Meine gespeicherte Prozedur, aber der zurückgegebene Wert ist immer NULL.

enter image description here

+2

Der Rückgabetyp für gespeicherte Prozeduren ist immer "int". Wenn Sie eine Zeichenkette wollen, verwenden Sie einen 'output' Parameter oder platzieren Sie ihn in einer Ergebnismenge - verwenden Sie nicht' return'. Außerdem sollten Sie vermeiden, 'sp_' als Präfix zu verwenden, wenn Sie Ihre gespeicherten Prozeduren benennen - es ist für die Systemprozeduren von Microsoft reserviert. –

Antwort

0

Ich finde, schließlich verwende ich (ExecuteStoreQuery) anstelle von (ExecuteStoreCommand). Wo ich meinen sql direkt ins Innere stelle. Und es gibt mir das String-Ergebnis meiner Auswahl zurück. Einfach . Danke für den Versuch, mir zu helfen ;-).

public virtual string GetCardCodeLinkedToAttestation(string atBuisnessCode) 
    { 
     string return_value = ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<string> 
     (string.Format("SELECT TOP 1 [CardCode] FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR] WHERE [U_Attestation] = '{0}'", atBuisnessCode)).FirstOrDefault(); 


     return string.IsNullOrWhiteSpace(return_value) ? string.Empty : return_value; 
    } 
2

Hier müssen Sie Ausgabe als Rückkehr verwenden, wird immer int-Datentyp zurück.

Standardmäßig wird die erfolgreiche Ausführung einer gespeicherten Prozedur kehrt 0

Bitte versuchen Sie es unten Code:

@atBuisnessCode nvarchar(9), 
@retval varchar(15) OUTPUT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @retval varchar(15); 
    set @retval= ''; 

    -- Insert statements for procedure here 
    set @retval= (SELECT TOP 1 [CardCode] FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR] WHERE [U_Attestation] = @atBuisnessCode) 

    --return 'test'; 
END 
GO 
+0

Die Rückkehr, die ich warte, ist ein String-Wert wie (R_123332). Wie ich sehen kann, ist immer ein Int zurück? Selbst wenn ich eine Ausgabe als varchar deklariere? Mit Ihrer Lösung bekomme ich immer den Rückgabewert [0] .. –

+0

Wenn ich @retval = '1234' setze, bekomme ich korrekt einen String mit1234. Ich vermute, er versucht das Ergebnis als int zu parsen. Aber warum ? . Haben Sie keine Lösung, um einen vollständigen String-Wert als Ausgabe zurückzugeben? –

+0

Verwenden Sie "Return" -Anweisung am Ende? – Neel