ขอโค้ดตรวจสอบตาราง ก่อน insert ข้อมูลค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 4,784   22
URL.หัวข้อ / URL
ขอโค้ดตรวจสอบตาราง ก่อน insert ข้อมูลค่ะ

หนูต้องการ สร้างปุ่มสำหรับ insert ข้อมูล จากไฟล์ฐานข้อมูลเป้าหมาย ภายนอกเข้ามา
แต่ติดปัญหาตรงที่ บางครั้งในไฟล์เป้าหมายไม่มี "ตาราง" ตามที่เรากำหนด
ซึ่งสมมติ กำหนดไว้ตายตัวดังนี้ค่ะ

ชื่อตาราง             : TblCustom
ชื่อไฟล์เป้าหมาย : Sample
เก็บอยู่ที่ไดร์ฟ      : D:\

สิ่งที่หนูต้องการคือ หากในไฟล์ฐานข้อมูลเป้าหมาย Sample ไม่มีตาราง TblCustom อยู่
ให้ยกเลิกการ insert และ MSG แจ้งเตือนให้ทราบค่ะ

รบกวนขอคำแนะนำด้วยนะคะ
ขอบคุณค่ะ

22 Reply in this Topic. Dispaly 2 pages and you are on page number 1

1 @R11608
เปิด References โดยไปที่ Tools-->References-->แล้วเลือก
Microsoft ADO Ext x.x for DDL AND SECURITY (msadox28.tlb (2.8) , หรือ msadox.dll (6.0)

ประกาศตัวแปรไว้ใน Module
Global tdf As ADOX.Table
Global objCatalog As ADOX.Catalog
Global objConnection As ADODB.Connection

Public Function ChkTbl_ADOX(tbl As String) as Boolean
Set objCatalog = CreateObject("ADOX.Catalog")
Set objConnection = CreateObject("ADODB.Connection")

'1 กรณีใช้ตรวจสอบในฐานข้อมูลเดียวกัน
Set objConnection = CurrentProject.Connection

'2 กรณีต่างฐานข้อมูล
Set objConnection = New ADODB.Connection
objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=D:\Sample.mdb"
'เลือก 1 หรือ 2 ตามที่ต้องการ
Set objCatalog.ActiveConnection = objConnection
    For Each tdf In objCatalog.Tables
           If UCase(tdf.Name) = UCase(tbl) Then
                  ChkTbl_ADOX=True
           End If
    Next
objConnection.Close
End Sub

ที่ cmdButton1_Click
if ChkTbl_ADOX("TblCustom") then
      msgbox "พบตาราง"
else
     msgbox "Not Found"
end if
ทดลองดูครับ
2 @R11610
ขอบพระคุณอย่างยิ่งค่ะอาจารย์
หมายความว่า หนูต้องสร้างโมดูลขึ้นมา แล้วนำโค้ดนี้ ไปใส่ไว้ทั้งหมด
ไม่ว่าจะเลือกใช้กรณีที่ 1 หรือ 2 ก็ตาม ใช่หรือไม่คะ
ที่หนูต้องการคือกรณีที่ 2 เลยค่ะ

หนูจะลองเอาไปทำดูนะคะ
ขอบคุณค่ะ
3 @R11611
ส่วนนี้ไว้ที่ฟอร์ม เหตุการณ์ที่ปุ่ม click อาจเปลี่ยนเป็นเหตุการณ์อื่นก็ได้ครับ

ที่ cmdButton1_Click
'ตรงนี้หมายถึงการตรวจเช็คว่ามีไฟล์ TblCustom จะคืนค่า True
if ChkTbl_ADOX("TblCustom") then
     'มีตารางจริงจะทำอะไรก็ทำครับ
      msgbox "พบตาราง"
else
     'ไม่มีตารางจะทำอะไรดี ออกไปเลย ก็ exit sub ไงครับ
     msgbox "Not Found"
end if

ส่วน code อื่นไว้ที่ module แล้วลบส่วนที่ 1 ทิ้ง หรือ mark ด้านหน้า
ด้วย single quote (')
'1 กรณีใช้ตรวจสอบในฐานข้อมูลเดียวกัน
'Set objConnection = CurrentProject.Connection

4 @R11613
ลองทำแล้วค่ะ หนูไม่ทราบว่า ผิดตรงไหน มัน Error ตามในรูปเลยค่ะ



หนูทำโดยที่ยังไม่ได้ลบส่วนที่1ออกนะคะ ไม่ทราบเกี่ยวกันหรือเปล่า
ขอรบกวนด้วยนะคะ
ขอบคุณค่ะ
5 @R11615
เปลี่ยน End Sub (ตรงที่ error คลุมเป็นสีเทาอยู่)
ให้เป็น End Function

ส่วนที่ 1 ลบไปเลยครับ
6 @R11616
ตาม อ.PichaiTC ครับ

Public Function ChkTbl_ADOX(tbl As String) as Boolean
Set objCatalog = CreateObject("ADOX.Catalog")
Set objConnection = CreateObject("ADODB.Connection")

Set objConnection = New ADODB.Connection
objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=D:\Sample.mdb"

ChkTbl_ADOX=False
Set objCatalog.ActiveConnection = objConnection
    For Each tdf In objCatalog.Tables
           If UCase(tdf.Name) = UCase(tbl) Then
                  ChkTbl_ADOX=True
           End If
    Next
objConnection.Close
End Function
7 @R11617
เย้...ผ่านฉลุยแล้วค่ะ
ขอขอบคุณอาจารย์ทั้งสองท่าน อย่างยิ่งนะคะ
8 @R11618
ขอรบกวนเพิ่มเติมอีกนิดนึงค่ะอาจารย์
หนูเจอปัญหา หากไฟล์ฐานข้อมูลเป็น.mde แล้วมันจะ Error ตามในรูปค่ะ



แต่หากเป็นไฟล์ .mdb แล้วจะผ่านได้ไม่มีปัญหาค่ะอาจารย์
9 @R11619
1 check ว่าไฟล์เป็นแบบ read-only หรือไม่ โดย clickขวา ชื่อไฟล์ Sample.mde เลือก property ดูด้านล่าง ถ้าเป็น read-only ให้เอาเครื่องหมายออก
2 เป็น file sharing หรือไม่ ให้ตั้งคุณสมบัติ การแชร์ Folder ให้ read และ write ได้
ตอนนี้นึกได้แค่นี้ เดี๋ยวนอนตื่นมา นึกได้จะมาตอบอีกนะครับ หรือเดี๋ยวท่านอื่นว่างก็มาช่วยตอบ
10 @R11620
ตามที่ error report แจ้ง เป็นเรื่อง permission คือสิทธิ์ในการเรียกใช้งานครับ

ผมเดาว่าคุณอาจจะมีการกำหนดสิทธิื ผ่าน Workgroup แล้วพอจะทำเป็น .mde ก็ปลดสิทธิ์
หรือ อาจจะกำหนดสิทธิ์ไม่ตรงกัน
ทำให้เรียกใช้งานไม่ได้
11 @R11621
เป็นกรณีที่ อ. PichaiTC ตั้งข้อสัเกตุเลยค่ะ
ไฟล์เป้าหมาย มีการกำหนดสิทธิเอาไว้ หนูลองสร้างไฟล์จำลอง MDE ตัวใหม่ แบบไม่กำหนดสิทธิใดๆ แล้วมันผ่านได้ไม่มีปัญหาค่ะ

ไม่ทราบว่า เรามีวิธีตรวจสอบแบบอื่น อีกไหมคะ เพราะการกำหนดสิทธิ จำเป็นต้องคงไว้ค่ะ

12 @R11622
หนูคิดเอาเองเล่นๆ
จะมีทางเป็นไปได้ไหมคะว่า เมื่อเข้าเช็คไฟล์เป้าหมายต้นทางไม่ได้
งั้นเราเปลี่ยนมาเช็คที่ปลายทางแทนได้ไหมคะ ทำนองว่า

เมื่อสั่ง insert แล้วให้ล้างข้อมูลเก่าออกก่อน หากไม่มีข้อมูลใหม่เข้ามา จะด้วยเหตุใดก้แล้วแต่ เช่น
ไม่มีตารางเป้าหมาย หรือมี แต่เปิดเข้าไม่ได้ ก็ให้แจ้งเตือนแล้วยกเลิกการ insert

ไม่ทราบว่าในทางปฏิบัติ จะเป็นไปหรือไม่คะ
13 @R11623
code ตรงนี้

objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source=D:\Sample.mdb"

ให้แก้โดยเพิ่ม User กับ Password ไปด้วยครับ

objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=D:\Sample.mdb" _
    , "", ""
14 @R11624
objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=D:\Sample.mdb" _
    , "[ระบุ UserID]", "[ระบุ password]"
15 @R11627
เพิ่มบรรทัดดังกล่าวไม่ได้ค่ะอาจารย์ มันไม่ยอมให้เพิ่ม จะขึนแดงประมาณนี้เลยค่ะ

objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=D:\Sample.mde" _
    , "[ระบุ UserID]", "[ระบุ password]"

พอดีหนูยังไม่ได้จับภาพมาให้ดูค่ะ
16 @R11628
objConnection.Open _
    "Provider= Microsoft.Jet.OLEDB.4.0; " & _
    "Data Source=D:\Sample.mde" & _
    , "[ระบุ UserID]", "[ระบุ password]"
17 @R11630
ผมไม่แน่ใจว่าจะต้องใช้ในรูปแบบไหน
ลองหลายรูปแบบดูครับ
เนื่องจากไม่ค่อยใช้วิธีนี้เท่าไหร่
ในกรณี Workgroup (system database)
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;

ในกรณี Workgroup (system database) specifying username and password
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Sample.mde;Jet OLEDB:System Database=system.mdw;User ID=myUsername;Password=myPassword;
หมายเหตุ : system.mdw ชื่อไฟล์ system ที่ set permission
myUsername ระบุ user name
myPassword ระบุ password
18 @R11632
ยังไม่สำเร็จเลยค่ะอาจารย์
แก้ Error สีแดงได้แล้ว แต่ก็ยังติด debug สีเหลือง ไม่ผ่านเช่นเดิม
ค่อยๆลองทำดูทุกแบบ ตามที่ท่านแนะนำแล้วค่ะ

หนูว่าจะขอพักไว้ก่อน อิอิ เกรงใจ ที่ต้องรบกวนอารย์ค่ะ

ต้องขอขอบคุณท่านทั้งสองอีกครั้งนะคะ

19 @R11633
ขอถามต่อนิดนะครับ
ผมลองกับไฟล์ที่เป็น .accdb (ถ้าเป็น mdb ของ 2003 ใช้ได้)
โปรแกรมจะฟ้อง

Run-time error '-2147467259 (80004005)':
Unrecognized database format 'D:\Sample.accdb'.

คือเหมือนกับว่า ถ้าเป็นเวอร์ชั่น 2007 ขึ้นไปอ่านไม่ได้ใช่ไหมครับ
ผมลองเปลี่ยนนามสกุลเล่นดูเป็น Sample.mdb ก็ไม่ได้ เหมือนกับโปรแกรม Microsoft.Jet.OLEDB.4.0 มอง Format ใหม่ ในไฟล์ไม่ออกจริงๆครับ

ต้องใช้ References ตัวไหนช่วยได้หรือเปล่าครับ
20 @R11634
กำหนด USER ID เป็น admin
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2788s