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

C# 我无法使用C将数据保存到SQL数据库#,c#,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\f

我是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());
     }
}
表模式


您可以在图像中看到,
Id
列是唯一不支持空值的列。由于列不是标识,并且您没有在insert上提供值,因此insert失败,出现给定的异常。此代码将起作用(仅当没有Id=1的记录时):

我认为这显然不是期望的功能。您应该做的是将Id列设置为identity=true或在insert上设置一个值


我还建议您不要使用
AddWithValue
方法,因为它可能会导致一些不希望出现的问题。您可以在此处阅读更多内容:

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

借用另一个SO问题:

有一些方法可以从脚本中实现这一点,但它们通常比在ManagementStudio中使用UI要长/更麻烦


这将(应该)更改第th列,以便在您为其他行插入值时,它会自动向自身插入递增的数字。其他人已经发布了一个关于如何自己插入值的答案,但作为一名学习者,我建议您使用auto increment来避免提供自己的主键值所带来的额外不必要的复杂性

听起来好像您试图将NULL插入到数据库中定义为“不允许NULL”的列中这意味着您正在将空值传递给表中的一列,该列除了
NULLS
之外,不会查看表NumericTable的模式信息。是否有其他未从查询中设置的列?允许这些列获取空值吗?提供表结构,希望您在插入过程中有一些主键而不是设置值。旁注:如果这些列包含数字数据,那么它们究竟为什么定义为
nvarchar(50)
??使用最合适的数据类型-始终,无例外。而且
nvarchar(50)
肯定不是存储数值的最合适的数据类型!使用
int
bigint
decimal
-任何适合您需要的操作如果存在ID为1的记录,则此操作将不起作用,因为它将违反主键约束。我想这不是故意的,只是吹毛求疵。如果OP希望插入自己的主键,他们需要先查询表以查找唯一的整数,或者修改查询以查找唯一的整数值并将其用作主键。在任何情况下,使用标识自动增量都要容易得多。我建议不要使用这种数据访问方法,而是学习实体框架!)@RyanWilson你说得对我会做相应的edit@NicoRiff感谢您更新您的答案。:)@CaiusJard每个人都喜欢用什么。我更喜欢使用整洁,因为我个人不喜欢EF。如果OP想对DB有更多的控制权并继续编写查询,我肯定会选择Dapper。但这是我的偏好。
        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();