我在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的文本框,以及用于指定_id和dept_id的两个组合框。dept_id和designation_id是tb_emp中的外键。我还使用了combox属性。所以有人能告诉我错误是什么吗?如果我正确地写了组合框代码。。。

您需要养成使用"参数化查询"-这些不仅可以保护您的代码免受#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为你做这一切,比人类一天能做的时间更短,更安全/可靠。编写数据库访问代码既无聊又烦人,下面是你的处理方法:

  • 向项目添加一个新的数据集,就像添加一个窗体或类或任何其他东西一样。称之为合理的东西,而不是数据集1
  • 打开服务器资源管理器窗口,并向访问数据库添加连接
  • 将数据库拖到数据集中。仔细阅读弹出的长消息框。没有人读这个,他们应该读。它解决了以后构建过程覆盖exe保存的数据库时的许多困惑,而且看起来你的应用程序从未保存任何数据。单击"是">
  • 将一些表从服务器资源管理器拖动到数据集中。而不是具有与数据库表和表适配器相同的所有列的datatabke的外观。这不是你的数据库表,它是一个强类型客户端数据表,这是你在上面的代码中使用弱类型数据集和数据表所做的更好的版本。表适配器是数据适配器的一个更好的版本,它被设计为与视觉上附加的更好的数据表一起工作
  • 切换到设计的形式
  • 从"视图"菜单、"其他窗口"子菜单打开"数据源"窗口
  • 将其中一个节点从数据源中拖到窗体上

出现了很多东西,数据网格视图、绑定源、导航器、数据集、表适配器、管理器。在你了解它的工作原理之前,不要删除一些东西,因为它会教会你很多。运行程序

这个应用程序可以工作,加载数据,保存数据,到目前为止你根本没有写任何代码。VS为您编写了所有代码,如果您愿意,您可以阅读,它位于磁盘上的.Designer.cs文件中

运行应用程序,添加一些行,更改内容,单击保存,关闭应用程序。不要再运行该应用程序,而是进入bin/debug文件夹,在那里打开数据库。查看您添加/更改的数据

现在关闭access并重新构建项目,现在在access中打开相同的bin/debug db。。看到数据不见了吗?生成过程将项目中的空白数据库复制到exe运行时更改的数据库顶部。确保你每次构建时都能弄清楚这里发生了什么,否则你会非常困惑为什么你的应用程序";不是在保存";(确实如此,但这些变化正在被构建过程抹去(


关于表适配器,您需要了解的其他一些信息:

  • 它们可以有多个select命令-只需在数据集设计器中右键单击它们,然后添加另一个查询。使用参数,如SELECT * FROM t WHERE id = @id,并为命令指定一个合理的名称,如FillById。表适配器将获得一个方法myTabkeAdapter.FillById(someDatatableHere, 1234),用行ID 1234填充该数据表
  • 他们有一个Update方法,它采用一个数据表。这不仅仅是为了运行更新查询。Update扫描整个传递的数据表,查找需要插入、更新或删除的行,并执行相关的sql。更改数据表行时,RowState属性会跟踪更改。如果rowstate为Added,则表适配器将运行insert来插入行。如果rowstate为Modified,则将运行Update。如果删除了行状态,则将运行删除操作。微软本应该称"更新"为其他名称,比如"保存",因为它经常会引起混乱

相关内容

最新更新