我无法使用C#将数据保存到我的SQL数据库中

时间:2019-01-02 19:56:31

标签: c#

我是C#的新手。我正在尝试将数字保存到SQL Server数据库表(本地)中,但是出现错误:

  

无法将NULL值插入列

我的代码:

private void SaveBtn_Click(object sender, EventArgs e)
{
     try
     { 
         SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\fn1965\Desktop\Work\TESTDB\NumDB.mdf;Integrated Security=True;Connect Timeout=30");

         conn.Open();
         string insert_query = "INSERT into [NumericTable] (Num1, Num2, Total) VALUES (@Num1, @Num2, @Total)";

         SqlCommand cmd = new SqlCommand(insert_query, conn);

         cmd.Parameters.AddWithValue("@Num1", textBox1.Text);
         cmd.Parameters.AddWithValue("@Num2", textBox2.Text);
         cmd.Parameters.AddWithValue("@Total", textBox3.Text);

         cmd.ExecuteNonQuery();

         MessageBox.Show("Record saved");

         conn.Close();
     }
     catch (Exception ex)
     {
         MessageBox.Show("EROR:"+ ex.ToString());
     }
}

表架构

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以在图像中看到,列Id是唯一不支持空值的列。由于该列不是标识,并且您没有在插入内容中提供值,因此INSERT失败,并带有给定的异常。这段代码将起作用(仅当已经没有Id = 1的记录时):

        string insert_query = "INSERT into [NumericTable] (Num1,Num2,Total, Id) Values (@Num1,@Num2,@Total, @id)";
        SqlCommand cmd = new SqlCommand(insert_query, conn);
        cmd.Parameters.AddWithValue("@Num1", textBox1.Text);
        cmd.Parameters.AddWithValue("@Num2", textBox2.Text);
        cmd.Parameters.AddWithValue("@Total", textBox3.Text);
        cmd.Parameters.AddWithValue("@Id", 1);
        cmd.ExecuteNonQuery();

我认为这显然不是所需的功能。您应该将Id列设置为identity = true或在插入内容上设置一个值。

我也建议您不要使用AddWithValue方法,因为它可能会导致您遇到一些不必要的问题。您可以在此处了解更多信息:https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/

答案 1 :(得分:2)

您为表格列设计拍摄的屏幕截图;回到这一点,然后单击id列,在Identity规范的“属性”网格中查找(可能需要将其展开)并将其设置为“是”。设置与您的需求相关的其他属性并保存表。

从另一个SO问题中借来的:

enter image description here

有多种方法可以通过脚本执行此操作,但是与在Management Studio中使用UI相比,它们通常更长或更尴尬。

这将(应该)更改列,因此当您为其他行插入值时,它会自动在其自身中插入一个递增数字。其他人已经发布了有关如何自己为其插入值的答案,但是作为学习者,我的建议是使用自动递增功能来节省提供您自己的主键值的不必要的麻烦