2013-08-30 20 views
0

ASP.NET MVC 4에서 C# 및 SQL을 사용하여 작업하고 있습니다. 내가 처음 테이블에 데이터를 삽입 한 다음 Mem_Details 테이블에 Mem_IdMem_Basic 테이블에서 새로 삽입 된 ID를 삽입 할두 테이블에 차례로 데이터를 삽입하십시오.

CREATE TABLE [dbo].[Mem_Basic] (
    [Id]  INT   IDENTITY (1, 1) NOT NULL, 
    [Mem_NA] VARCHAR (100) NOT NULL, 
    [Mem_Occ] VARCHAR (200) NOT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

CREATE TABLE [dbo].[Mem_Details] (
    [Id]   INT   IDENTITY (1, 1) NOT NULL, 
    [Mem_Id]  INT   NOT NULL, 
    [Mem_Role] VARCHAR (250) NOT NULL, 
    [Mem_Email] VARCHAR (50) NULL, 
    [Mem_MPh]  VARCHAR (15) NULL, 
    [Mem_DOB]  DATE   NULL, 
    [Mem_BGr]  NCHAR (10) NULL, 
    [Mem_WAnn] DATE   NULL, 
    [Mem_Spouse] VARCHAR (75) NULL, 
    [Mem_Web]  VARCHAR (300) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

:

나는 두 개의 테이블이 동일한 만들기 버튼을 사용합니다.

그 후 첫 번째 테이블의 ID를 반환하고 싶습니다. 난 단지 첫 번째 테이블에 데이터를 삽입하고 아이디를 반환합니다 다음 C# 코드

public int CreateNewMember(string Mem_NA, string Mem_Occ) 
{ 
     using (SqlConnection con=new SqlConnection(Config.ConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("INSERT INTO Mem_Basic(Mem_Na, Mem_Occ) output INSERTED.Id VALUES(@na, @occ)", con)) 
      { 
       cmd.Parameters.AddWithValue("@na", Mem_NA); 
       cmd.Parameters.AddWithValue("@occ", Mem_Occ); 
       con.Open(); 

       int modified = (int)cmd.ExecuteScalar(); 

       using (SqlCommand cmd1 = new SqlCommand("INSERT INTO Mem_Details (Mem_Id, Mem_Role) VALUES (@id, @role)", con)) 
       { 
        cmd.Parameters.AddWithValue("@id", modified); 
        cmd.Parameters.AddWithValue("@role","Member"); 
       } 

       if (con.State == System.Data.ConnectionState.Open) con.Close(); 
       return modified; 
      } 
     } 
    } 

이 사용하고 있습니다.

+2

절대 ExecuteSca lar 두 번째 cmd –

+0

int를 사용하는 경우 = (int) cmd1.ExecuteScalar(); 두 번째 cmd에서 스칼라 변수 "@id"를 선언해야 함을 보여줍니다. 그리고 만약 내가 두 번째 cmd ExecuteonQuery를 사용하면 두 번째 테이블에 데이터를 삽입하고 두 번째 테이블에 삽입하지 – neel

+0

@ Parvathiiiii 대답 – Ehsan

답변

0

시도해보십시오.

public int CreateNewMember(string Mem_NA, string Mem_Occ) 
     { 
      using (SqlConnection con=new SqlConnection(Config.ConnectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.Id VALUES(@na,@occ)", con)) 
       { 
        cmd.Parameters.AddWithValue("@na", Mem_NA); 
        cmd.Parameters.AddWithValue("@occ", Mem_Occ); 
        con.Open(); 
        int modified = (int)cmd.ExecuteScalar(); 
        using (SqlCommand cmd1 = new SqlCommand("INSERT INTO Mem_Details (Mem_Id,Mem_Role) VALUES (@id,@role)", con)) 
        { 
         cmd1.Parameters.AddWithValue("@id", modified); 
         cmd1.Parameters.AddWithValue("@role","Member"); 
         cmd1.ExecuteNonQuery(); 
        } 
        if (con.State == System.Data.ConnectionState.Open) con.Close(); 
        return modified; 
       } 
      } 
     } 
+1

두 번째를 사용하여 cmd1을 사용해야합니다. cmd가 아닙니다. – Ehsan

+0

감사합니다. 근무 ... – neel

+0

@ Parvathiiiii 그것이 맞지 않을 때 어떻게 작동 할 수 있습니까? – Ehsan

0

당신은 내가 저장 프로 시저를 사용하여

using (var conn = new SqlConnection(connectionString)) 
using (var command = new SqlCommand("CreateNewMember", conn) { 
          CommandType = CommandType.StoredProcedure }) { 
    command.Parameters.AddWithValue("@na", Mem_NA); 
    command.Parameters.AddWithValue("@occ", Mem_Occ); 
    command.Parameters.AddWithValue("@role","Member"); 
    conn.Open(); 
    modified = (int)command.ExecuteScalar(); 
    conn.Close(); 
} 

다음과 같이 코드를 변경 것 exeute 스칼라에게

public int CreateNewMember(string Mem_NA, string Mem_Occ) 
    { 
     using (SqlConnection con=new SqlConnection(Config.ConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.Id VALUES(@na,@occ) SELECT SCOPE_IDENTITY()", con)) 
      { 
       cmd.Parameters.AddWithValue("@na", Mem_NA); 
       cmd.Parameters.AddWithValue("@occ", Mem_Occ); 
       con.Open(); 
       int modified = (int)cmd.ExecuteScalar(); 
       using (SqlCommand cmd1 = new SqlCommand("INSERT INTO Mem_Details (Mem_Id,Mem_Role) VALUES (@id,@role) ", con)) 
       { 

        cmd1.Parameters.AddWithValue("@id", modified);// change here 
        cmd1.Parameters.AddWithValue("@role","Member");// change here 
        cmd1.ExecuteNonQuery(); //added this 
       } 
       if (con.State == System.Data.ConnectionState.Open) con.Close(); 
       return modified; 
      } 
     } 
    } 
+0

int id = cmd1.ExecuteScalar(); 내가 캐스팅 오류를 보여줍니다 그래서 int id = (int) cmd1.ExecuteScalar() ;. "개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 오류 – neel

+0

이 아닌 쿼리를 실행할 수 있습니다. 아무것도 돌려주지 않으면. – Ehsan

2

를 두 번째 사용하여 블록에 CMD1 cmd를 변경 한 다음 호출 할 필요가

create proc CreateNewMember 
(
    @na nvarchar(100), 
    @occ nvarchar(100), 
    @role nvarchar(250) 
) 
as 
begin 

declare @ID int 

     INSERT INTO Mem_Basic(Mem_Na,Mem_Occ) output INSERTED.Id VALUES(@na,@occ) 

     select @ID = Scope_Identity() 

     INSERT INTO Mem_Details (Mem_Id,Mem_Role) VALUES (@ID,@role) 

     SELECT @ID 
end 
+0

및 첫 번째 테이블 ID를 반환하는 방법 – neel

+0

@Parvathiiiii 대답 업데이트 – Damith

관련 문제