C# 将nvarchar转换为数字以注册记录时出错

C# 将nvarchar转换为数字以注册记录时出错,c#,sql-server,C#,Sql Server,这是注册按钮的代码 private void bttnRegister_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myCon"].ConnectionString); SqlCommand cmd = new SqlCommand("INSERT INTO Student VAL

这是注册按钮的代码

private void bttnRegister_Click(object sender, EventArgs e)
{
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["myCon"].ConnectionString);

        SqlCommand cmd = new SqlCommand("INSERT INTO Student VALUES (@stu_fname, @stu_lname, @Address, @Phone, @Email, @DateOfBirth, @UserName, @Password, @DateAdded)", con);  

        con.Open();

        cmd.Parameters.AddWithValue("@stu_fname", txtFirstname.Text);
        cmd.Parameters.AddWithValue("@stu_lname", txtLastname.Text);
        cmd.Parameters.AddWithValue("@Address", txtAddress.Text);
        cmd.Parameters.AddWithValue("@Phone", txtPhone.Text);
        cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
        cmd.Parameters.AddWithValue("@DateOfBirth", DateOfBirth.Value);
        cmd.Parameters.AddWithValue("@UserName", txtUsername.Text);
        cmd.Parameters.AddWithValue("@Password", txtPassword.Text);
        cmd.Parameters.AddWithValue("@DateAdded", DateTime.Now);

        cmd.ExecuteNonQuery();

        MessageBox.Show("Registration Successful!");
        con.Close();

        txtFirstname.Clear(); 
        txtLastname.Clear(); 
        txtAddress.Clear(); 
        txtPhone.Clear();
        txtEmail.Clear(); 
        txtUsername.Clear(); 
        txtPassword.Clear();
}

您正在将
txtFirstname.Text
,一个字符串插入
stu_id
列中,该列为int。插入表时,我始终包含列名,因为它可以防止此类错误,更易于读取和调试,并避免表结构更改时可能出现的一些问题。假设
stu_id
是一个标识列,那么您的SQL字符串应该是:

INSERT INTO Student (stu_fname, stu_lname, Address, Phone, Email, DateOfBirth, Username, Password, DateAdded) VALUES (@stu_fname, @stu_lname, @Address, @Phone, @Email, @DateOfBirth, @UserName, @Password, @DateAdded)

即使我更改了SQL,它仍然有相同的结果statement@RaymondLayosa:因为
Phone
numeric
AddWithValues
猜测它是
varchar
。使用
添加(“@Phone”,SqlDbType.Decimal)
。读取。为什么手机是数字的(18,0)?电话号码不是数字,它们是大部分数字组成的字符串,是的。但是在一个
数值
中不能存储前导0(001=01=1),并且两个前导0的前导+也不能存储在一个
数值
numeric
不是电话号码的正确类型。粘性位是正确的。还有,为什么在ado.net中使用直接sql语句,而不是实体框架或其他ORM?甚至至少是对存储过程的调用。