2011-07-02 40 views
0
  1. 我創建的表稱爲Department 2列Department ID這是自動遞增和Department Name如何使用的SqlCommand和DataAdapter以操縱SQL Server和C#

  2. 我爲了通過部門走路創建Navigate_Department()

    System.Data.SqlClient.SqlConnection con; 
    DataSet Dep_ds; 
    System.Data.SqlClient.SqlDataAdapter Dep_da; 
    int Dep_MaxRows = 0; 
    int Dep_inc = 0; 
    
    private void ILS_Load(object sender, EventArgs e) 
    { 
        con = new System.Data.SqlClient.SqlConnection(); 
        con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\ILS_DB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; 
        con.Open(); 
    
        Dep_ds = new DataSet(); 
        string sql2 = "select * from Department order by DepartmentID"; 
        Dep_da = new System.Data.SqlClient.SqlDataAdapter(sql2, con); 
        Dep_da.Fill(Dep_ds, "Department"); 
        Navigate_Department(); 
        Dep_MaxRows = Dep_ds.Tables["Department"].Rows.Count; 
    } 
    
    private void Navigate_Department() 
    { 
        DataRow dRow = Dep_ds.Tables["Department"].Rows[Dep_inc]; 
    
        Dep_ID.Text =dRow.ItemArray.GetValue(0).ToString(); 
        Dep_Name.Text = dRow.ItemArray.GetValue(1).ToString(); 
    } 
    
    private void Move_Next_Click(object sender, EventArgs e) 
    { 
        if (Dep_inc != Dep_MaxRows-1) 
        { 
         Dep_inc++; 
         Navigate_Department(); 
        } 
        else 
        { 
         MessageBox.Show("No More Records"); 
        } 
    } 
    
    private void Move_back_Click(object sender, EventArgs e) 
    { 
        if (Dep_inc > 0) 
        { 
         Dep_inc--; 
         Navigate_Department(); 
        } 
        else 
        { 
         MessageBox.Show("First Record"); 
        } 
    } 
    
    private void Dep_Clear_Click(object sender, EventArgs e) 
    { 
        Dep_ID.Clear(); 
        Dep_Name.Clear(); 
    } 
    
    private void Dep_Add_Click(object sender, EventArgs e) 
    { 
        try 
        { 
         SqlCommand insCmd = new SqlCommand("insert into dbo.Department (DepartmentName) values ('" + Dep_Name.Text + "')", con); 
         Dep_da.InsertCommand = insCmd; 
    
         Dep_MaxRows = Dep_MaxRows + 1; 
         Dep_inc = Dep_MaxRows - 1; 
         Dep_Max.Text = Dep_MaxRows.ToString(); 
         Dep_Current.Text = (Dep_MaxRows).ToString(); 
        } 
        catch (Exception exceptionObject) 
        { 
         MessageBox.Show(exceptionObject.Message); 
        } 
    

的問題是:

當我點擊清除按鈕後,我將部門名稱插入到Dep_Name文本框中,然後單擊添加按鈕。我插入的名稱未保存在數據庫中,如果我單擊後退,然後再移動以查看插入的內容,我在Navigate_Department()方法中得到一個Index out of range例外。

那麼我犯了什麼錯誤?

+7

參數化您的SQL查詢。不要將文本框值附加到SQL字符串中。 –

回答

0

你插入的名字沒有保存在數據庫中的原因是你永遠不會執行insert命令。地址:

int ret = Dep_da.Update(Dep_ds); 

after the 

Dep_da.InsertCommand = insCmd; 

可變漚將包含行更新成功的(插入)的數量 - 而你的情況應該是1

要添加到什麼@N。 Warfield寫道,如果您只是將原始數據追加到用戶(或其他系統)提供的SQL字符串中,那麼您就會對SQL注入攻擊敞開大門。

+0

執行程序時出現此錯誤 「Update無法找到TableMapping ['Table']或DataTable'Table'。」 – AbdelMalek

+0

嘗試在Update方法中指定表名 - 即Dep_da.Update(Dep_ds,「Department」); – Tim

0

而不是像這樣創建插入語句,您應該使用帶有insert命令的數據適配器,向表中添加新的DataRow實例,然後使用數據適配器執行更新。

另外,您可以通過更換調用執行中Dep_Add_Click insert命令「Dep_da.InsertCommand = insCmd」與「insCmd.ExecuteNonQuery」,然而,這將意味着你將需要重新運行SELECT語句,並重新填充數據庫中的數據集以將數據庫中的數據導入數據集。