2017-04-07 4 views
-1

Ich bin neu in C# und wollen mit SQL Server speichern Verfahren, in dem SQL-Server schreiben diesen Speicher Prozedur einfache Anwendung Arbeit schreiben:
Warum kann ich nicht mit der Speicherprozedur Rückgabewert C# umgehen?

USE [mammutRecruitment] 
ALTER PROCEDURE [dbo].[FirstStep] 
    @Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
    @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
AS 
BEGIN 
    DECLARE @MYID bigint 
    insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode, 
    @Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1) 

     select @MYID=[UserID] from [mammutRecruitment].[dbo].[UserMainSpecifications] 
     where [NationalCode][email protected] 
     select @MYID as myID 

END 


und in C# schreiben diesen Code für Anruf, dass :

using (SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=mammutRecruitment;Integrated Security=True")) 
      { 
       using (SqlCommand cmd = new SqlCommand("FirstStep", con)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = m.Name; 
        cmd.Parameters.Add("@Family", SqlDbType.NVarChar).Value = m.Family; 
        cmd.Parameters.Add("@FatherName", SqlDbType.NVarChar).Value = m.FatherName; 
        cmd.Parameters.Add("@BirthCertificate", SqlDbType.BigInt).Value =Convert.ToInt64(m.BirthCertificate); 
        cmd.Parameters.Add("@PlaceOfBirth", SqlDbType.NVarChar).Value = m.PlaceOfBirth; 
        cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value =Convert.ToDateTime(dt.ToString()); 
        cmd.Parameters.Add("@NationalCode", SqlDbType.BigInt).Value =Convert.ToInt64(m.NationalCode); 
        cmd.Parameters.Add("@Religion", SqlDbType.NVarChar).Value = m.Religion; 
        cmd.Parameters.Add("@faith", SqlDbType.NVarChar).Value = m.faith; 
        cmd.Parameters.Add("@Nationality", SqlDbType.NVarChar).Value = m.Nationality; 
        cmd.Parameters.Add("@BloodGroup", SqlDbType.NVarChar).Value = m.BloodGroup; 
        SqlParameter retval = cmd.Parameters.Add("@myID", SqlDbType.BigInt); 
        retval.Direction = ParameterDirection.ReturnValue; 
        con.Open(); 
        cmd.ExecuteNonQuery(); 
        var retunvalue = cmd.Parameters["@myID"].Value; 


aber in der dieser Linie erhalten i Null-Wert immer:

var retunvalue = cmd.Parameters["@myID"].Value; 


Was passiert? Wie kann ich dieses Problem lösen? Danke.

+0

Sie sind nicht den Wert zurückgibt, sind die Auswahl einfach lesen kann. Entweder ändern Sie Ihr Proc zu 'RETURN @ MyID' oder ändern Sie den Code in' var returnvalue = cmd.ExecuteScalar() '. – Siyual

+0

Sie fügen den Parameter in C# -Code hinzu, aber Sie haben diesen Parameter nicht zwischen den Eingabeargumenten der gespeicherten Prozedur. – Steve

+0

Verwenden Sie entweder ExecuteScalar, um den von der Abfrage zurückgegebenen einzelnen Wert abzurufen, oder legen Sie den Parameter als Ausgabeparameter fest, und ermitteln Sie dessen Wert auf diese Weise. – ADyson

Antwort

1

Diese Zeile:

cmd.ExecuteNonQuery(); 

Ist Ihre Abfrage ausgeführt und keinen Wert zurückgibt.

könnten Sie beginnen, indem in der Suche verwenden Sie stattdessen:

cmd.ExecuteReader(); 

Oder wenn Sie den Wert des ersten Feldes der ersten Reihe möchten, können Sie diese verwenden:

var returnValue = cmd.ExecuteScalar(); 

denen Geben Sie ein Objekt, das Sie dann konvertieren oder in den entsprechenden Typ für Ihre Methode umwandeln können.

+0

danke mein Freund ich akzeptiere nach 6 Minuten –

0

Sie benötigen @myID als Ausgabeparameter in Ihrer gespeicherten Prozedur Definition enthalten:

ALTER PROCEDURE [dbo].[FirstStep] 
    @Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
    @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
    , @myID bigint output 
AS 

Und dann entfernen Sie die Zeile

DECLARE @MYID bigint 

Sie müssen auch die Parameter in dem cmd in Ihrem C# -Code:

cmd.Parameters.Add(retval); 
1

SqlCommand.ExecuteNonQuery Method()

Führt eine Transact-SQL-Anweisung für die Verbindung aus und gibt die Anzahl der betroffenen Zeilen zurück.

SqlCommand.ExecuteScalar Method()

Führt die Abfrage, und gibt die erste Spalte der ersten Zeile in die Ergebnismenge von der Abfrage zurückgegeben. Zusätzliche Spalten oder Zeilen werden ignoriert.

Ich glaube, Sie die zweite Methode wollen

0

Eigentlich müssen Sie diese Anweisung ändern:

retval.Direction = ParameterDirection.ReturnValue;

zu

retval.Direction = ParameterDirection.Output

weil ExecuteNonQuery Rückkehr:

eine Transact-SQL-Anweisung für die Verbindung Führt und gibt th zurück Die Anzahl der betroffenen Zeilen. Obwohl ExecuteNonQuery keine Zeilen zurückgibt, werden alle Ausgabeparameter oder Rückgabewerte, die den Parametern zugeordnet sind, mit Daten gefüllt.

Ende umfassen Ihre Parameter Prozedur-Definition: @myID BIGINT OUTPUT

USE [mammutRecruitment] 

ALTER PROCEDURE [dbo].[Firststep] @Name    NVARCHAR(max), 
           @Family   NVARCHAR(max), 
           @FatherName  NVARCHAR(max), 
           @BirthCertificate BIGINT, 
           @PlaceOfBirth  NVARCHAR(max), 
           @BirthDate  DATETIME, 
           @NationalCode  BIGINT, 
           @Religion   NVARCHAR(max), 
           @faith   NVARCHAR(max), 
           @Nationality  NVARCHAR(max), 
           @BloodGroup  NVARCHAR(max), 
           @myID    BIGINT output 
AS 
    BEGIN 

    INSERT INTO [dbo].[usermainspecifications] 
    VALUES  (@Name, 
       @Family, 
       @FatherName, 
       @BirthCertificate, 
       @PlaceOfBirth, 
       1, 
       @BirthDate, 
       @NationalCode, 
       @Religion, 
       @faith, 
       @Nationality, 
       @BloodGroup, 
       12, 
       '123', 
       '123', 
       1, 
       2015 - 1 - 1, 
       '12', 
       '123', 
       '1234', 
       1) 

    SELECT @myID = [userid] 
    FROM [mammutRecruitment].[dbo].[usermainspecifications] 
    WHERE [nationalcode] = @NationalCode 
END 
0

Sie @MYID als Ausgangsparameter definieren müssen.

USE [mammutRecruitment] 
    ALTER PROCEDURE [dbo].[FirstStep] 
     @MYID bigint output,@Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
     @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
    AS 
    BEGIN 

     insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode, 
     @Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1) 

      select @MYID = SCOPE_IDENTITY() 

    END 

und Ihren Befehl hinzufügen

SqlParameter pOut = new SqlParameter("@MYID", SqlDbType.BigInt); 
pOut.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(pOut); 

Sie den Wert jetzt ist es

cmd.ExecuteNonQuery(); 
long newId = (long)pOut.Value; 
Verwandte Themen