กระทู้เก่าบอร์ด อ.Yeadram
4,783 22
URL.หัวข้อ /
URL
ขอโค้ดตรวจสอบตาราง ก่อน insert ข้อมูลค่ะ
หนูต้องการ สร้างปุ่มสำหรับ insert ข้อมูล จากไฟล์ฐานข้อมูลเป้าหมาย ภายนอกเข้ามา
แต่ติดปัญหาตรงที่ บางครั้งในไฟล์เป้าหมายไม่มี "ตาราง" ตามที่เรากำหนด
ซึ่งสมมติ กำหนดไว้ตายตัวดังนี้ค่ะ
ชื่อตาราง : TblCustom
ชื่อไฟล์เป้าหมาย : Sample
เก็บอยู่ที่ไดร์ฟ : D:\
สิ่งที่หนูต้องการคือ หากในไฟล์ฐานข้อมูลเป้าหมาย Sample ไม่มีตาราง TblCustom อยู่
ให้ยกเลิกการ insert และ MSG แจ้งเตือนให้ทราบค่ะ
รบกวนขอคำแนะนำด้วยนะคะ
ขอบคุณค่ะ
แต่ติดปัญหาตรงที่ บางครั้งในไฟล์เป้าหมายไม่มี "ตาราง" ตามที่เรากำหนด
ซึ่งสมมติ กำหนดไว้ตายตัวดังนี้ค่ะ
ชื่อตาราง : TblCustom
ชื่อไฟล์เป้าหมาย : Sample
เก็บอยู่ที่ไดร์ฟ : D:\
สิ่งที่หนูต้องการคือ หากในไฟล์ฐานข้อมูลเป้าหมาย Sample ไม่มีตาราง TblCustom อยู่
ให้ยกเลิกการ insert และ MSG แจ้งเตือนให้ทราบค่ะ
รบกวนขอคำแนะนำด้วยนะคะ
ขอบคุณค่ะ
22 Reply in this Topic. Dispaly 2 pages and you are on page number 1
2 @R11610
ขอบพระคุณอย่างยิ่งค่ะอาจารย์
หมายความว่า หนูต้องสร้างโมดูลขึ้นมา แล้วนำโค้ดนี้ ไปใส่ไว้ทั้งหมด
ไม่ว่าจะเลือกใช้กรณีที่ 1 หรือ 2 ก็ตาม ใช่หรือไม่คะ
ที่หนูต้องการคือกรณีที่ 2 เลยค่ะ
หนูจะลองเอาไปทำดูนะคะ
ขอบคุณค่ะ
หมายความว่า หนูต้องสร้างโมดูลขึ้นมา แล้วนำโค้ดนี้ ไปใส่ไว้ทั้งหมด
ไม่ว่าจะเลือกใช้กรณีที่ 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
ที่ 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ออกนะคะ ไม่ทราบเกี่ยวกันหรือเปล่า
ขอรบกวนด้วยนะคะ
ขอบคุณค่ะ
หนูทำโดยที่ยังไม่ได้ลบส่วนที่1ออกนะคะ ไม่ทราบเกี่ยวกันหรือเปล่า
ขอรบกวนด้วยนะคะ
ขอบคุณค่ะ
5 @R11615
เปลี่ยน End Sub (ตรงที่ error คลุมเป็นสีเทาอยู่)
ให้เป็น End Function
ส่วนที่ 1 ลบไปเลยครับ
ให้เป็น 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
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 แล้วจะผ่านได้ไม่มีปัญหาค่ะอาจารย์
หนูเจอปัญหา หากไฟล์ฐานข้อมูลเป็น.mde แล้วมันจะ Error ตามในรูปค่ะ
แต่หากเป็นไฟล์ .mdb แล้วจะผ่านได้ไม่มีปัญหาค่ะอาจารย์
9 @R11619
1 check ว่าไฟล์เป็นแบบ read-only หรือไม่ โดย clickขวา ชื่อไฟล์ Sample.mde เลือก property ดูด้านล่าง ถ้าเป็น read-only ให้เอาเครื่องหมายออก
2 เป็น file sharing หรือไม่ ให้ตั้งคุณสมบัติ การแชร์ Folder ให้ read และ write ได้
ตอนนี้นึกได้แค่นี้ เดี๋ยวนอนตื่นมา นึกได้จะมาตอบอีกนะครับ หรือเดี๋ยวท่านอื่นว่างก็มาช่วยตอบ
2 เป็น file sharing หรือไม่ ให้ตั้งคุณสมบัติ การแชร์ Folder ให้ read และ write ได้
ตอนนี้นึกได้แค่นี้ เดี๋ยวนอนตื่นมา นึกได้จะมาตอบอีกนะครับ หรือเดี๋ยวท่านอื่นว่างก็มาช่วยตอบ
10 @R11620
ตามที่ error report แจ้ง เป็นเรื่อง permission คือสิทธิ์ในการเรียกใช้งานครับ
ผมเดาว่าคุณอาจจะมีการกำหนดสิทธิื ผ่าน Workgroup แล้วพอจะทำเป็น .mde ก็ปลดสิทธิ์
หรือ อาจจะกำหนดสิทธิ์ไม่ตรงกัน
ทำให้เรียกใช้งานไม่ได้
ผมเดาว่าคุณอาจจะมีการกำหนดสิทธิื ผ่าน Workgroup แล้วพอจะทำเป็น .mde ก็ปลดสิทธิ์
หรือ อาจจะกำหนดสิทธิ์ไม่ตรงกัน
ทำให้เรียกใช้งานไม่ได้
11 @R11621
เป็นกรณีที่ อ. PichaiTC ตั้งข้อสัเกตุเลยค่ะ
ไฟล์เป้าหมาย มีการกำหนดสิทธิเอาไว้ หนูลองสร้างไฟล์จำลอง MDE ตัวใหม่ แบบไม่กำหนดสิทธิใดๆ แล้วมันผ่านได้ไม่มีปัญหาค่ะ
ไม่ทราบว่า เรามีวิธีตรวจสอบแบบอื่น อีกไหมคะ เพราะการกำหนดสิทธิ จำเป็นต้องคงไว้ค่ะ
ไฟล์เป้าหมาย มีการกำหนดสิทธิเอาไว้ หนูลองสร้างไฟล์จำลอง MDE ตัวใหม่ แบบไม่กำหนดสิทธิใดๆ แล้วมันผ่านได้ไม่มีปัญหาค่ะ
ไม่ทราบว่า เรามีวิธีตรวจสอบแบบอื่น อีกไหมคะ เพราะการกำหนดสิทธิ จำเป็นต้องคงไว้ค่ะ
12 @R11622
หนูคิดเอาเองเล่นๆ
จะมีทางเป็นไปได้ไหมคะว่า เมื่อเข้าเช็คไฟล์เป้าหมายต้นทางไม่ได้
งั้นเราเปลี่ยนมาเช็คที่ปลายทางแทนได้ไหมคะ ทำนองว่า
เมื่อสั่ง insert แล้วให้ล้างข้อมูลเก่าออกก่อน หากไม่มีข้อมูลใหม่เข้ามา จะด้วยเหตุใดก้แล้วแต่ เช่น
ไม่มีตารางเป้าหมาย หรือมี แต่เปิดเข้าไม่ได้ ก็ให้แจ้งเตือนแล้วยกเลิกการ insert
ไม่ทราบว่าในทางปฏิบัติ จะเป็นไปหรือไม่คะ
จะมีทางเป็นไปได้ไหมคะว่า เมื่อเข้าเช็คไฟล์เป้าหมายต้นทางไม่ได้
งั้นเราเปลี่ยนมาเช็คที่ปลายทางแทนได้ไหมคะ ทำนองว่า
เมื่อสั่ง 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" _
, "", ""
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]"
"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]"
พอดีหนูยังไม่ได้จับภาพมาให้ดูค่ะ
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]"
"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
ลองหลายรูปแบบดูครับ
เนื่องจากไม่ค่อยใช้วิธีนี้เท่าไหร่
ในกรณี 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 สีเหลือง ไม่ผ่านเช่นเดิม
ค่อยๆลองทำดูทุกแบบ ตามที่ท่านแนะนำแล้วค่ะ
หนูว่าจะขอพักไว้ก่อน อิอิ เกรงใจ ที่ต้องรบกวนอารย์ค่ะ
ต้องขอขอบคุณท่านทั้งสองอีกครั้งนะคะ
แก้ 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 ตัวไหนช่วยได้หรือเปล่าครับ
ผมลองกับไฟล์ที่เป็น .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
Time: 0.5933s
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
ทดลองดูครับ