C#将表单数据插入Access数据库

16

我开始学习C#,但在使用点击按钮时将文本框中的信息插入到Access数据库中遇到了问题。

我的问题出现在添加过程中。代码执行Try...Catch部分然后返回一个错误,说是"Microsoft Access Database Engine",但没有给出任何线索。

下面是代码:

namespace WindowsFormsApplication1
{
    public partial class FormNewUser : Form
    {
        public FormNewUser()
        {
            InitializeComponent();
        }

        private void BTNSave_Click(object sender, EventArgs e)
        {
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\kenny\Documents\Visual Studio 2010\Projects\Copy Cegees\Cegees\Cegees\Login.accdb";

            String Username = TEXTNewUser.Text;
            String Password = TEXTNewPass.Text;

            OleDbCommand cmd = new OleDbCommand("INSERT into Login (Username, Password) Values(@Username, @Password)");
            cmd.Connection = conn;

            conn.Open();

            if (conn.State == ConnectionState.Open)
            {
                cmd.Parameters.Add("@Username", OleDbType.VarChar).Value = Username;
                cmd.Parameters.Add("@Password", OleDbType.VarChar).Value = Password;

                try
                {
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Data Added");
                    conn.Close();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show(ex.Source);
                    conn.Close();
                }
            }
            else
            {
                MessageBox.Show("Connection Failed");
            }
        }
    }
}

3
尝试使用MessageBox.Show(ex.Message);,你可能会得到一个更易懂的信息提示。 - Johan Nordli
你需要一些using语句来使用OleDbConnectionOleDbCommand。你是否对密码进行了盐值处理和哈希处理? - Dustin Kingen
使用以下命名空间: using System; using System.Collections.Generic; using System.Data.OleDb; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; - Kentao
将 conn.Close() 移动到 finally 块中。 - Gokul
5个回答

10

密码是一个保留字。使用方括号来避免混淆数据库引擎。

INSERT into Login (Username, [Password])

4

如果您正在处理数据库,则大多数情况下需要使用try-catch块语句来帮助和指导您的代码。这里我将向您展示如何使用按钮单击事件向数据库中插入一些值。

 private void button2_Click(object sender, EventArgs e)
    {
        System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
    @"Data source= C:\Users\pir fahim shah\Documents\TravelAgency.accdb";

     try
       {
           conn.Open();
           String ticketno=textBox1.Text.ToString();                 
           String Purchaseprice=textBox2.Text.ToString();
           String sellprice=textBox3.Text.ToString();
           String my_querry = "INSERT INTO Table1(TicketNo,Sellprice,Purchaseprice)VALUES('"+ticketno+"','"+sellprice+"','"+Purchaseprice+"')";

            OleDbCommand cmd = new OleDbCommand(my_querry, conn);
            cmd.ExecuteNonQuery();

            MessageBox.Show("Data saved successfuly...!");
          }
         catch (Exception ex)
         {
             MessageBox.Show("Failed due to"+ex.Message);
         }
         finally
         {
             conn.Close();
         }

1

而且没有给出任何线索

是的,它确实给出了线索,不幸的是,您的代码忽略了所有这些线索。请看一下您的异常处理程序:

catch (OleDbException  ex)
{
    MessageBox.Show(ex.Source);
    conn.Close();
}

你所检查的只是异常的来源,即“Microsoft Access Database Engine”。你没有检查错误消息本身、堆栈跟踪、任何内部异常或关于异常的任何有用信息。
不要忽略异常,它包含了出错的原因和信息。
有各种记录工具(如NLog、log4net等),可以帮助你记录关于异常的有用信息。如果无法使用这些工具,至少应该捕获异常消息、堆栈跟踪和任何内部异常。目前你正在忽略这个错误,这就是为什么你无法解决这个错误的原因。
在调试器中,在catch块内设置断点并检查异常的详细信息。你会发现它包含了很多信息。

2
他可以使用 MessageBox.Show(ex.ToString()); 来打印错误信息。 - Dustin Kingen
谢谢这个提示。这是一个错误信息的图片http://img.photobucket.com/albums/v232/tdgjfed/error_zpsd24b6ef8.png。它说插入语句中有语法错误。 - Kentao

0
 private void Add_Click(object sender, EventArgs e) {
 OleDbConnection con = new OleDbConnection(@ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\HP\Desktop\DS Project.mdb");
 OleDbCommand cmd = con.CreateCommand();
 con.Open();
 cmd.CommandText = "Insert into DSPro (Playlist) values('" + textBox1.Text + "')";
 cmd.ExecuteNonQuery();
 MessageBox.Show("Record Submitted", "Congrats");
 con.Close();
} 

3
在 Stack Overflow 上,添加解释说明为什么您的解决方案有效是一个好的做法。 - 4b0
3
@Irtaza,请尝试解释一下你的代码。重点是让提问者学习。 - Jacques
虽然这段代码可能回答了问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅有代码的答案可能会令人困惑并缺乏上下文。 - Robert Columbia

0

我的插入数据的代码不起作用。它没有显示任何错误,但是数据没有显示在我的数据库中。

public partial class Form1 : Form { OleDbConnection connection = new OleDbConnection(check.Properties.Settings.Default.KitchenConnectionString); public Form1() { InitializeComponent(); }

    private void Form1_Load(object sender, EventArgs e)
    {
        
    }

    private void btn_add_Click(object sender, EventArgs e)
    {
        OleDbDataAdapter items = new OleDbDataAdapter();
        connection.Open();
        OleDbCommand command = new OleDbCommand("insert into Sets(SetId, SetName,  SetPassword) values('"+txt_id.Text+ "','" + txt_setname.Text + "','" + txt_password.Text + "');", connection);
        command.CommandType = CommandType.Text;
        command.ExecuteReader();
        connection.Close();
        MessageBox.Show("Insertd!");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接