0
ALTER PROCEDURE dbo.SP_InsertTicket
    /*
    (
    @parameter1 int = 5,
    @parameter2 datatype OUTPUT
    )
    declare @i as numeric
    exec SP_InsertTicket 'asd','cd@y.com','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 @Ticket_Id=@TickID

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

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

     END

    RETURN

これは、電子メール アプリ経由で送信するために Ticket_Id を返す必要がある私のストア プロシージャです。レコードを適切に挿入しますが、DAL で値を取り消すことができません。以下は、値を返すストアド プロシージャを実行するためのコードです。

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();
        }
    }
}

4

4 に答える 4

1

それは単なる推測ですが、確かではありません。次のことを試してみてください。

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

cmd.Parameters["@Ticket_Id"].Direction = ParameterDirection.Output;
于 2012-04-05T11:39:56.400 に答える
1

それはコンパイルされず、到達不能なコードが得られます

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

または以下の@Mattのソリューション...

あの配役も怪しい…

また、複数ユーザーのシナリオでは、チケット ID が競合します。これらのうちの 2 つを同時に実行した場合に何が起こるかを考えてみてください。

トランザクションでラップする必要があります。

また、Max も必要ありません。Scope_Identity を使用します

于 2012-04-05T11:43:51.613 に答える
0

Select Scope_Identity()Insertステートメントの後に実行できます。次に、DALメソッドでreturn Convert.ToInt32(cmd.ExecuteScalar())

于 2012-04-05T11:39:21.177 に答える
0

これを変える:

return cmd.ExecuteNonQuery(); 

Int i = cmd.ExecuteScalar();

そのプロシージャから整数を 1 つだけ返す場合。

ExecuteNonQuery()ここで使用したい方法ではありません

于 2012-04-05T16:04:12.067 に答える