[英]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 為你完成所有這些,比人類一天可以做的更短,更安全/可靠。 編寫數據庫訪問代碼既無聊又煩人,以下是您的處理方式:
出現了很多東西,數據網格視圖、綁定源、導航器、數據集、表適配器、管理器。 在您了解所有內容之前不要刪除內容,因為它會教您很多東西。 運行程序
這個應用程序可以運行,加載數據,保存數據,而您目前根本沒有編寫任何代碼。 VS 為您編寫了所有代碼,您可以根據需要閱讀它,它位於磁盤上的 .Designer.cs 文件中
運行應用程序,添加一些行,更改內容,單擊保存,關閉應用程序。 不要再次運行該應用程序,而是進入 bin/debug 文件夾並在那里打開該數據庫,在訪問中。 查看您添加/更改的數據
現在關閉訪問並再次構建項目,現在在訪問中打開相同的 bin/debug db.. 看到數據消失了嗎? 構建過程將項目中的空白數據庫復制到 exe 在運行時更改的數據庫的頂部。 確保每次構建時都了解這里發生的事情,否則您會很困惑為什么您的應用程序“沒有保存”(確實如此,但是構建過程正在擦除更改)
您需要了解的有關 tableadapter 的其他一些事情:
SELECT * FROM t WHERE id = @id
並為命令指定一個合理的名稱,如 FillById。 tableadapter 將獲得一個方法myTabkeAdapter.FillById(someDatatableHere, 1234)
用行 ID 1234 填充該數據表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.