2012-04-05 20 views
0
ALTER PROCEDURE dbo.SP_InsertTicket 
    /* 
    (
    @parameter1 int = 5, 
    @parameter2 datatype OUTPUT 
    ) 
    declare @i as numeric 
    exec SP_InsertTicket 'asd','[email protected]','232323','dasasd','sdasdas','01-jan-2010',@i output,'sdas','sdasd','02-jan-2010' 
    select @i*/ 
    @Client_FullName varchar(30), 
    @Client_EmailAdd varchar(50), 
    @Client_Telephn varchar(15), 
    @Ticket_Subject varchar(50), 
    @Ticket_Source varchar(15), 
    @Ticket_CreateDate Datetime, 

    @Ticket_Id integer output, 
    @Que_Message varchar(100), 
    @Que_Attachment varchar(max), 
    @Que_UpdateDate Datetime 

AS 
    declare @TickID integer; 
    /* SET NOCOUNT ON */ 
    BEGIN 

     INSERT INTO tbl_Ticket (Client_FullName,Client_EmailAdd,Client_Telephn,Ticket_Subject,Ticket_Source,Ticket_CreateDate) 

        VALUES (@Client_FullName, @Client_EmailAdd ,@Client_Telephn,@Ticket_Subject,@Ticket_Source,@Ticket_CreateDate) 


     Select @TickID = MAX(Ticket_Id) from tbl_Ticket 


     set @[email protected] 

     INSERT INTO tbl_TicketQuestion (Ticket_Id,Que_Message,Que_Attachment,Que_UpdateDate) 

        VALUES (@TickID,@Que_Message,@Que_Attachment,@Que_UpdateDate) 

    END 

    RETURN 

Dieses ist mein Speicher Verfahren, in dem ich brauche ticket_id zurückzuversetzen App per E-Mail senden Es Datensätze einfügen gut in der Lage bt nicht Wert in DAL retirn Unten ist der Code für ausführen von Stored Procedure, den Wert zurückgibtAusführen von SQL Stored Procedure

public class cls_DAL 
{ 
    public cls_DAL() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 

    static string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["conString"].ConnectionString.ToString(); 

    SqlConnection con = new SqlConnection(strConn); 
    SqlCommand cmd = new SqlCommand(); 
    SqlDataAdapter da = new SqlDataAdapter(); 
    DataSet ds = new DataSet(); 
    DataTable dt = new DataTable(); 



    public int insert_NewTicket(string fullname, string emailadd, string telephone, string subject, string source, DateTime date,string Message, string attachment, DateTime updatedate) 
    { 
     try 
     { 
      con.Open(); 
      cmd = new SqlCommand("SP_InsertTicket", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@Client_FullName", fullname); 
      cmd.Parameters.AddWithValue("@Client_EmailAdd", emailadd); 
      cmd.Parameters.AddWithValue("@Client_Telephn",telephone); 
      cmd.Parameters.AddWithValue("@Ticket_Subject", subject); 
      cmd.Parameters.AddWithValue("@Ticket_Source",source); 
      cmd.Parameters.AddWithValue("@Ticket_CreateDate",date); 
      cmd.Parameters.AddWithValue("@Ticket_Id",0); 
      cmd.Parameters.AddWithValue("@Que_Message", Message); 
      cmd.Parameters.AddWithValue("@Que_Attachment", attachment); 
      cmd.Parameters.AddWithValue("@Que_UpdateDate",updatedate); 

      cmd.Parameters["@Ticket_Id"].Direction = ParameterDirection.InputOutput; 

      return cmd.ExecuteNonQuery(); 
      int i = (int)cmd.Parameters["@Ticket_Id"].Value; 

     } 
    catch 
     { 
      throw; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      con.Close(); 
      con.Dispose(); 
     } 
    } 
} 

+0

zu verwenden Was ist Ihre Frage? – Goran

+0

Sie Return-Anweisung sollte nach dieser Zeile sein. int i = (int) cmd.Parameter ["@ Ticket_Id"]. Wert; – ankur

+0

Ich brauche Ergebnis der Select-Abfrage in DAL-Klasse – hks

Antwort

0

Sie Select Scope_Identity() nach der Insert-Anweisung ausführen konnten. Dann in Ihrer DAL Methode return Convert.ToInt32(cmd.ExecuteScalar())

+0

Ich stimme dem ersten Teil zu, aber whislt der zweite Teil würde funktionieren Ich denke, es unessessary – Jodrell

1

Es ist nur eine Vermutung, nicht sicher.

cmd.Parameters["@Ticket_Id"].Direction = ParameterDirection.InputOutput; 

TO

cmd.Parameters["@Ticket_Id"].Direction = ParameterDirection.Output; 
1

, die nicht kompiliert werden Sie erhalten unerreichbaren Code

cmd.Parameters["@Ticket_Id"].Direction = ParameterDirection.InputOutput;    cmd.ExecuteNonQuery(); 
return (int)cmd.Parameters["@Ticket_Id"].Value; 

oder @ Matts Lösung unter ...

: Sie können eine der folgenden geben versuchen

Diese Besetzung ist auch zweifelhaft ...

Und in einem Multi-User-Szenario wird ticketid Rennen. Denken Sie daran, was passieren könnte (wird !!!), wenn Sie zwei von diesen gleichzeitig ausführen

Sollte in einer Transaktion verpackt werden.

Und Sie nicht Max benötigen, entweder, Verwenden SCOPE_IDENTITY

+0

bt wie scope_Identity zu verwenden? – hks

+0

Wählen Sie @TickID = @@ SCOPE_IDENTITY. Wenn Sie es googlen, erfahren Sie alles darüber, und wichtiger das Warum. –

0

ändern diese:

return cmd.ExecuteNonQuery(); 

zu

Int i = cmd.ExecuteScalar(); 

Wenn Sie nur von diesem Verfahren eine ganze Zahl zurückkehren.

ExecuteNonQuery() ist nicht die Methode, die Sie wollen hier