如何解决此错误“不允许NULL,插入中止”?

时间:2019-01-11 03:04:11

标签: c# sql sql-server

我正在尝试调用存储过程以进行插入:

private void button1_Click(object sender, EventArgs e)
{
    string connectionString = @"Data Source=******;Initial Catalog=**********;Integrated Security=True";

    using (SqlConnection sqlCon = new SqlConnection(connectionString: connectionString))
    {
        using (SqlCommand cmd = new SqlCommand("InsertAngajat", sqlCon))
        {
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@Nume", SqlDbType.VarChar).Value = textBox1.Text;
            cmd.Parameters.Add("@Prenume", SqlDbType.VarChar).Value = textBox2.Text;
            cmd.Parameters.Add("@DataNasterii", SqlDbType.Date).Value = textBox4.Text;
            cmd.Parameters.Add("@DataAngajare", SqlDbType.Date).Value = DateTime.Today.ToString();
            cmd.Parameters.Add("@cnp", SqlDbType.Char).Value = textBox3.Text.ToCharArray();
            cmd.Parameters.Add("@Localitate", SqlDbType.VarChar).Value = textBox8.Text;
            cmd.Parameters.Add("@Judet", SqlDbType.VarChar).Value = textBox10.Text;
            cmd.Parameters.Add("@Strada", SqlDbType.VarChar).Value = textBox9.Text;
            cmd.Parameters.Add("@Departament", SqlDbType.VarChar).Value = comboBox1.Text;
            cmd.Parameters.Add("@Telefon", SqlDbType.Char).Value = textBox5.Text.ToCharArray();

            if (checkBox1.Checked) 
                cmd.Parameters.Add("@Sex", SqlDbType.Char).Value = 'M';
            else if (checkBox2.Checked) 
                cmd.Parameters.Add("@Sex", SqlDbType.Char).Value = 'F';
            else 
                MessageBox.Show("Nu a fost bifat sexul");

            cmd.Parameters.Add("@Numar", SqlDbType.Int).Value = Convert.ToInt32(textBox11.Text);
            cmd.Parameters.Add("@Salariu", SqlDbType.Int).Value = Convert.ToInt32(textBox6.Text);

            sqlCon.Open();
            cmd.ExecuteNonQuery();
        }
    }

    this.Close();  
}

但这是我按下按钮并保存所有内容时遇到的错误。

https://i.imgur.com/0tixhsu.png

这是SQL Server存储过程:

ALTER PROCEDURE [dbo].[InsertAngajat] 
    @Nume VARCHAR(50), 
    @Prenume VARCHAR(50),
    @Departament VARCHAR(50),
    @cnp CHAR(13),
    @DataNasterii DATE,
    @Telefon VARCHAR(12) = "NONE",
    @DataAngajare DATE,
    @Salariu INT,
    @Sex CHAR(1) = 'F',
    @Judet VARCHAR(50),
    @Localitate VARCHAR(50),
    @Strada VARCHAR(50),
    @Numar INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DepID INT = (SELECT D.DepartamentID 
                          FROM Departamente D 
                          WHERE D.[Nume Departament] = @Departament);

    INSERT INTO [dbo].Angajat (Nume, Prenume, DepartamentID, CNP, DataNasterii,
                               Telefon, DataAngajarii, Salariu, Sex, Localitate,
                               [Sector/Judet], Strada, nr)
    VALUES (@Nume, @Prenume, @DepID, @cnp, @DataNasterii,
            @Telefon, @DataAngajare, @Salariu, @Sex, @Localitate,
            @Judet, @Strada, @Numar)        
END

我确保文本框包含数据。我不知道还能尝试什么。

我希望只要文本框中的值不是NULL,就可以轻松插入其所有数据。

2 个答案:

答案 0 :(得分:5)

在我看来,您的问题可能在于此行:

Declare @DepID int = (Select D.DepartamentID From Departamente D Where D.[Nume Departament] = @Departament);

如果该查询没有结果怎么办?我有些生疏,但我想@DepId将是NULL。然后,当您尝试将其插入表中时,将插入一个空值。

解决方案:在您的程序中,或者在调用插入项之前,请检查该部门是否存在。

答案 1 :(得分:0)

运行您的sql事件探查器并跟踪调用。这样,您将确定所有输入参数。然后手动执行您的过程调用。您将可以在过程中找到确切的问题和具体内容。尝试使用@DepID int = 1的固定值。如果运行成功。然后,您必须优化此代码行,如下所示: 声明@DepID int =(从部门D的D中选择isull(D.DepartamentID,0),其中D. [Nume Departament] = @Departament);

您的部门表似乎没有该部门的数据。