簡體   English   中英

我在 C# 中的表中插入數據時遇到問題

[英]i am having trouble inserting data in table in C#

private void btn_view_Click(object sender, EventArgs e)
{
        con.Open();

        OleDbDataAdapter da = new OleDbDataAdapter("Select * from tbl_emp", con);
        DataSet ds = new DataSet();
        da.Fill(ds);

        dgv_emptable.DataSource = ds.Tables[0];

        con.Close();
}

private void btn_insert_Click(object sender, EventArgs e)
{
        con.Open();

        OleDbCommand cmd = new OleDbCommand();

        cmd.CommandText = "Insert into tbl_emp(emp_id,emp_name,emp_surname,designation_id,dept_id) Values(" + txt_id.Text + " , '" + txt_name.Text + "','" + txt_phone.Text + "'," + cmb_desigid.SelectedValue + ",'" + cmb_deptid.SelectedValue.ToString() +"')"; 
        cmd.Connection = con;
        cmd.ExecuteNonQuery();
        MessageBox.Show("Record inserted");
        con.Close();
}

private void Form1_Load(object sender, EventArgs e)
{
    con.Open();

    OleDbDataAdapter da = new OleDbDataAdapter("Select * from tbl_designation", con);

    DataSet ds = new DataSet();
    da.Fill(ds);

    cmb_desigid.DataSource = ds.Tables[0];
    cmb_desigid.DisplayMember = "designation_type";
    cmb_desigid.ValueMember = "designation_id";

    con.Close();

    con.Open();

    OleDbDataAdapter db = new OleDbDataAdapter("Select * from tbl_dept",con);

    DataSet dm = new DataSet();
    db.Fill(dm);

    cmb_deptid.DataSource = dm.Tables[0];
    cmb_deptid.DisplayMember = "dept_name";
    cmb_deptid.ValueMember = "dept_id";

    con.Close();
}

我已經綁定了我的數據庫,我正在編寫一個插入查詢來在表中插入數據,但是我在cmd.ExecuteNonQuery遇到了同樣的錯誤

沒有為所需參數提供給定參數。

我已經徹底檢查但似乎無法找到錯誤

我已將文本框用於 emp_id、emmp_name、emp_surname,以及用於 designation_id 和 dept_id 的兩個組合框。 dept_id 和 designation_id 是 tbl_emp 中的外鍵。 而且我也使用了組合框屬性。所以任何人都可以告訴我錯誤是什么,以及我是否正確編寫了組合框代碼...

你需要養成使用“參數化查詢”的習慣——這些不僅可以保護你的代碼免受#1漏洞的影響——SQL注入——它們還可以解決很多棘手的問題,比如向字符串添加引號等值。

試試這個代碼:

private void btn_insert_Click(object sender, EventArgs e)
{
    // define the insert query - OleDB uses unnamed, positional parameters 
    string insertQuery = "INSERT INTO tbl_emp (emp_id, emp_name, emp_surname, designation_id, dept_id) " + 
                         "VALUES (?, ?, ?, ?, ?)";
    
    // create command 
    OleDbCommand cmd = new OleDbCommand(insertQuery, con);

    // define parameters - in the proper order! - and set their values
    // The "names" like "@emp_id" that I'm using here are just to make it easier for you to grasp which parameter
    // corresponds to which columns being inserted - you could also name them "p1", "p2" etc. - not very intuitive, though ...
    // Check the *assumptions* I made for the datatypes - not sure if those are
    // really what you have - adapt as needed
    cmd.Parameters.Add("@emp_id", OleDbType.Int).Value = Convert.ToInt32(txt_id.Text);
    
    cmd.Parameters.Add("@emp_name", OleDbType.VarChar, 100).Value = txt_name.Text;
    cmd.Parameters.Add("@emp_surname", OleDbType.VarChar, 100).Value = txt_phone.Text 
    
    cmd.Parameters.Add("@designation_id", OleDbType.Int).Value = cmb_desigid.SelectedValue;
    cmd.Parameters.Add("@dept_id", OleDbType.Int).Value = cmb_deptid.SelectedValue;
    
    // open connection, execute query, close connection
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();    
    
    MessageBox.Show("Record inserted");
}

作為一般的旁注:如果您只對從查詢返回的單個DataTable感興趣 - 我強烈建議使用此代碼(而不是您現在擁有的):

private void Form1_Load(object sender, EventArgs e)
{
    con.Open();

    OleDbDataAdapter da = new OleDbDataAdapter("Select * from tbl_designation", con);

    // define and use a "DataTable" - not a "DataSet" (which is overkill for just a single table of data)
    DataTable dt = new DataTable();
    da.Fill(dt);

    cmb_desigid.DataSource = dt;
    cmb_desigid.DisplayMember = "designation_type";
    cmb_desigid.ValueMember = "designation_id";

    con.Close();

我在評論中提到,你可以讓 VS 為你完成所有這些,比人類一天可以做的更短,更安全/可靠。 編寫數據庫訪問代碼既無聊又煩人,以下是您的處理方式:

  • 向項目添加新數據集,就像添加表單或類或任何其他內容一樣。 稱其為明智之舉,而不是 dataset1
  • 打開服務器資源管理器窗口,並添加到您的訪問數據庫的連接
  • 將數據庫拖入數據集。 仔細閱讀彈出的長消息框。 沒有人讀這個,他們應該讀它。 當構建過程覆蓋 exe 保存的數據庫時,它解決了很多混亂,看起來你的應用程序從不保存任何數據。 單擊是
  • 將一些表從服務器資源管理器中拖到數據集中。 不是具有與您的 db 表和 tableadapter 相同的列的數據表的外觀。 這個東西不是你的數據庫表,它是一個強類型的客戶端數據表,它是你在上面的代碼中使用弱類型數據集和數據表所做的更好的版本。 表適配器是數據適配器的更好版本,旨在與更好的數據表一起工作,它在視覺上附加到
  • 切換到設計的表格
  • 從視圖菜單打開數據源窗口,其他窗口子菜單
  • 將其中一個節點拖出數據源並拖到表單上

出現了很多東西,數據網格視圖、綁定源、導航器、數據集、表適配器、管理器。 在您了解所有內容之前不要刪除內容,因為它會教您很多東西。 運行程序

這個應用程序可以運行,加載數據,保存數據,而您目前根本沒有編寫任何代碼。 VS 為您編寫了所有代碼,您可以根據需要閱讀它,它位於磁盤上的 .Designer.cs 文件中

運行應用程序,添加一些行,更改內容,單擊保存,關閉應用程序。 不要再次運行該應用程序,而是進入 bin/debug 文件夾並在那里打開該數據庫,在訪問中。 查看您添加/更改的數據

現在關閉訪問並再次構建項目,現在在訪問中打開相同的 bin/debug db.. 看到數據消失了嗎? 構建過程將項目中的空白數據庫復制到 exe 在運行時更改的數據庫的頂部。 確保每次構建時都了解這里發生的事情,否則您會很困惑為什么您的應用程序“沒有保存”(確實如此,但是構建過程正在擦除更改)


您需要了解的有關 tableadapter 的其他一些事情:

  • 它們可以有多個選擇命令——只需在數據集設計器中右鍵單擊它們並添加另一個查詢。 使用參數,如SELECT * FROM t WHERE id = @id並為命令指定一個合理的名稱,如 FillById。 tableadapter 將獲得一個方法myTabkeAdapter.FillById(someDatatableHere, 1234)用行 ID 1234 填充該數據表
  • 他們有一個采用數據表的 Update 方法。 這不僅僅用於運行更新查詢。 更新掃描整個傳遞的數據表,尋找需要插入更新或刪除的行並執行相關的sql。 當您更改數據表行時,RowState 屬性會跟蹤更改。 如果行狀態被添加,並且插入將由表適配器運行,以插入行。 如果行狀態已修改,則將運行更新。 如果行狀態被刪除,將運行刪除。 微軟應該把更新稱為其他東西,比如保存,因為它經常引起混亂

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM