只有在使用列列表且IDENTITY_INSERT为 ON 时,才能指定表 "Fee" 中标识列的显式值



我在SQL Server中创建了这个表来存储有关学生费用的数据:

create table Fee(
feeID int primary key identity(1,1),
classID int foreign key references Class(classID),
nameID int foreign key references Students(studentsID),
firstNameID int foreign key references Students(studentsID),
dateOfAdmission varchar(50),
monthKey int foreign key references Month(monthID), sum int
)

在Visual Studio中,我尝试使用以下方法将数据保存在表中:

private void btn_fee_Save_Click(object sender, EventArgs e)
{
int Class = Convert.ToInt32(cmbFeeClass.SelectedValue.ToString());
int Name = Convert.ToInt32(cmbFeeName.SelectedValue.ToString());
int firstName = Convert.ToInt32(cmbFeeFirstName.SelectedValue.ToString());
int Month = Convert.ToInt32(cmbMonth.SelectedValue.ToString());
try { 
if (cmbFeeClass.Text != "" && cmbFeeName.Text != "" && cmbFeeFirstName.Text != "" && cmbMonth.Text != "" && txtSum.Text != "")
{
cmd = new SqlCommand("insert into Fee values('"+ Class + "', '" + Name + "', '" + firstName + "', " +
"'" + dtDateOfAdmission.Text + "', '" + Month + "', '" + "', '" + txtSum.Text + "')", con.ConnectionOpening());
cmd.ExecuteNonQuery();
MessageBox.Show("The data has been saved", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Please fill in all the fields!", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
con.CloseConnection();
}

我如何更改代码,使我不再有这个错误:

只有在使用列列表并且identity_INSERT为ON 时,才能为表'Fee'中的标识列指定显式值

您收到错误是因为您没有在INSERT语句中指定列。如果没有这些,SQL将以先到先得的方式将值分配给列,并且在表定义中,feeID列是第一列。feeID列被定义为主键标识列,并且该列值始终是自动生成的。

下面的代码展示了如何构造带有Columns部分的Sql语句,以及如何使用Parameters。这将帮助您防止将来出现重大错误。

using (SqlConnection con = new SqlConnection(<__ADD_YOUR_CONNECTION_STRING_HERE__>))
{
con.open()
using (SqlCommand cmd = con.CreateCommand())
{
String sql = "INSERT INTO FEE ( classID,  nameID,  firstNameID,  dateOfAdmission,  monthKey)" +
"VALUES          (@classID, @nameID, @firstNameID, @dateOfAdmission, @monthKey)";
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("classID", SqlDbType.Int) { Value = Class });
cmd.Parameters.Add(new SqlParameter("nameID", SqlDbType.Int) { Value = Name });
cmd.Parameters.Add(new SqlParameter("firstnameID", SqlDbType.Int) { Value = firstName });
cmd.Parameters.Add(new SqlParameter("dateOfAdmission", SqlDbType.VarChar) { Value = dtDateOfAdmission.Text });
cmd.Parameters.Add(new SqlParameter("monthKey", SqlDbType.Int) { Value = Month });
command.ExecuteNonQuery();
}
}

注:

您应该认真考虑将dateOfAdmission列的类型从VARCHAR(50)更改为DATE——这将把日期值存储为正确的日期,而不是字符串。这也将使你的工作在未来更加容易。

建议使用代码using (...),以确保在不需要数据库资源时释放这些资源。

相关内容

  • 没有找到相关文章

最新更新