无法将值 NULL 插入列“EmpId”[关闭]

Posted

技术标签:

【中文标题】无法将值 NULL 插入列“EmpId”[关闭]【英文标题】:Cannot insert the value NULL into column 'EmpId' [closed] 【发布时间】:2016-02-10 12:42:50 【问题描述】:

我有一个 Employee 模型/类和一个等效的 Employee 数据库。当我将一个新员工插入数据库时​​,没有年龄值,它不起作用。我正在使用 windowsform,并且在我的数据库中定义了年龄和 maritalStatus 列,并且将 c# 代码定义为可为空的。

当我在表单中填写所有 4 个文本框值时,它就可以工作了。 当我填写名字、姓氏、年龄和离开已婚的文本框时 我的表单中的文本框为空,它可以工作(即它创建一个新员工和 在数据库中将 Married 列设置为 null)。 当我为 Firstname、Lastname、Married 和 Married 填充文本框值时 在我的表单中将年龄文本框留空,它不起作用。

请帮忙,我不知道我做错了什么。

员工类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NullableTypeDatabase

    public class Employee
    
        int empID;
        string firstName;
        string lastName;
        int? married;
        int? age;


        public int EmpID
        
            get  return empID; 
            set  empID = value; 
        


        public string FirstName
        
            get  return firstName; 
            set  firstName = value; 
        


        public string LastName
        
            get  return lastName; 
            set  lastName = value; 
        


        public int? Married
        
            get  return married; 
            set  married = value; 
        

        public int? Age
        
            get  return age; 
            set  age = value; 
        
    

WINFORM 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NullableTypeDatabase

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void ClickSaveNewUser(object sender, EventArgs e)
        
            if (ValidateStringInputFields() && ValidateIntInputFields())
            
                int? convertAge = int.Parse(txtAge.Text);
                if(NullableTypeDB.AddNewEmployee(txtFname.Text, txtLname.Text, comBoxMaritalStatus.SelectedIndex, convertAge) == 1)
                
                    MessageBox.Show("A New Employee Record has been Successfully Added");
                
            


        

        private bool ValidateStringInputFields()
        
            var controls = new[]  txtFname, txtLname;

            bool isValid = true;
            foreach (var control in controls.Where(e => String.IsNullOrEmpty(e.Text)))
            
                errorProviderTxtBoxes.SetError(control, "Please fill the required field");

                isValid = false;
            

            return isValid;
        



        private bool ValidateIntInputFields()
        
            bool isValid = false;
            int resultAge; 
            if(int.TryParse(txtAge.Text, out resultAge))
            
                isValid = true;
            

            return isValid;
        




    

访问数据库的类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace NullableTypeDatabase

    public class NullableTypeDB
    
        public static SqlConnection GetConnection()
        
            string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\Z\documents\visual studio 2013\Projects\NullableTypeDatabase\NullableTypeDatabase\EmployeeInfo.mdf;Integrated Security=True";

            SqlConnection connection = new SqlConnection(connectionString);
            return connection;

        


        public static int AddNewEmployee(string fname, string lname, int? maritalStat, int? age)
        

            int returnAffectedRow;

            SqlConnection con = GetConnection();
            string queryStatement = "INSERT INTO Employee(firstname, lastname, married, age) VALUES (@fname, @lname, @maritalStat, @age)";
            SqlCommand sqlCmd = new SqlCommand(queryStatement, con);
            sqlCmd.Parameters.AddWithValue("@fname", fname);
            sqlCmd.Parameters.AddWithValue("@lname", lname);

            if(maritalStat == 0)
            
                string convertIndex0 = "True";
                sqlCmd.Parameters.AddWithValue("@maritalStat", convertIndex0);
            

            else if (maritalStat == 1)
            
                string convertIndex1 = "False";
                sqlCmd.Parameters.AddWithValue("@maritalStat", convertIndex1);
            

            else
            
                sqlCmd.Parameters.AddWithValue("@maritalStat", DBNull.Value);
            



            //if (age.HasValue)
            //
            //    sqlCmd.Parameters.AddWithValue("@age", age.Value);

            //
            //else if (age.GetValueOrDefault() == 0)
            //
            //    sqlCmd.Parameters.AddWithValue("@age", DBNull.Value);

            //

           // sqlCmd.Parameters.AddWithValue("@age", age == 0? DBNull.Value : (object)age);
            sqlCmd.Parameters.AddWithValue("@age", age.HasValue? age.Value : (object)DBNull.Value);

            try
            
                con.Open();
               returnAffectedRow = sqlCmd.ExecuteNonQuery();

            
            catch (SqlException ex)
            

                throw ex;
            
            finally
            
                con.Close();
            
            return returnAffectedRow;
        




    

【问题讨论】:

年龄可以在数据库中定义为不为空,这意味着它不能有空值。 “它不起作用”通常是不够的信息 - 您应该告诉我们如何它不起作用。有错误信息吗?例外? 你能出示你的CREATE TABLE声明吗? 您可能希望使用sqlCmd.Parameters.Add("@age", SqlDbType.Int).Value = age.HasValue ? age.Value : (object)DBNull.Value; 而不是AddWithValue 我尝试重新定义该方法,现在效果更好: private int ValidateAgeInput(string ageInput) int result = 0; if (string.IsNullOrEmpty(ageInput)) 结果 = 0; else if (!string.IsNullOrEmpty(ageInput)) int resultAge; if (int.TryParse(txtAge.Text, out resultAge)) result = resultAge; 返回结果; 【参考方案1】:
int? convertAge = int.Parse(txtAge.Text);

这条线是你的问题。你正在解析一个空字符串,它只是失败了(我假设)。在此处查找 int.TryParse() How to parse a string into a nullable int

【讨论】:

感谢您的意见。我尝试了一些不同的东西,现在可以了。私有 int ValidateAgeInput(string ageInput) int result = 0; if (string.IsNullOrEmpty(ageInput)) 结果 = 0; else if (!string.IsNullOrEmpty(ageInput)) int resultAge; if (int.TryParse(txtAge.Text, out resultAge)) result = resultAge; 返回结果; 【参考方案2】:

您说代码允许它为空,但实际上不允许。在您下面的 Validate 方法中,如果您没有在文本框中输入有效的 Age,该方法将返回 false,因此不会执行您的更新。

    private bool ValidateIntInputFields()
    
        bool isValid = false;
        int resultAge; 
        if(int.TryParse(txtAge.Text, out resultAge))
        
            isValid = true;
        

        return isValid;
    

此外,您的按钮内的代码假定此行总是有一个年龄:

 int? convertAge = int.Parse(txtAge.Text);

如果你想让年龄为空,你需要做这样的事情:

    private bool ValidateIntInputFields()
    
        if(string.IsNullOrEmpty(txtAge.Text))
             return true;

        bool isValid = false;
        int resultAge; 
        if(int.TryParse(txtAge.Text, out resultAge))
        
            isValid = true;
        

        return isValid;
    

    private void ClickSaveNewUser(object sender, EventArgs e)
    
        if (ValidateStringInputFields() && ValidateIntInputFields())
        
            int? convertAge = null;

            if( !string.IsNullOrEmpty(txtAge.Text) )
                convertAge = int.Parse(txtAge.Text);

            if(NullableTypeDB.AddNewEmployee(txtFname.Text, txtLname.Text, comBoxMaritalStatus.SelectedIndex, convertAge) == 1)
            
                MessageBox.Show("A New Employee Record has been Successfully Added");
            
        
    

【讨论】:

以上是关于无法将值 NULL 插入列“EmpId”[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列 CreationTime

无法将值 NULL 插入“ID”列

无法将值 NULL 插入列“id”、表“XXX”;列不允许空值。插入失败

EF Code First - 无法将值 NULL 插入列

SqlException:无法将值 NULL 插入列“x”;列不允许空值。插入失败

ADO.NET SqlCommand:无法将值 NULL 插入列