2017-09-24 50 views
0

看到代碼段,我似乎無法找到我的錯誤,任何幫助,將不勝感激。第一個參數add((@ 0))例外。此參數名'@ 0'的SqlParameter不包含此SqlParameterCollection

Error: An SqlParameter with ParameterName '@0' is not contained by this 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 
+0

你爲什麼不同於他人加入呢?你不能像添加其他參數一樣添加它 - (insertQuery.Parameters.AddWithValue) – adityawho

+0

我剛剛添加了兩種方式來顯示我嘗試了兩種我知道的方式,而不是其中的一種。 – Hancs

回答

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.對鹽使用哈希算法。
  6. SqlCommand也是一個IDisposable。

更好的代碼將是這樣的:

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 
} 
+0

感謝您的提示,但現在我只想讓插入查詢工作,請參閱此[截圖](https://imgur.com/a/SX4xh),即使使用'add'也不會將參數添加到查詢 – Hancs

+0

你用這個新代碼得到了什麼錯誤? –

+0

剛剛用你的代碼替換了我的代碼,工作100%,'使用var insertQuery = new sqlCommand(){}'似乎已經解決了這個問題。感謝您的幫助 – Hancs

相關問題