2016-07-20 3 views
0

У меня есть таблица с первичной и внешней ключами ID, первичный ключ id от LeaveCategory и внешний ключ = LeaveCategoryId. Но я получаю эту ошибку:Невозможно вставить значение NULL в столбец «ID», таблица

Cannot insert the value NULL into column 'ID', table 'dbo.Action'; column does not allow nulls. INSERT fails

Но я действительно не знаю, как исправить эту проблему.

Это моя ошибка:

click image

Это код:

public partial class AddLeaveType : System.Web.UI.Page 
{ 
    int id = 0; 

    SqlConnection conn = null; 
    SqlCommand cmd = null; 

    string connectionString = null; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
      if (!IsPostBack) 
      { 
       SqlDataReader dr = null; 

       connectionString = ConfigurationManager.ConnectionStrings["LeaveManagementCS"].ConnectionString; 

       conn = new SqlConnection(connectionString); 

       string sql = "SELECT * FROM LeaveCategory"; 

       try 
       { 
        cmd = new SqlCommand(sql, conn); 

        conn.Open(); 

        dr = cmd.ExecuteReader(); 

        while(dr.Read()) 
        { 
         ListItem item = new ListItem(dr["Category"].ToString(), dr["Id"].ToString()); 
         ddlCategory.Items.Add(item); 
        } 

        dr.Close(); 
       } 
       catch (Exception ex) 
       { 
        lblOutput.Text = "Error Message: " + ex.Message; 
       } 
       finally 
       { 
        if (conn != null) 
         conn.Close(); 
       } 
      } 
    } 

    protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     connectionString = ConfigurationManager.ConnectionStrings["LeaveManagementCS"].ConnectionString; 

     conn = new SqlConnection(connectionString); 

     string sql = "INSERT INTO LeaveType (Type, Description, NumOfDays) "; 
     sql += "VALUES (@type, @desc, @nod)"; 

     try 
     { 
       cmd = new SqlCommand(sql, conn); 

       cmd.Parameters.AddWithValue("@type", tbType.Text); 
       cmd.Parameters.AddWithValue("@desc", tbDesc.Text); 
       cmd.Parameters.AddWithValue("@nod", tbNod.Text); 

       conn.Open(); 

       int rows = cmd.ExecuteNonQuery(); 

       if (rows > 0) 
       { 
        lblOutput.Text = "Added successfully"; 
       } 
     } 
     catch (Exception ex) 
     { 
      lblOutput.Text = "Error Message:" + ex.Message; 
     } 
     finally 
     { 
      if (conn != null) 
       conn.Close(); 
     } 
    } 
} 

Правильный выход:

click image

ответ

3

ПЕРВИЧНЫЙ КЛЮЧ не может быть пустым. Это поле однозначно идентифицирует вашу запись. Если вы не укажете значение поля ID, вы столкнетесь с базовой концепцией PRIMARY KEY.

Если вы не знаете, какое значение присваивается полю ID, вы можете просто пометить этот столбец параметром IDENTITY и позволить Sql Server рассчитать следующее значение UNIQUE для вас.

После этого, если вы хотите знать, какое значение было назначено на колонке ID вы могли бы просто изменить код, чтобы

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    connectionString = ConfigurationManager.ConnectionStrings["LeaveManagementCS"].ConnectionString; 

    conn = new SqlConnection(connectionString); 

    string sql = "INSERT INTO LeaveType (Type, Description, NumOfDays) "; 
    sql += "VALUES (@type, @desc, @nod);"; // Note the semicolon in query here 
    sql += "SELECT SCOPE_IDENTITY()"; 

    try 
    { 
     cmd = new SqlCommand(sql, conn); 

     cmd.Parameters.AddWithValue("@type", tbType.Text); 
     cmd.Parameters.AddWithValue("@desc", tbDesc.Text); 
     cmd.Parameters.AddWithValue("@nod", tbNod.Text); 

     conn.Open(); 

     int newID = Convert.ToInt32(cmd.ExecuteScalar()); 
     if (newID > 0) 
     { 
      lblOutput.Text = "Added successfully"; 
     } 

    } 
    catch (Exception ex) 
    { 
     lblOutput.Text = "Error Message:" + ex.Message; 
    } 
    finally 
    { 
     if (conn != null) 
      conn.Close(); 
    } 
} 

Кстати, если вы добавили внешний ключ к вашему столу, то вы также должны указать значение этого поля. Похоже, что поле LeaveCategoryId является внешним ключом к таблице LeaveCategory. Если это так, то вы должны указать значение поля из некоторых ваших входных данных.

Как видно, вы используете глобальный объект соединения. Это не рекомендуется, и вы должны создать локальный объект соединения, использовать его и затем утилизировать как можно скорее. See Using Statement

+0

это нормально, потому что он закрывает соединение, я думаю, что .close в значительной степени является .dispose, если вы посмотрите на него в отражателе. – Cato

+0

Да, но глобальные переменные всегда являются рискованное дело. И я не вижу, какое преимущество он получает от глобального объекта соединения в этом контексте. – Steve

+0

Да, я согласен, он ничего не получает и может быть сделано неправильно – Cato

0

Поскольку ваш идентификатор столбца в таблице «dbo.Action» является первичным ключом (UNIQUE). Он не допускает никаких значений NULL. Поэтому, вставляя в эту таблицу «dbo.Action», используйте любые целые числа или набор IDENTITY для определенного поля (чтобы он автоматически увеличивался)

Смежные вопросы