0

我是 C# 中的 Nubie,我尝试学习 CRUD。选择数据成功,但我无法将数据保存到 mysql。我的桌子

mahasiswa

   ID| namae | jurusan | email
  _____________________________
  1 |  Bill  | IT      | bill@gmail.com
  2 | Tony   | IT      | Tony@gmail.com

Mysql中ID设置为自动递增

这是我的 btn 保存脚本

 void btnsave_Click(object sender, EventArgs e)
        {
            try 
            {
                if (txtid.Text != "" && txtnama.Text != "" && txtjurusan.Text != "" && txtemail.Text != "")
                {
                    query = string.Format("INSERT INTO mahasiswa values ('{1}','{2}','{3}');", txtnama.Text, txtjurusan.Text, txtemail.Text);

                    koneksi.Open();
                    perintah = new MySqlCommand(query, koneksi);
                    adapter = new MySqlDataAdapter(perintah);
                    int res = perintah.ExecuteNonQuery();
                    koneksi.Close();

                    if (res == 1)
                    {
                        MessageBox.Show("Input Data Sukses...");
                    }
                    else
                    {
                        MessageBox.Show("Input Data Gagal... ");
                    }

                }
                else
                {
                    MessageBox.Show("Data tidak lengkap");
                }
            }
            catch(Exception ex)
            {
                  MessageBox.Show(ex.ToString());
            }
        }

该脚本可以运行,但在输入数据并单击保存按钮后程序停止。

有谁能够帮助我。

我非常感谢你的回答

谢谢

表单加载

 void Form1_Load(object sender, EventArgs e)
        {
            try
            {

                koneksi.Open();
                query = string.Format("SELECT * FROM mahasiswa");
                perintah = new MySqlCommand(query, koneksi);
                adapter = new MySqlDataAdapter(perintah);
                perintah.ExecuteNonQuery();
                ds.Clear();
                adapter.Fill(ds);
                koneksi.Close();
                dgv1.DataSource = ds.Tables[0];
                dgv1.Columns[0].Width = 50;
                dgv1.Columns[0].HeaderText = "ID";
                dgv1.Columns[1].Width = 120;
                dgv1.Columns[1].HeaderText = "Nama Mahasiswa";
                dgv1.Columns[2].Width = 120;
                dgv1.Columns[2].HeaderText = "Jurusan";
                dgv1.Columns[3].Width = 120;
                dgv1.Columns[3].HeaderText = "Email";
                //txtid.clear();
                txtnama.Clear();
                txtjurusan.Clear();
                txtemail.Clear();
                btnedit.Enabled = false;
                btndelete.Enabled = false;
                btnsave.Enabled = true;
                btnsearch.Enabled = true;


            }
            catch (Exception ex) {

                MessageBox.Show(ex.ToString());
            }
        }
4

3 回答 3

1

此外,如果您学习 CRUD,那么如果您在 SQL 中创建了必要的存储过程并以这种方式进行尝试,将会很有帮助。

只需创建一个 CREATE、INSERT、UPDATE、DELETE 过程。然后在插入示例的代码中,您有以下内容:

public bool Add(string example)
    {
        try
        {

            using (SqlConnection con = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand("[Proc name]", con);
                cmd.CommandType = CommandType.StoredProcedure;
                if (con.State == ConnectionState.Closed)
                    con.Open();
                cmd.Parameters.AddWithValue("@Example", example);

                cmd.ExecuteNonQuery();
                return true;
            }
        }

这使您可以查看发生的情况并确保您的程序正常运行。通过这种方式,您可以更轻松地捕获异常,并更轻松地验证您的输入。

于 2013-07-05T08:20:10.973 回答
0

试试这个

"INSERT INTO mahasiswa (name,jurusan,mail) values ('{1}','{2}','{3}')", txtnama.Text, txtjurusan.Text, txtemail.Text)";

因为您的查询将指示 mysql 查找 4 个值,而您只传递 3 个值。

于 2013-07-05T08:14:28.403 回答
0

不要使用字符串连接来构建 sql 命令文本,始终使用参数化查询

query = "INSERT INTO mahasiswa VALUES (@p1,@p2,@p3);";
using(MySqlConnection koneksi = new MySqlConnection(connectionString))
using(MySqlCommand perintah = new MySqlCommand(query, koneksi))
{
     koneksi.Open();
     perintah.Parameters.AddWithValue("@p1", txtnama.Text);
     perintah.Parameters.AddWithValue("@p2", txtjurusan.Text);
     perintah.Parameters.AddWithValue("@p3", txtemail.Text);
     int res = perintah.ExecuteNonQuery();
     if (res == 1)
         MessageBox.Show("Input Data Sukses...");
     else
         MessageBox.Show("Input Data Gagal... ");
}

如果您使用字符串连接,您的代码将对 sql 注入开放,恶意用户可能会对您的数据库造成严重破坏(看看这个有趣的例子

此外,您的格式语句完全错误,我怀疑您的代码是否到达了执行数据库命令的位置,因为您列出了 string.Format 从索引 1 到索引 3 的参数,并且您提供了 3 个参数,但索引应该从零并以二结束。所以你应该在那条线上得到一个例外。

需要注意的另一点是using 语句。如您所见,在我的代码中, using 语句将确保正确关闭和处理连接和命令对象。正确处理连接特别重要,因为此处的故障可能会在以后破坏您的程序。

于 2013-07-05T08:18:44.667 回答