พึ่งเคยใช้งานครั้งแรกโปรดอ่านที่นี่! howtouse!
x
  • Register
หางานด้าน IT อยู่เหรอ?

[C#] insert เข้าฐานข้อมูล Access 2007 ไม่ได้ครับ

0 votes

สวัสดีครับ คือผมเพิ่งหัดเล่น C# คือผมใช้ ฐานข้อมูลเป็น Access 2007 

โปรแกรมไม่ Error ครับแต่เมื่อกรอกข้อมูลเสร็จแล้ว ไปดูในฐานข้อมูล กลับไม่มีข้อมุลเรยครับ

ขอท่านเทพดูโค๊ตให้ผม ด้วยครับ ว่าเพราะอะไรครับ  ขอบคุณล่วงหน้าครับ ^^

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
 
namespace Program_Stock_Product
{
    public partial class RegistrationGoods : Form
    {
        public RegistrationGoods()
        {
            InitializeComponent();
        }
 
        private void RegistrationGoods_Load(object sender, EventArgs e)
        {
 
 
        }
 
        private void btnsave_Click(object sender, EventArgs e)
        {
            /*เชื่อมต่อกับฐานข้อมูล*/
            OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=DBStock.accdb;");
            myConn.Open();
 
            OleDbCommand objCmd = new OleDbCommand("INSERT INTO Inventory(Inventory_ID, Inventory , Unit, Date_Inventory) values (@txtid,@txtin,@txtunit,@monthCalendar1)", myConn);
           objCmd.Parameters.Add("@txtid", OleDbType.VarChar).Value = txtid.Text;
           objCmd.Parameters.Add("@txtin", OleDbType.VarChar).Value = txtin.Text;
           objCmd.Parameters.Add("@txtunit", OleDbType.VarChar).Value = txtunit.Text;
           objCmd.Parameters.Add("@monthCalendar1", OleDbType.VarChar).Value = monthCalendar1.Text;
 
           if (txtid.Text == string.Empty || txtin.Text == string.Empty || txtunit.Text == string.Empty)
               {
               MessageBox.Show("Please Fill in All fields");
               return;
               }
 
           myConn.Close();
 
           Close();
 
 
        }
 
    }
}
 
ถามเมื่อ Apr 28, 2012 in C# โดย คุณชายเก่ง คุง (131 คะแนน)
   

4 Answers

+2 votes
 
Best answer

โค้ดแบบนี้ งง มากๆ ครับ

ผมจะจัดให้ดูเรียบร้อยขึ้นนะ

 

 

// ตรงนี้ ควรเช็คค่าก่อน เลยนะครับ ถ้ามัน ไม่มีค่า ก็ให้จบ ตรงนี้เลย ไม่ต้องทำอะไรต่อ

if (txtid.Text == string.Empty || txtin.Text == string.Empty || txtunit.Text == string.Empty)
{
      MessageBox.Show("Please Fill in All fields");
      return;
}

 

//ตรงนี้ แยก Connection String ออกมาครับ ความจริงแล้วตรงนี้ควรเป็นตัวแปร ระดับ Global นะครับ

string connStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=DBStock.accdb;";

 

//ใช้ Using ครอบ OleDbConnection ไว้นะครับ พอหลุดจากตรงนี้ myConn จะ Close ให้ทันทีครับ

using (OleDbConnection myConn = new OleDbConnection(connStr))
{
         myConn.Open();
 
         // เขียน SQL แยกออกมาครบ เพื่อความสะดวกในการแก้ไข
         string sqlText = @"
                      INSERT INTO Inventory (Inventory_ID, Inventory , Unit, Date_Inventory)
                      VALUES(@txtid, @txtin, @txtunit, @monthCalendar1)
         ";
 
         // สร้าง Object OleDbCommand อันนี้ถูกต้องแล้ว แต่เราส่ง sqlText ที่เราประกาศไว้ เข้าไปแทนการเขียนเข้าไปสดๆ ครับ
         // เพื่อสะดวก และอ่านง่าย
         OleDbCommand objCmd = new OleDbCommand(sqlText, myConn);
        
         //การใส่ Parameter ให้ใส่แบบนี้นะครับ ไม่ต้องไปกำหนด DataType มันครับ
         //แต่ ค่าที่ใส่เข้าไปควรมี DataType ตาม Column นั้นๆ
         objCmd.Parameters.Add(new OleDbParameter("@txtid", txtid.Text));
         objCmd.Parameters.Add(new OleDbParameter("@txtin", txtin.Text));
         objCmd.Parameters.Add(new OleDbParameter("@txtunit", txtunit.Text));
         objCmd.Parameters.Add(new OleDbParameter("@monthCalendar1", monthCalendar1.Text);
 
        
         // ตรงนี้ให้ Execute ตามปกติไปครับ  

    objCmd.ExecuteNonQuery();

}
ตอบเมื่อ Apr 28, 2012 โดย phanithanj (1,139 คะแนน)
selected Apr 30, 2012 โดย คุณชายเก่ง คุง
ขอบคุณครับพี่ Code พี่เป็นระเบียบ
และมีคอมเม้นอธิบาย ทำให้ผมทราบ
การทำงานของ Code มายิ่งขึ้นครับ
แต่ติดตรง objCmd.ExecuteNonQuery();
แล้วขึ้น error ตอนกดส่งค่า
Data type mismatch in criteria expression.
อะครับ เดี๋ยวผมจะลองแก้อีกที่ครับ
ปล. objCmd.Parameters.Add(new OleDbParameter("@monthCalendar1", monthCalendar1.Text)); ลืมใส่วงเล็บปิด สองอันครับ ^^
ผมก็ทำอยู่นะ MS Access

การทำกำหนด OleDbParameter
new OleDbParameter("@xxx", value);

เท่าที่เขียนๆ มามีข้อสรุป "ประมาณ" ว่า

value ต้องมี DataType ตาม Column นั้นๆ
พวก ตัวเลขทั้งหลาย int, byte, double, decimal หรืออะไรก็ว่าไป
ต้อง Covert ก่อนนะครับ

พวก string อันนี้ชัดเจนอยู่แล้ว ใส่ string ลงไปเลย

** อันนี้สำคัญ พวก DateTime อันนี้ ให้ Convert.ToDateTime ก่อน
แล้ว .ToString() ด้วย เราใส่ DateTime ลงไปเลย DB มันงง

ผม งม อยู่นาน เหมือนกัน กว่าจะรู้ว่ามันเป็นแบบนี้

MS Access เป็นไฟล์เล็กๆ ใช้สะดวก แต่ใช้ยาก แต่โดยรวมก็โอเคมาก
0 votes
คือไม่ได้ execute command อ่าครับมันจะไปเข้าได้ยังไง

เพิ่ม else objCmd.ExecuteNonQuery();
ตอบเมื่อ Apr 28, 2012 โดย Chayapol Limanon (510 คะแนน)
ผมใส่
           if (txtid.Text == string.Empty || txtin.Text == string.Empty || txtunit.Text == string.Empty)
           {
               MessageBox.Show("Please Fill in All fields");
               return;
           }
           else
           {
               objCmd.ExecuteNonQuery();
           }
แล้วขึ้น error ตอนกดส่งค่า
Data type mismatch in criteria expression.
อะครับ เดี๋ยวผมจะลองแก้ และขอความช่วยเหลือ้ดวยนะครับ ขอบคุณครับ
คือตรงที่เป็นคำสั่ง sql เรายังไม่ต้องใส่ชื่อ parameter ครับ ให้ใส่เป็น ? แล้วพอเรา Parameter.Add ตัว parameter จะเข้าไปแทนที่ ? ตามลำดับที่แอดเข้าไปครับ

OleDbCommand objCmd = new OleDbCommand("INSERT INTO Inventory(Inventory_ID, Inventory , Unit, Date_Inventory) values (?, ?, ?, ?)", myConn);
มันติดตรงเดิมครับ คือขึ้น error ตอนกดส่งค่า
Data type mismatch in criteria expression.
อะครับ เดี๋ยวผมจะลองแก้อีกที่ครับ
0 votes

ไม่แน่ใจว่า จะใช้ตรงนี้หรือป่าวน่ะครับ ในส่วนของ command.CommandText = "INSERT INTO DVD(title,locatie)VALUES(?,?)";

ข้างหลัง Values ต้องเป็นแบบนี้หรือป่าวครับ ตามจำนวน ของข้อมูลที่จะให้มันAddลงไป

ตอบเมื่อ Apr 28, 2012 โดย Kanes Srichum (144 คะแนน)
มันขึ้น เอรอร ตั้งแต่รันอะ ครับ
แล้วคำว่า CommandText ไม่ขึ้นสีฟ้า เรยครับ
0 votes
ลองเช็คไฟล์ Access ดูก่อนมั้ยครับ

ผมอ่านโค้ดคุณแล้ว งงๆ

เพราะที่ผมเขียน ผมใช้อีกวิธีนึง(สร้างฟังชั่นส่งคำสั่ง SQL ไปเลย)

แต่ดูท่าแล้ว ชนิดข้อมูลไม่ต้อง น่าจะเกิดจาก C# <-> Access แหละครับ
ตอบเมื่อ May 12, 2012 โดย Apimuk Jenwiteesuk (143 คะแนน)

Related questions

+2 votes
2 คำตอบ
0 votes
0 คำตอบ
0 votes
1 คำตอบ
520 views ถามเมื่อ Oct 24, 2013 in VB.Net โดย SP'Ter Sakorn (106 คะแนน)
+1 vote
1 คำตอบ
738 views ถามเมื่อ Apr 28, 2012 in C# โดย babyzaa159 (286 คะแนน)
0 votes
0 คำตอบ
412 views ถามเมื่อ Dec 9, 2015 in C# โดย Jidrid (102 คะแนน)
...