2016-07-20 38 views
0

プライマリキーと外部キーがID、プライマリキーがidLeaveCategory、外部キーがLeaveCategoryIdのテーブルがあります。しかし、私はこのエラーを受け取ります:列 'ID'のテーブルにNULL値を挿入できません。

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

PRIMARY KEYはnullにすることはできません。あなたの記録を一意に識別するフィールドです。 IDフィールドの値を指定しないと、PRIMARY KEYの基本概念と衝突します。

IDフィールドに割り当てる値がわからない場合は、IDENTITYオプションを使用してその列をマークし、Sql Serverが次のUNIQUE値を計算するようにするだけです。その後

、あなたは、あなたのテーブルへの外部キーを追加した場合、あなたはところで

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(); 
    } 
} 

への簡単な変更あなたのコードでしID列に割り当てられているどのような値を知りたい場合はこのフィールドにも値を与える必要があります。フィールドLeaveCategoryIdは、LeaveCategoryテーブルの外部キーです。これが真の場合は、入力データの一部からフィールドに値を与える必要があります。

補足として、グローバル接続オブジェクトを使用しているようです。これは推奨されておらず、ローカル接続オブジェクトを作成して使用し、できるだけ早く処分する必要があります。 See Using Statement

+0

彼は接続を閉じているので大丈夫だと思います。クローズはリフレクタで見ればかなりのものです。 – Cato

+0

はい、しかしグローバル変数は常にです危険なビジネス。そして、私は彼がこの文脈でグローバル接続オブジェクトからどんな利点を得るのか見当たりません。 – Steve

+0

ええ、私は同意します、何も得られず、どこかで間違って行くことができます – Cato

0

テーブル 'dbo.Action'のカラム 'ID'が主キー(UNIQUE)であるため、NULL値は許可されません。そのテーブルに 'dbo.Action'を挿入する際には、 IDENTITY(特定の分野のために)

関連する問題