web-dev-qa-db-ja.com

C#フォームからAccessデータベースへのデータの挿入

私は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");
            }
        }
    }
}
12
Kentao

Password予約語 です。 dbエンジンを混乱させないために、そのフィールド名を括弧で囲みます。

INSERT into Login (Username, [Password])
9
HansUp

この回答は、データベースで作業している場合に役立ちます、ほとんどの場合、try-catch blockステートメントの助けを借ります、コードの作成に役立ちます。ここでは、ボタンクリックイベントを使用してデータベースに値を挿入する方法を示しています。

 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();
         }
4
Pir Fahim Shah

手がかりを与えない

はい、残念ながらあなたのコードはそれらの手がかりをすべて無視しています。例外ハンドラーを見てください:

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

調べているのは、例外のsourceだけです。この場合、これは「Microsoft Access Database Engine」です。エラーメッセージ自体、スタックトレース、内部例外、または例外に関して有用なものを調べていません。

例外を無視しないでください。何が間違っていたのか、その理由に関する情報が含まれています。

例外に関する有用な情報を記録するのに役立つさまざまなログツール(NLog、log4netなど)があります。それに失敗したら、少なくとも例外メッセージ、スタックトレース、および内部例外をキャプチャする必要があります。現在、ignoringエラーであるため、エラーを解決できません。

デバッガーで、catchブロック内にブレークポイントを配置し、例外の詳細を調べます。多くの情報が含まれていることがわかります。

1
David
 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();
} 
0
Irtaza Ali