2017-04-25 97 views
3

我試圖從表單中插入數據,MSACCESS數據庫,我有當前的代碼插入數據中的MS Access C#ASP.Net

OleDbConnection con = new OleDbConnection(); 
OleDbCommand cmd = new OleDbCommand(); 
con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\kunz\Documents\Visual Studio 2010\WebSites\Assignment_2_Mark_2\App_Data\nuclearpopsicledb.mdb"; 
cmd.Connection = con; 
string sql = "insert into users values('"+tbUname.Text+"','"+tbPass.Text+"','"+tbName.Text+"','"+tbEmail.Text+"','"+tbEmail.Text+"')"; 

try 
{ 
    con.Open(); 
    cmd.CommandText = sql; 
    cmd.ExecuteNonQuery(); 
    con.Close(); 
    Label1.Text = "TRY"; 
} 
catch(Exception ex) 
{ 
    Label1.Text = ex.ToString(); 
    con.Close(); 
} 

我的數據庫的結構類似於:

|用戶名|密碼|名稱|電子郵件|

但是當過我運行它我得到一個錯誤,如

System.Data.OleDb.OleDbException:查詢值和 目的地字段數是不一樣的。在System.Data。

我不知道我在做什麼錯誤我在C#初學者

+1

實現[IDisposable](https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110).aspx)的對象(如OleDbConnection)未得到正確處理。用使用語句包裝它們。 – mason

+1

我明白這可能是一個學習任務,但是您將明文密碼存儲在數據庫中。這是一個很大的安全違規行爲。密碼應該是一種散列和加密的方式,從不以明文存儲。 – mason

回答

3

你必須要傳遞一個額外的電子郵件:

cmd.Parameters.AddWithValue("@userName", tbUname.Text.Trim()); 
cmd.Parameters.AddWithValue("@password", tbPass.Text.Trim()); 
cmd.Parameters.AddWithValue("@Name", tbName.Text.Trim()); 
cmd.Parameters.AddWithValue("@Email", tbEmail.Text.Trim()); 

string sql = 
    "insert into users " + 
    "values(@userName, @password, @Name, @Email)"; 
+0

是這樣做的最好方法 有沒有更好的方法來防止sql注入 – Craftx398

+2

是的,參數好得多 – GibralterTop

+0

@GibralterTop然後顯示如何做參數。不要顯示如何以不正確的方式做事。 – mason

1

其實你的表中包含四個值,但你在該查詢中傳遞5個值。這是錯誤的。

代碼:

string sql = "insert into users values('"+tbUname.Text+"','"+tbPass.Text+"','"+tbName.Text+"','"+tbEmail.Text+"','"+tbEmail.Text+"')"; 

tbEmail.Text被重複兩次。