执行SQL存储过程

时间:2012-04-05 11:31:58

标签: c# sql stored-procedures

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 个答案:

答案 0 :(得分:1)

这只是猜测,不确定。您可以尝试以下方法:

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

TO

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

答案 1 :(得分:1)

那将无法编译您将获得无法访问的代码

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

或@ Matt的解决方案......

那个演员也是如此......

在多用户场景中,ticketid将参加比赛。 想想如果你同时运行其中两个,会发生什么(将会!!!)

应该包含在交易中。

你也不需要Max,使用Scope_Identity

答案 2 :(得分:0)

您可以在Insert语句后运行Select Scope_Identity()。然后在您的DAL方法return Convert.ToInt32(cmd.ExecuteScalar())

答案 3 :(得分:0)

改变这个:

return cmd.ExecuteNonQuery(); 

Int i = cmd.ExecuteScalar();

如果您只是从该过程返回一个整数。

ExecuteNonQuery()不是您要在此处使用的方法