2016-10-19 2 views
-2

이 오류 메시지가 나타납니다. 'NULL'값을 'id', table ''열에 삽입 할 수 없습니다. 열이 널을 허용하지 않습니다. INSERT가 실패합니다. 미리 감사드립니다TextBox에서 SQL에 값을 삽입하십시오.

protected void AddItem(object sender, EventArgs e) 
    { 

     string insertCmd = "INSERT INTO Picture (Album, id) VALUES (@Album, @id)"; 
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["strConn"].ConnectionString)) 
     { 
      conn.Open(); 
      SqlCommand myCommand = new SqlCommand(insertCmd, conn); 
      // Create parameters for the SqlCommand object 
      // initialize with input-form field values 
      myCommand.Parameters.AddWithValue("@Album", txtAlbum.Text); 
      myCommand.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output; 
      myCommand.ExecuteNonQuery(); 

      int id = (int)myCommand.Parameters["@id"].Value; 
     } 
    } 
+0

데이터베이스에 삽입하기 전에 null 값을 비워두기 만하면됩니다. – Meena

답변

0

ID가 IDENTITY column 인 것으로 가정합니다. 이 값은 데이터베이스 엔진에 의해 자동으로 생성되며 레코드에 할당 된 값을 알아야합니다.

그럼 당신은

string insertCmd = @"INSERT INTO Picture (Album) VALUES (@Album); 
        SELECT SCOPE_IDENTITY()"; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["strConn"].ConnectionString)) 
{ 
    conn.Open(); 
    SqlCommand myCommand = new SqlCommand(insertCmd, conn); 
    myCommand.Parameters.AddWithValue("@Album", txtAlbum.Text); 
    int newID = Convert.ToInt32(myCommand.ExecuteScalar()); 
} 

쿼리 텍스트가 지금 세미콜론 (;)으로 첫 번째 명령에서 분리 된 두 번째 명령 SELECT SCOPE_IDENTITY()를 포함에 쿼리를 변경해야합니다. SCOPE_IDENTITY은 현재 범위에서 데이터베이스 엔진에 의해 생성 된 마지막 IDENTITY 값을 반환합니다.

이제 명령은 출력 매개 변수

0

내가 ID 정체성이라고 생각을 사용하지 않고 쿼리 텍스트에 존재하는 마지막 문에 의해 반환 된 단일 값을 다시 얻기 위해 ExecuteScalar는을 사용하여 실행됩니다. 이 값을 추가 할 필요는 없습니다. 자동으로 ID를 얻으면 다음 코드를 시도하고 데이터베이스를 확인합니다. 아래 그림과 같이

string insertCmd = "INSERT INTO Picture (Album) VALUES (@Album)"; 
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["strConn"].ConnectionString)) 
     { 
      conn.Open(); 
      SqlCommand myCommand = new SqlCommand(insertCmd, conn); 
      // Create parameters for the SqlCommand object 
      // initialize with input-form field values 
      myCommand.Parameters.AddWithValue("@Album", txtAlbum.Text); 

      myCommand.ExecuteNonQuery(); 


     } 

I의 경우 당신은, 당신이 ID의 정체성을 제거하는 데이터베이스의 스키마를 변경해야 ID를 자신합니다 (dB에서 withoud 자동 증가)을 설정하려면 :

enter image description here

이 도움이 되었기를 바랍니다.

0

이 열을 비워 둘 필요가 있으면 ''(공백)으로 바꿀 수 있습니다. 이렇게하면 열이 ""

수없는 경우 작동 또는 사용하려고합니다

대신 null 값이 발생하는 값을

NVL (문자열 1, replace_with)

0

저장 프로 시저를 사용하여이 작업을 수행 할 수 있습니다. 아래 저장 프로 시저 만들기 스크립트가 있습니다.

CREATE PROCEDURE [dbo].[InsertIntoPicture] 
    @Album varchar(500)=null, 
    @id int=0 output 
AS 
BEGIN 
    insert INTO Picture(Album)VALUES(@Album) 
    SET @[email protected]@IDENTITY 
END 

다음은 C#으로 저장된 저장 프로 시저의 코드입니다.

string insertCmd = "InsertIntoPicture"; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["strConn"].ConnectionString)) 
    { 
    conn.Open(); 
    SqlCommand myCommand = new SqlCommand(insertCmd, conn); 
    myCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.Parameters.AddWithValue("@Album", txtAlbum.Text); 
    myCommand.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output; 
    myCommand.ExecuteNonQuery(); 

    int id = (int)myCommand.Parameters["@id"].Value; 
    } 

은 위의 코드를 사용하면 텍스트 상자에서 날짜를 삽입 할 수 있으며, 또한 당신의 요구 사항에 따라 출력 변수로 마지막으로 삽입 한 레코드 ID를 얻는다.

감사합니다.

관련 문제