รบกวนเรื่อง ODBC connection string ครับ
กระทู้เก่าบอร์ด อ.Yeadram

 16,656   21
URL.หัวข้อ / URL
รบกวนเรื่อง ODBC connection string ครับ

Subject: รบกวนเรื่อง ODBC connection string ครับ
Date: Wed, 18 Jun 2008 09:37:41 +0700

ผม ใช้ ACCESS ติดต่อกับ SQL SERVER แบบ Multi USER ปกติผม set ODBC ได้ครับ แต่ไม่สะดวกเพราะ เมื่อปิดเครื่อง ตอนเช้ามาเปิดใหม่ ACCESS จะไม่รู้จัก ต้องใส่ค่า PASS WORD ใหม่ ทุกครั้ง จึงเข้าได้ เข้าใจว่าน่าจะเกี่ยวกับ สถานะ LOCK IN ตอนเปิด WINDOWS จึงอยากเขียนเป็น STRING เวลา LOAD ACCESS แล้วให้ CONNECT ได้เลย ผมจะแก้ตรงไหน ที่ไป LOAD มาจาก INTERNET ได้ว่า
"Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;"

??ือผมจะใช้มันอย่างไร และ จะผู้กับ EVENT ไหน ครับ

รบกวนด้วยครับ

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

1 @R00006
ขอรายละเอียดเพิ่มอีกหน่อยครับ
ใช้ mdb ติดต่อเลย หรือว่าใช้ adp ครับ
ไฟล์ตัวดังกล่าว ใช้สำหรับ user เดียวเลย คือแต่ละ user มีไฟล์ใครไฟล์มัน หรือว่า ไฟล์เดียวกันสามารถใช้ล็อกอินด้วย user อื่นก็ได้
ระหว่างที่ทำงานอยู่ ยังไม่ปิด ไฟล์ดังกล่าว อนุญาติให้มีการตัดการเชื่อมต่อหรือไม่ (มีการล็อกเอาท์) หรือว่าไม่ให้มีการล็อกเอ้าท์ ไม่มีมีการเปลี่ยนแปลงการเชื่อมต่อจนกว่า จะปิดไฟล์แล้วเปิดใหม่
2 @R00009
ผมก็เจอปัญหาคล้ายกัน คือ เวลามีเครื่องใหม่มาเราจะต้องเซ็ต ODBC ทุกครั้ง ผมอยากให้แบบผู้ใช้รันแบตไฟล์ติดตั้ง ODBC เองได้เลยจะสะดวกกว่า ไหม นะ
3 @R00015
ใช้ MDB ติดต่อเลยครับ โดยสร้าง ODBC ไว้รอ แล้ว link table จาก SQL server มาใน MDB มันทำงานได้
แต่พอปิดเครื่องแล้วเปิดใหม่

connect fial:
sql state'28000'
sql server error 18456
[microsofe][odbc sql server][sql server login failed for user'pharmo8\guest'

อาจพิมพ์ผิดบ้างนะครับ เพราะรีบ จากนั้น มันให้ OK
แล้วมันขึ้น textbox มารอรับ ให้เรากรอก
login
pawword
ใหม่
ผมกรอกที่ผมตั้งไว้ คือ login = **
pawword=**
(เป็นรหัส ADMIN อนุญาติให้ทำได้ทุกอย่าง)
มันก็ทำงานได้ ปกติ แต่อยากให้มันรู้เอง ไม่ต้องให้เรากรอก ผมจึงเข้าใจว่า มันน่าจะมีวิธีเขียนสายอักขระ
โดยไม่ต้อง key ได้นะครับ
ส่วนเรื่องไฟล์ตัวดังกล่าว ใช้สำหรับ user เดียวเลย
คือคิดจะแยก MDB แต่ละตัว สำหรับ ทุกแผนก แต่ว่า เข้าใช้ ฐานข้อมูล SQL ที่เป็น BLACK OFFICE เดียวกัน
ต่างคน ต่าง กรอกข้อมูล ไปรวมกัน แต่ใช้ รหัส LOCK in เดียวกันหมด
อนึ่ง คือ ผมเพิ่งคิดจะย้าย table ไป ใน SQL SERVER ปัญหาเรื่อง lock in หรือเปิดปิด FILE ผมยังไม่เข้าใจลึกซึ้ง
และยังไม่แน่ใจว่าจะมีปัญหาอะไรบ้าง ถ้าคุณ YEADRAM แนะนำเลย หรือ อธิบายเพิ่มเติมก็จะเป็นการดีอย่างยิ่งครับ

ขอบคุณครับ
4 @R00016
สำหรับผมแล้ว บอกตรงๆ ว่าไม่มีประสบการณ์ การใช้ mdb ติดต่อกับ ms sql
ผมเคยใช้แต่ adp ซึ่งก็ใช้เพียงคนเดียว เพราะระบบที่ผมผ่านมาจากประสบการณ์คือ จะใช้ mdb เป็น back บนเน็ตเวอร์ค แล้วใช้ mdb อีกตัวเป็น front ไปวางตาม client ต่างๆ ส่วนการใช้ ms sql server ผมเพียงแต่ทดลองด้วยตัวผมคนเดียว ยังไม่กล้าให้ user ตาม client ต่างลองเข้ามาใช้ จึงไม่มีปัญหาในส่วน record lock แต่อย่างใด ดังนั้นไม่กล่าที่จะเสนอแนะมากนัก

ด้วยความเข้าใจคร่าวๆ ผมอยากออกความเห็นแบบเดาๆ และเสนอแนะดังนี้
ผมจะสร้าง DSN ไว้เหมือนอย่างที่คุณเคยสร้าง แต่ผมจะไม่ให้ mdb ต่อไปยัง DSN ตลอดเวลา
ผมจะทำเป็นฟังก์ชั่นสองฟังก์ชั่น คือฟังก์ชั่น ต่อ กับฟังก์ชั่น ตัด การเชื่อมต่อ
เมื่อมีการเปิด mdb ตัวนี้ ให้เรียก ฟังก์ชั่น ตัด ก่อน แล้วค่อยเรียกฟังก์ชั่น ต่อ
โดยการทำงานคือ ผ่าน แมคโคร ชื่อ Autoexec ในแมคโครตัวนี้ ใช้คำสั่ง runcode แล้วก็ระบุอากิวร์เมนต์ให้ คำสั่ง เป็น ฟังก์ชั่น "ตัด" (การเชื่อมต่อ) ของเรา (ซึ่งเขียนไว้ในโมดูล)

ซึ่งผมไปค้นตัวอย่างเก่าๆ ที่ผมได้ขอผู้รู้ท่านอื่นๆ ไว้สะสมก็เห็นสองฟังก์ชั่นนี้ ที่พอเป็นแนวทาง (แต่จริงๆ แล้วไม่เคยใช้ ไม่เคยลองครับ)

Function DELLINK()
On Error Resume Next
DoCmd.DeleteObject acTable, "dbo_PTDREJ"
DoCmd.DeleteObject acTable, "dbo_PM_PROC"
DoCmd.DeleteObject acTable, "dbo_PTDPROD"
DoCmd.DeleteObject acTable, "dbo_PM_REJ"
End Function


Function DataLink()
'On Error Resume Next
Dim DBName As String
'DBName = DLookup("BackEnd", "tblInitial")
DoCmd.TransferDatabase acLink, "ODBC Database", _
"ODBC;DSN=DataPims;UID=pims;PWD=pims;LANGUAGE=us_english;" _
& "DATABASE=PPIMS", acTable, "PTDREJ", "dbo_PTDREJ"
DoCmd.TransferDatabase acLink, "ODBC Database", _
"ODBC;DSN=DataPims;UID=pims;PWD=pims;LANGUAGE=us_english;" _
& "DATABASE=PPIMS", acTable, "PM_PROC", "dbo_PM_PROC"
DoCmd.TransferDatabase acLink, "ODBC Database", _
"ODBC;DSN=DataPims;UID=pims;PWD=pims;LANGUAGE=us_english;" _
& "DATABASE=PPIMS", acTable, "PM_REJ", "dbo_PM_REJ"
DoCmd.TransferDatabase acLink, "ODBC Database", _
"ODBC;DSN=DataPims;UID=pims;PWD=pims;LANGUAGE=us_english;" _
& "DATABASE=PPIMS", acTable, "PTDPROD", "dbo_PTDPROD"

End Function

ถ้าผมจะนำไปใช้จริงๆ ผมคงจะออกมาประมาณว่า
มีฟอร์มสำหรับทำงานและปุ่มบนฟอร์ม ให้ปิด โปรแกรม mdb ซึ่งในปุ่ม ก็ให้เรียกใช้ฟังก์ชั่น Dellink ทุกครั้งครับเพื่อไม่ให้มีปัญหาเวลาเปิดใช้ครั้งต่อไป

ส่วนการเปิดใช้ก็ให้มี แมคโคร ชื่อ Autoexec ดังกล่าว เพื่อไปเรียกใช้ฟังก์ชั่น datalink (แต่ให้แน่ใจควรเรียกฟังก์ชั่น Dellink ก่อนทุกครั้ง) ซึ่งในฟังก์ชั่นนั้นจะเห็นคำสั่ง Transferdatabase ครับ
และในคำสั่ง Transferdatabase นั่นเองที่มีอาร์กิวเมนต์ให้คุณสามารถระบุ user กับ password เพื่อติดต่อไปยัง ms sql ได้

ลองดูก่อนไหมครับ วิธีนี้ เผื่อจะได้ตามความต้องการ
5 @R00017
หลักการที่ คุณ yearam ให้มาผมคิดว่าทำได้ แต่ TABLE ที่มี 80 อัน มีวิธี อ้างindex nameมาใส่ไหมเช่นเป็น ARREY แล้ว วนลูปนะครับ นะครับ
6 @R00018
ตอบคุณ k ก่อนนะครับ
สำหรับการสร้างหรือลบ DSN หรือ ODBC ขณะ runtime
ผมไปเจอที่เว็บนี้ครับ น่าจะใช้ได้นะครับ
http://www.devx.com/vb2themax/Tip/18332

ส่วนคำถามคุณ KRATOK-MAN เรื่องการสร้าง อาเรย์ชื่อตารางที่จะเปลี่ยนลิงค์
ผมได้เขียนตัวอย่างไว้ เป็นภาษาอังกฤษ (แบบงูๆ ปลาๆ ของผม)
เป็นการใช้ประโยชน์จาก ตารางของระบบครับ มันชื่อว่า MsysObjects
ซึ่งโดยปกติตารางนี้จะถูกซ่อนไว้ครับ
ลองดูการวนลูป ชื่อตารางทั้งหมด นะครับ ตามไปดูก่อน ถ้ายังดัดแปลงเข้ากับงานของคุณเองยังไม่ได้ มาถามเพิ่มเติมได้ครับ
http://thai-access.spaces.live.com
7 @R00051
ลองผิดลองถูกอยู่พักหนึ่งได้อย่างนี้ ครับ อาจจะไม่เหมือน ที่คุณ yeadram ให้มานะครับ


DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;DSN=hx; SERVER=jrserver;UID=sa;PWD=;", acTable, "Patient", "pt", False

ใช้ Access97
ไม่ได้ใช้ตัวแปร DBname ครับ
แต่ก็นั่น และ ได้แล้วก็อยากรู้เพิ่มว่า
มีวิธีการที่ จะ สร้าง DSN โดยไม่ต้องเข้าไป ใน odbc ไหมครับ
ประมาณว่า สั่งจาก ACCESS เลย แล้วค่อยเข้าไป Connect
เพราะเท่าที่รู้ DSN ก็เป็น TEXT FILE แต่ นามสกุล DSN
ผมลองนำออกมาได้อย่างนี้ครับ

[ODBC]
DRIVER=SQL Server
UID=sa
WSID=PHARM_03
SERVER=jrserver
Description=fhos

File นี้ชื่อ FHos.dsn ครับ
สามารถดูด้วย Note pate ได้
ขอเชิญ แลกเปลี่ยนความคิดเห็นครับ
8 @R00053
พบแล้วครับ สำหรับ ใครที่จะใช้ file เชื่อมต่อ DSN เชื่อมต่อ Server เขียนอย่างนี้ครับ

DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;fileDSN=Fhos; SERVER=jrserver;UID=sa;PWD=;", acTable, "Patient", "pt", False

สังเกต ที่ DSN ครับ ให้เปลี่ยนเป็น FileDSN

ส่วนตัว File DSN นั้น สามารถแก้ไขด้วย Note pate ธรรมดา อย่างนี้
save เป็น xxx.dsn
ใน
C:\Program Files\Common Files\ODBC\Data Sources
(ถ้า save ไว้ที่อื่นะต้องเขียน part เอง ซึ่งยุ่งยาก)

เช่นตัวอย่าง
ODBC]
DRIVER=SQL Server
UID=sa
WSID=PHARM_03
SERVER=jrserver
Description=fhos

ดังนั้นเขียนอย่างนี้ก็ได้
DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;fileDSN=Fhos; ;;;", acTable, "Patient", "pt", False
เพราะเรากำหนด ใน DSN แล้ว ทั้ง uid และ pwd

ส่วนการใช้งาน ก็ copy DSN ลงเครื่อง USER เลย และ COPY MDB ส่วนของ
user เลย ไม่ต้อง set
หรือจะรวบรวมเขียนเป็น BAT File ก็ได้ครับ

web อ้างอิง
http://support.acmeinternet.com/howtofaqs/database/filedsn.htm
9 @R00054
ยินดีด้วยครับที่เจอทางออก
"ส่วนการใช้งาน ก็ copy DSN ลงเครื่อง USER เลย และ COPY MDB ส่วนของ
user เลย"
ตรงนี้ ส่วนที่ว่า copy DSN น่ะ ถ้ามันสามารถ Edit ได้ด้วย Notepad อย่างที่ว่า
ผมว่าก็น่าจะเขียนเป็นฟังก์ชั่นใน Access ได้นะครับ ให้ไม่ต้องมีการก็อปปี้
แต่ให้ตรวจสอบว่าไฟล์นี้มีแล้วหรือไม่   ถ้ายังไม่มี ให้สร้างขึ้นมาเลย
ในเมื่อเรารู้แล้วว่า ต้องเขียนอะไรบ้างในนั้น
ซึ่งผลพลอยได้ก็คือ เราสามารถเปลี่ยน username, password, databasename ได้ในขณะ runtime ของ Access ได้เลย (กรณีจะเปลี่ยน แหล่งข้อมูลในอนาคต)

ใช้ filesystemobject ดูนะครับ (Microsoft Scripting)
10 @R00055
"ผมว่าก็น่าจะเขียนเป็นฟังก์ชั่นใน Access ได้นะครับ ให้ไม่ต้องมีการก็อปปี้
แต่ให้ตรวจสอบว่าไฟล์นี้มีแล้วหรือไม่   ถ้ายังไม่มี ให้สร้างขึ้นมาเลย
ในเมื่อเรารู้แล้วว่า ต้องเขียนอะไรบ้างในนั้น
ซึ่งผลพลอยได้ก็คือ เราสามารถเปลี่ยน username, password, databasename ได้ในขณะ runtime ของ Access ได้เลย (กรณีจะเปลี่ยน แหล่งข้อมูลในอนาคต)
ใช้ filesystemobject ดูนะครับ (Microsoft Scripting)"


ตรงนี้ผมไม่ get ครับ แนะมากกว่านี้อีกหน่อยได้ไหมครับ คือ หา file น่าจะได้
แต่ให้เขียน File ต่อเลยทำยังงัยครับ หรือ เจอแล้วให้ลบออก เดี๋ยวเขียนใหม่ แบบนี้
ผมยังไม่ค่อยเข้าใจ ส่วนเรื่อง filesystemobject งง เป็นไก่ เลยครับ หรือจะแนะให้ผมไปอ่าน
web อะไร หนังสือ ไหน เพิ่มเติมก็ได้ เพราะอธิบายในนี้อาจจะยาวนะครับ
11 @R01522
ขอถามต่อครับว่าถ้าเราใช้
DoCmd.TransferDatabase acLink, "ODBC", "ODBC;fileDSN=Fhos; ;;;", acTable, "Patient", "pt", False
แล้วถ้าเรามี table จำนวนมาก แล้วต้องการ link เข้ามาตอนเปิดโปรแกรมจะทำอย่างไรครับ โดยไม่ต้องมานั่งพิมพ์ชื่อ table ทั้งหมดเอง เพราะในอนาคตอาจมีการเพิ่ม table เข้ามาอีก แต่ขี้เกียวมาเพื่อคำสั่ง transferdatabase ครับ
12 @R01523
http://thai-access.spaces.live.com

ผมไม่ค่อยคล่องอังกฤษ แต่ก็กระแดะเขียนไปครับ ลองเข้าไปอ่านดูครับ
อาจนำไปประยุกต์ใช้ได้
- มันมีระบบเปลี่ยนพาสเวิร์ดได้ กรณี ปลายทางจำเป็นต้องใช้ พาสเวอร์ด
- เราสามารถกำหนดชื่อตารางให้มันล่วงหน้าได้ ว่า เมื่อจะทำการลิงค์ จะลิงค์ตารางชื่ออะไรบ้าง หรือ
- เราสามารถสั่งให้มันลิงค์ทั้งหมดเลยก็ได้ ลองๆ ดูนะครับ
13 @R01567
ขอบคุณครับ คุณ yeadram
แต่ผมต้องการ link กับ file ใน MySQL น่ะครับ
อันนี้เป็นแบบ MS Access
DoCmd.TransferDatabase acLink, “Microsoft Access”, LinkFile, acTable, sq, sq, False
สามารถทำได้แล้ว แต่พอ สink กับ MySQL ตรง linkfile จะเอามาจากไหนครับ เพราะการเก็บข้อมูลใน Access เป็นแบบ 1 file หลายตาราง แต่ใน MySQL เป็นแบบ 1 folder หลาย file (table)
ทีนี้ถ้าเป็น MySQL บน Windows ยังพอจะอ่านตารางที่เก็บอยู่ใน Folder เข้ามาได้ แล้วค่อย link ชื่อตารางเหล่านั้นเข้ามา
แต่พอฐานข้อมูลไปอยู่บน Linux ก็เลยไม่รู้จะ link มายังไงครับ
14 @R01569
access-mysql
กับ window ผมเคยลอง export - import ก็ลำบากครับ เนื่องจากปัญหาของ ชนิดของฟิลด์

แต่ถ้าการ link นี่จบเลยครับ ไม่เคยลองครับ
และยิ่งไปรันบน linux ยิ่งไปกันใหญ่ครับ ปัญหานี้จนด้วยเกล้าแล้วครับ อิอิ ต้องรอ อ.สันติสุข แล้วล่ะครับ
15 @R01570
ขอบคุณ คุณ yeadram อีครั้งครับ
16 @R01600
DoCmd.TransferDatabase acLink, “Microsoft Access”, LinkFile, acTable, sq, sq, False
รูปแบบนี้ ไม่น่าใช้ได้

น่าจะคล้ายตัวนี้ ไม่ได้ใช้ file แต่ผ่าน ODBC
การ link back office คนล่ะประเภทจะมี driver ของมันเอง
ที่ทำให้เข้าถึง ตัว DATABASE

DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;fileDSN=Fhos; SERVER=jrserver;UID=sa;PWD=;", acTable, "Patient", "pt", False

อันนี้เป็น sql server    ไม่ต้อง ใช้ samba share มา
รูปแบบก็ต่างกัน

แต่ linux มีระบบป้องกันการเข้าถึงเยอะแยะไปหมด
คงต้องดูเรื่อง สิทธิต่างๆด้วย อันนี้ก็ไม่รู้เหมือนกัน
17 @R01601
อ้างถึง >>>ทีนี้ถ้าเป็น MySQL บน Windows ยังพอจะอ่านตารางที่เก็บอยู่ใน Folder เข้ามาได้ แล้วค่อย link ชื่อตารางเหล่านั้นเข้ามา
แต่พอฐานข้อมูลไปอยู่บน Linux ก็เลยไม่รู้จะ link มายังไงครับ

ถ้าทำแบบนี้ได้ linux ก็น่าจะทำได้ โดยใช้ SAMBA SHARE มาก่อน
แล้วจึงเลือกทำ

DoCmd.TransferDatabase acLink, “Microsoft Access”, LinkFile, acTable, sq, sq, False
18 @R03170
อยากทราบว่าถ้าต้องการใช้มาโคร export table /query จาก access file a ไปยังอีก access file B ทำได้มั้ยคะ เพราะลองทำหลายหนแล้ว มีการexportแต่พอไปเปิดที่ ไผล์ปลายทางไม่พบว่าtable ไปปรากฎอยู่ ไม่ทราบว่าตกลงแล้วexport ไปที่ไหนเอ่ย ช่วยแนะนำด้วยค่ะ
19 @R03173
คือผมขออนุญาต ถามคุณ Krathok-man ครับ คือผมยังไม่เข้าใจของคำสั่งครับ
ผมได้อ่านดูกระทู้แล้วน่าจะนำมาใช้กับผมได้ ตอนนี้ผมใช้ Oracle
..ผมต้องเซ็ตค่าใน code อย่างไรดีครับ
Server="test"
user="apps"
password="app"


DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;fileDSN=Fhos; SERVER=test;UID=apps;PWD=;",app, "Patient", "pt", False

ที่ผม set แบบนี้ถูกหรือเปล่าครับ

ขอบคุณครับ


20 @R03180
ตอบคุณ paitoon (R03173)

ผมยังไม่เคยลองไม่เคยเล่นไม่รู้ว่า มันจะได้หรือเปล่า แต่คิดว่าไม่น่ามีปัญหา
แต่ว่าเท่าที่ดูการเขียนคำสั่งผมว่า มีจุดผิด คือเอา พาสเวอร์ดไปใส่ไว้ผิดที่ครับ ที่ถูกน่าจะเป็นแบบนี้

DoCmd.TransferDatabase acLink, "ODBC", _
"ODBC;fileDSN=Fhos; SERVER=test;UID=apps;PWD=app;",acTable, "Patient", "pt", False

หรือเปล่า..




ตอบคุณ Sara (R03170)
"พอไปเปิดที่ ไผล์ปลายทางไม่พบว่าtable ไปปรากฎอยู่" จากประโยคนี้
พอจะยืนยันได้ไหมครับ ว่ามัน "ไม่มีอยู่" จริง มันอาจจะซ่อนอยู่ หรือมันอาจจะยังไมรีเฟรช

ถ้ายังยืนยันไม่ได้ ลองใช้วิธีเหล่านี้ยืนยันดูครับ
- เปิด หน้าต่างฐานข้อมูลของไฟล์ปลายทาง เปิดดูกลุ่มของ Table กดปุ่ม F5
- ถ้าจำชื่อตารางที่ส่งเข้ามาได้ ลองสร้างคิวรี่เปล่าๆ อันหนึ่ง เขียน sql ว่า "Select * from ชื่อตาราง" แล้วลองรันคิวรี่ดูครับ ถ้ามีผล หรือไม่เกิด error ใดๆ แสดงว่า ตาราง หรือคิวรี่ที่เราส่งเข้ามาน่ะ   มันมาแล้ว แค่มันไม่แสดงผลเท่านั้นครับ
ลำดับต่อไปคือหาวิธีให้มันแสดงผล (ไม่น่าจะยาก)

ถ้ายืนยันแล้วว่า มันไม่มาจริง ต้องย้อนไปดูที่ไฟล์ต้นทางครับ ว่าขณะที่รันแมคโคร มี error ใดๆ หรือไม่ ถ้ามีต้องทำความเข้าใจกับ error แล้วแก้ไขตามนั้นครับ หรือ............
เอา error ตัวนั้นมาโพสต์ถามครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.4318s