2013-10-31 2 views
-1

행을 여러 테이블에 동시에 삽입하는 하나의 저장 프로 시저가 있습니다. 저장 프로 시저에는 해고되지 않는 문제가 있습니다. u는이 구문을 올바르게 볼 수 있고 작동하는지 확인할 수 있습니다.여러 테이블에 행 삽입 실패

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[InquiryPostReply] 
(
    @Inquiry_id VARCHAR(50), 
    @User_id VARCHAR(50), 
    @Priority_type VARCHAR(25), 
    @Status_name VARCHAR(50), 
    @Inquiry_Content VARCHAR(1024), 
    @Question_id NUMERIC(18,0), 
    @user_name VARCHAR(50) OUT, 
    @user_email VARCHAR(50) OUT, 
    @NewId VARCHAR(50) OUT 
) 
AS 
BEGIN 
SET NOCOUNT ON; 
declare @var1 int 
declare @var2 int 
declare @uniqueRef char(14) 
set @uniqueRef = dbo.UniqueRefNum(rand(), rand(), rand(), rand()) 
set @var1= (SELECT [Id] FROM [OmStocks].[dbo].[tbl_Status_master] WHERE ([email protected]_name)) 
set @var2= (SELECT [Id] FROM [OmStocks].[dbo].[tbl_Priority_master] WHERE ([email protected]_type)) 
set @user_email=(SELECT [Email_Address] FROM [OmStocks].[dbo].[tbl_Inquiry_History] WHERE ([email protected]_id)) 
set @user_name= (SELECT tbl_User_master.Full_Name FROM tbl_Inquiry_History INNER JOIN tbl_User_master ON tbl_Inquiry_History.User_id = tbl_User_master.Id WHERE([email protected]_id)) 
IF @var1 = '1' 
BEGIN 
    INSERT INTO [OmStocks].[dbo].[tbl_Inquiry_master] 
      ([Id],[Inquiry_id],[User_id],[Priority_id],[Status_id],[body]) 
    VALUES 
      (@uniqueRef,@Inquiry_id,@User_id,@var2,@var1,@Inquiry_Content) 
    INSERT INTO [OmStocks].[dbo].[tbl_Answer] 
      ([Question_id],[body],[Created_date]) 
    VALUES 
      (@Question_id,@Inquiry_Content,CONVERT(DATETIME,GETDATE(), 101)) 
    UPDATE [OmStocks].[dbo].[tbl_Inquiry_History] 
    SET [Priority_id] = @var2,[Status_id] = @var1,[IsDisplay] = 1,[IsReplied] = 1,[TimeStamp] = CONVERT(DATETIME,GETDATE(), 101) 
    WHERE ([email protected]_id) 
END 
ELSE IF @var1 = '2' 
BEGIN 
    INSERT INTO [OmStocks].[dbo].[tbl_Inquiry_master] 
      ([Id],[Inquiry_id],[User_id],[Priority_id],[Status_id],[body]) 
    VALUES 
      (@uniqueRef,@Inquiry_id,@User_id,@var2,@var1,@Inquiry_Content) 
    INSERT INTO [OmStocks].[dbo].[tbl_Answer] 
      ([Question_id],[body],[Created_date]) 
    VALUES 
      (@Question_id,@Inquiry_Content,CONVERT(DATETIME,GETDATE(), 101)) 
    UPDATE [OmStocks].[dbo].[tbl_Inquiry_History] 
    SET [Priority_id] = @var2,[Status_id] = @var1,[IsDisplay] = 1,[IsReplied] = 1,[TimeStamp] = CONVERT(DATETIME,GETDATE(), 101) 
    WHERE ([email protected]_id) 
END 
ELSE IF @var1 = '3' 
BEGIN 
    INSERT INTO [OmStocks].[dbo].[tbl_Inquiry_master] 
    ([Id],[Inquiry_id],[User_id],[Priority_id],[Status_id],[body]) 
    VALUES 
    (@uniqueRef,@Inquiry_id,@User_id,@var2,@var1,@Inquiry_Content) 
    INSERT INTO [OmStocks].[dbo].[tbl_Answer] 
      ([Question_id],[body],[Created_date]) 
    VALUES 
      (@Question_id,@Inquiry_Content,CONVERT(DATETIME,GETDATE(), 101)) 
    UPDATE [OmStocks].[dbo].[tbl_Inquiry_History] 
    SET [Priority_id] = @var2,[Status_id] = @var1,[IsDisplay] = 0,[IsReplied] = 1,[TimeStamp] = CONVERT(DATETIME,GETDATE(), 101),[Activity_expire_time] = CONVERT(DATETIME,GETDATE(), 101) 
    WHERE ([email protected]_id) 
END 
SET @NewId = @uniqueRef 
END 

관리 스튜디오에서 코드를 성공적으로 실행하지만 테이블에 레코드를 삽입하지 않는 동안이 저장 프로 시저가 정상적으로 작동하는 방법. 거기에 내가이 databasehelper.cs 코드를 포함 :

/// <summary> 
    /// Adds answer in the [tbl_Inquiry_master] table. 
    /// </summary> 
    public static void AddPostReply(string inquiry_id,string user_id,string priority_type, string status_name, string inquiry_content,int question_id,out string reply_id,out string user_name,out string user_email) 
    { 
     using (SqlConnection con = Util.GetConnection()) 
     { 
      con.Open(); 
      AddPostReply(con,inquiry_id,user_id,priority_type, status_name, inquiry_content, question_id,out reply_id,out user_name,out user_email); 
     } 
    } 
    /// <summary> 
    /// Adds answer in the [tbl_Inquiry_master] table. 
    /// </summary> 
    public static void AddPostReply(SqlConnection con, string inquiry_id, string user_id, string priority_type, string status_name, string inquiry_content, int question_id, out string reply_id, out string user_name, out string user_email) 
    { 
     AddPostReply(con, null, inquiry_id, user_id, priority_type, status_name, inquiry_content, question_id, out reply_id, out user_name, out user_email); 
    } 
    /// <summary> 
    /// Adds answer in the [tbl_Inquiry_master] table. 
    /// </summary> 
    public static void AddPostReply(SqlConnection con, SqlTransaction trans, string inquiry_id, string user_id, string priority_type, string status_name, string inquiry_content, int question_id, out string reply_id, out string user_name, out string user_email) 
    { 
     using (SqlCommand cmd = new SqlCommand("[dbo].[InquiryPostReply]", con)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@Inquiry_id", SqlDbType.VarChar).Value = inquiry_id; 
      cmd.Parameters.Add("@User_id", SqlDbType.VarChar).Value = user_id; 
      cmd.Parameters.Add("@Priority_type", SqlDbType.VarChar).Value = priority_type; 
      cmd.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = status_name; 
      cmd.Parameters.Add("@Inquiry_Content", SqlDbType.VarChar).Value = inquiry_content; 
      cmd.Parameters.Add("@Question_id", SqlDbType.Int).Value = question_id; 
      cmd.Parameters.Add("@user_name", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("@user_email", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output; 
      cmd.Parameters.Add("@NewId", SqlDbType.VarChar, 50).Direction = ParameterDirection.Output; 
      if (trans != null) 
      trans = con.BeginTransaction(); 
     cmd.ExecuteNonQuery(); 
     trans.Commit(); 
      user_name = Convert.ToString(cmd.Parameters["@user_name"].Value); 
      user_email = Convert.ToString(cmd.Parameters["@user_email"].Value); 
      reply_id = Convert.ToString(cmd.Parameters["@NewId"].Value); 
     } 
    } 

--------------------------------- -Updated ------------------------------------------

오류가 발생했습니다. 당신은, 당신의 연결에 거래를 열려면 문을 실행 한 다음 그 변경 사항을 적용 할 필요가

Server Error in '/OmInvestmentStockMarketing_new' Application. 

Object reference not set to an instance of an object. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 


Line 140:    trans = con.BeginTransaction(); 
Line 141:   cmd.ExecuteNonQuery(); 
Line 142:   trans.Commit(); 
Line 143:   user_name = Convert.ToString(cmd.Parameters["@user_name"].Value); 
Line 144:   user_email = Convert.ToString(cmd.Parameters["@user_email"].Value); 

Source File: c:\Documents and Settings\Vishal\My Documents\Visual Studio 2005\WebSites\OmInvestmentStockMarketing_new\App_Code\DatabaseHelper.cs Line: 142 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.] 
    DatabaseHelper.AddPostReply(SqlConnection con, SqlTransaction trans, String inquiry_id, String user_id, String priority_type, String status_name, String inquiry_content, Int32 question_id, String& reply_id, String& user_name, String& user_email) in c:\Documents and Settings\Vishal\My Documents\Visual Studio 2005\WebSites\OmInvestmentStockMarketing_new\App_Code\DatabaseHelper.cs:142 
    DatabaseHelper.AddPostReply(SqlConnection con, String inquiry_id, String user_id, String priority_type, String status_name, String inquiry_content, Int32 question_id, String& reply_id, String& user_name, String& user_email) in c:\Documents and Settings\Vishal\My Documents\Visual Studio 2005\WebSites\OmInvestmentStockMarketing_new\App_Code\DatabaseHelper.cs:120 
    DatabaseHelper.AddPostReply(String inquiry_id, String user_id, String priority_type, String status_name, String inquiry_content, Int32 question_id, String& reply_id, String& user_name, String& user_email) in c:\Documents and Settings\Vishal\My Documents\Visual Studio 2005\WebSites\OmInvestmentStockMarketing_new\App_Code\DatabaseHelper.cs:112 
    Admin_OWM_Inquiry_Post_Reply.btnsubmit_Click(Object sender, EventArgs e) in c:\Documents and Settings\Vishal\My Documents\Visual Studio 2005\WebSites\OmInvestmentStockMarketing_new\Admin\OWM_Inquiry_Post_Reply.aspx.cs:51 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 

저를 도와주세요 ..

+0

에 의해 기소 당신은 제거 트랜잭션을 커밋 할 필요가 트랜잭션 및 테스트. 오류는 trans.Commit() 행에 있습니다. 먼저 문제가 SP에 있는지 확인하십시오. – Paparazzi

+0

SP가 잘 작동합니다 ... –

+0

다음 trans는 null 일 가능성이 큽니다. 커밋 행에서 null을 테스트해야합니다. – Paparazzi

답변

1

:처럼 발생했습니다.

trans = con.BeginTransaction(); 
cmd.ExecuteNonQuery(); 
trans.Commit(); 
+0

이 코드는 내 코드에이 코드를 구현하는 데 도움이되지 않습니다. –

+0

내 응답에 따라 위에서 구현 한 코드가 작동해야합니다. 귀하가받는 오류는 SQL Server에서 버블 링되어 데이터가 커밋되고 있지만 충돌이 있음을 의미합니다. SQL 프로 시저를 수정해야합니다. – dgarbacz

+0

그리고 어떻게 수정합니까 .. –

1

IF @var1 = '1' AND @var1 = '2' 

항상 false

돌아갑니다 나에게 문제처럼 보인다 그리고 세 번째 dgarbacz

+0

저장 프로 시저를 업데이트하지만 업데이트 된 부분을 참조하십시오. –

+0

당신은 아직 트랜잭션을 커밋하지 않습니다. 먼저 거래를 제거하십시오. – Paparazzi

+0

나중에 내 질문을 업데이 트하고 제안을 제공합니다. –