我正在使用C#上的本地数据库(附图片)一个throw-ex函数,给了我以下代码.请协助处理错误



System.Data.SqlClient.SqlException:'无效列名'id_or_passportnewusername]。INSERT语句中的列数少于values子句中指定的值。values子句中的值数必须与INSERT中指定的列数相匹配

[private void btnNextPersonal_Click(object sender, EventArgs e)
{
DBAccess objDBAccess = new DBAccess();
string name = txtNames.Text;
string surname = txtSurname.Text;
string Mail = txtEmail.Text;
string ID = txtID.Text;
string NoOfRooms = txtNORooms.Text;
string Pword = txtNewPass.Text;
string NewUsername = txtNewUsername.Text ;

if (name.Equals(""))
{
MessageBox.Show("Please enter your name.");
}
else if (surname.Equals(""))
{
MessageBox.Show("Please enter your surname.");
}
else if (Mail.Equals(""))
{
MessageBox.Show("Please enter your email.");
}

else if (NoOfRooms.Equals(""))
{
MessageBox.Show("Please enter a number of rooms to be booked.");
}
else if (NewUsername.Equals(""))
{
MessageBox.Show("Please enter a username.");
}
else if (Pword.Equals(""))
{
MessageBox.Show("Please enter a new password.");
}
//Importing data into the database
else
{
SqlCommand insertcommand = new SqlCommand("insert into Users_Names (Names,Surname,Email, no_of_rooms,id_or_passport" +
"newusernames, Newpassword) values(@name,@surname,@Mail,@NoOfRooms,@ID,@NewUsername,@Pword)");

insertcommand.Parameters.AddWithValue("@name", name);
insertcommand.Parameters.AddWithValue("@surname", surname);
insertcommand.Parameters.AddWithValue("@Mail", Mail);
insertcommand.Parameters.AddWithValue("@NoOfRooms", NoOfRooms);
insertcommand.Parameters.AddWithValue("@ID", ID);
insertcommand.Parameters.AddWithValue("@NewUsername", NewUsername);
insertcommand.Parameters.AddWithValue("@Pword", Pword);

int row = objDBAccess.executeQuery(insertcommand);
if (row == 1)
{
MessageBox.Show("Account created successfully");
}
else
{
MessageBox.Show("Error occured");
}
}][1]

如果我把列名和参数排成一行,你能看到问题吗?

insert into Users_Names (
Names, Surname,  Email, no_of_rooms, id_or_passportnewusernames, Newpassword         ) values(
@name, @surname, @Mail, @NoOfRooms,  @ID,                        @NewUsername, @Pword)"

当你把字符串分成两行时,看起来你掉了一个逗号

调试不起作用的sql的基本技术;使用调试器暂停代码并将要发送到数据库的确切SQL字符串复制到数据库。。

此外,请考虑使用逐字逐句的字符串。像这样检查SQL要容易得多

var sql = @"
SELECT *
FROM t
WHERE x = y
";

比使用停止-启动凹面

var sql = @"SELECT *"+
"FROM t"+
"WHERE x = y";

然后升级到将sql字符串保存在资源中。。

然后升级到实体框架,完全取消所有这些乏味的样板文件

最新更新