带有ParameterName' @ 0'的SqlParameter不包含在此SqlParameterCollection中

时间:2017-09-24 08:53:12

标签: c# sql parameters

请参阅代码段,我似乎无法找到我的错误,任何帮助都将不胜感激。例外是第一个参数add,(@ 0)。

  

错误:带有ParameterName' @ 0'的SqlParameter不包含在此SqlParameterCollection

代码:

using (SqlConnection conn = new SqlConnection(sqlConString))
{
    SqlCommand insertQuery = new SqlCommand("INSERT INTO user_table (Username, Password, Name, Surname, DOB) VALUES ( @0, @1, @2, @3, @4 )", conn);

    insertQuery.Parameters["@0"].Value = edtUsername.Text;
    insertQuery.Parameters.AddWithValue("@1", edtPassword.Text);
    insertQuery.Parameters.AddWithValue("@2", edtName.Text);
    insertQuery.Parameters.AddWithValue("@3", edtSurname.Text);
    insertQuery.Parameters.AddWithValue("@4", dateTimePicker.Text);

    conn.Open();
    insertQuery.ExecuteNonQuery();
    conn.Close();
} // using conn

1 个答案:

答案 0 :(得分:4)

此代码存在一些问题:

  1. 您没有添加参数@0,尝试在添加参数之前设置其值。
  2. Don't use AddWithValue. Use Add instead.
  3. 请勿使用@0@1等作为参数名称,而应使用有意义的名称。当只有5个参数但在任何地方使用有意义的名字是一个好习惯时,这并不重要。
  4. 不要将日期作为字符串传递,将它们作为DateTime的实例传递。这样可以省去很多乱码格式的麻烦。
  5. Don't store plain text password in the database.对salt使用散列算法。
  6. SqlCommand也是IDisposable。
  7. 更好的代码是这样的:

    using (var conn = new SqlConnection(sqlConString))
    {
        using(var insertQuery = new SqlCommand("INSERT INTO user_table (Username, Password, Name, Surname, DOB) VALUES ( @Username, @Password, @Name, @Surname, @DOB)", conn))
        {
            // I'm assuming nvarchar as the data type, change it if needed....
            insertQuery.Parameters.Add("@Username", SqlDbType.NVarChar).Value = edtUsername.Text;
            // uniqueSalt can be stored as plain text in the database, but should be unique for each password.
            insertQuery.Parameters.Add("@Password", SqlDbType.NVarChar).Value = HashPassword(edtPassword.Text, uniqueSalt); 
            insertQuery.Parameters.Add("@Name", SqlDbType.NVarChar).Value = edtName.Text;
            insertQuery.Parameters.Add("@Surname", SqlDbType.NVarChar).Value = edtSurname.Text;
            insertQuery.Parameters.Add("@DOB", SqlDbType.DateTime).Value = dateTimePicker.Value;
            conn.Open();
            insertQuery.ExecuteNonQuery();
        }
    } 
    
    string HashPassword(string password, string salt)
    {
        // TODO: Implement hashing with salt
    }