Kết nối SQL server với Access

Ðề: Kết nối SQL server với Access

Hi hi, Cảm ơn các bác đã chỉ bảo. Thực ra cái gì em cũng đọc nhưng không sâu và không có hệ thống nên đôi lúc gặp khó khăn.
Vấn đề em đang thắc mắc là cùng 1 code đấy kết nối với data là access thì nó cho chỉnh sửa luôn nhưng chỉ thay dòng lệnh connection của Jet bẳng SQL thì nó lại không cho chỉnh sửa tí gì (gõ vào cũng không được nhé bác, chứ đừng nói gì đến update) mặc dù đã vào Enterprice manager để permission tất cả (select, update, delete)
 
Ðề: Kết nối SQL server với Access

Dim connStr As String, dim conn As New ADODB.Connection
connStr = "Data Source=servername;Initial Catalog=databasename;User Id=username;Password=password;"

With conn
.ConnectionString = connStr
.Open
End With
Hi! Bây giờ lại tám tiếp..
Như code ở trên thì ta đã có conn đại diện cho 1 đường nối đến data.
Rồi đường cái đã thông. Vấn đề là đi đến cuối đường thì người ta có xua chó ra hay là mình cứ tự nhiên đẩy cửa vào mà mần gì thì mần?
Có được phép hay không? Nó nằm ở chỗ userID và pass đó.

Ngoài ra, để đi đến ngôi nhà cuối đường đó ta có 3-4 đường để đến.
Hãy đi theo đường anh Phật đã mở.
Khi đã và nhà thì muốn ngồi bàn nào lại chả được nhỉ? Muốn mở table nào thì mở thôi.

Bình thuờng tạo form trong Access bạn cứ lôi table hoặc query ra thả vào ..
Mà nó có sẵn propecty : recordset type = "dynaset".
Còn ở đây, recordset lại có giá trị default là readonly .. thua là phải ....

Hồi nãy giờ phải down lại cái SQL2000 để cho đồng bộ với mọi người ... oải quá ...78MB ...mà ở quán này đường truyền chậm như rùa .. hê hê cuối cùng sau 1/2 giờ cũng đã cài xong SQL2000.
Và bây giờ ... thế tại sao bạn không cài example của Access mà học cho nhanh?
 
Ðề: Kết nối SQL server với Access

Làm gì có cái sample nào access+SQL2000 đâu bác, em mần mãi chẳng thấy đâu cả,bác có cho em xin 1 cái.
Cái SQL2000 em chỉ mới tiếp cận nó nên chưa hiểu về nó lắm. Em sục sạo trong cấu hình của nó nhưng tuyệt nhiên chẳng thấy chỗ nào có chế độ readonly cả. BÁc có thể nói rõ hơn về cái này hộ em không.
Theo em suy đoán chắc là do cấu hình trong SQL2000 thôi (vì kết nối với file access khác thì OK). Muốn chuyển sang access+SQL2000 nhưng quả thật thấy access hoạc access+access vẫn gọn nhẹ hơn (lại dễ backup nữa chữ):hysterical::hysterical:
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

SQL nếu khi cài lấy default của nó là IDuser = "SA" thì đây là ông trùm toàn quyền rồi.
Do đó khi bạn connect vào data với tên đó thì sẽ làm trùm, muốn gì cũng được. Không cần mở SQL server lên set lại nữa.

Cái sample của access+SQL2000 nằm trong bộ Office 2003.
Chạy setup và chọn add/remove feature ...
Trong mục bảng custom kế tiếp đánh dấu chọn []Choose advanced ...
Trong bảng kế tiếp chọn mục Access / Sample data thì chọn Run all my computer

Kể cả với Access+Access thì vẫn nên tập code hơn là dùng chuột click and click ...
Vì với những ngôn ngữ, phần mềm khác không có giao diện giống như vậy thì sao bạn làm?
Không thể sống đời với duy nhất một PM hay ngôn ngữ đâu.
Làm lập trình rốt cuộc rồi cũng phải biết tối thiểu 6-7 ngôn ngữ lập trình.

Nếu không code mà lại click click để tạo chương trình thì trao đổi qua mạng sao được.
Không ai biết tại sao bạn không làm được cả. Không mở file của bạn lên coi thì sao biết được?
Mà bạn kể lại hay chụp hình màn hình gửi lên cũng không được.
Những khai báo nằm ở khung propecty của đối tượng nào bạn đâu nhìn thấy hết, mà cũng không nhớ nó ở đâu nữa.

Nếu là code thì đọc từ trên xuống dưới cũng phải thấy nó chứ, phải không?
 
Ðề: Kết nối SQL server với Access

Hi, hi, chắc bác là programer chuyên nghiệp rồi, em là dân nghiệp dư chỉ dùng google để tự ngâm cứu thôi nên hạn chế nhiều lắm. Đây là đoạn code để connect và truy vấn dữ liệu(cái này em . mất cả ngày hôm nay mới làm được)


Private Sub Form_Load()
sqlstr = "select * from tbl_bangphong "
Dim db As Connection
Set db = New Connection
db.CursorLocation = adUseClient
' Cau lenh ket noi sql
db.Open "PROVIDER=MSDASQL;driver={SQL Server};server:-(local);uid=sa;pwd=sa;database=qlns;"

Set adoPrimaryRS = New Recordset
' adoPrimaryRS.Open sqlstr, db, adOpenStatic, adLockOptimistic
adoPrimaryRS.Open sqlstr, db, dbOpenDynaset, dbSeeChanges

Set Me.Form.Recordset = adoPrimaryRS


End Sub

Các bác thử xem nó chưa ổn chỗ nào giúp em nhé.Ah, mà em update office2003 chỉ có file Northwind thôi làm gì có cái nào dính với SQL đâu nhỉ
PS: 2 bac phatnq và muontennguoi co YM không cho em 1 cái để liên lạc cho tiện, nhiều khi post bài không biết bao giờ mới được trả lời
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Ngồi đọc và kiểm tra cả buổi sáng cuối cùng cũng tìm được cách khắc phục. Đó là do dùng chương trình import data từ access vào SQL nên nó mất đi Primarykey. Khi vào SQL đặt khóa chính cho trường dữ liệu thì nó cho edit liền. Nhưng các bác thử phân tích cái này nhé.
Cùng với 1 đoạn code dùng cho access+SQL2000 thì phải khai báo Index/key; Primary còn dùng với VB6+SQL2000 thì không cần
Ah, làm thế nào để gán giá trị vào combobox khi đã có recordset hả các bác, nếu em dùng phương thức addItem thì nó chỉ ra được 1 giá trị trong khi em muốn combo box có thể có nhiều giá trị (column). Thông thường trong access thì tại rowsource của comboxbox chỉ cần chọn
SELECT gt1,gt2 FROM table
là Ok, còn với cái recordset này em vẫn phải loay hoay mãi
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Hãy quên đi cái chuyện tự động Primary Key của Access.
Đó là việc phải nhớ kiểm soát chặt chẽ. Dữ liệu phải được kiểm soát tính hợp lệ thường xuyên.

Còn những chuyện recordset thì không có gì thay đổi cả.
Dù là da ta có nằm chung file .mdb hay không thì các resoure cũng luôn luôn là recordset.
Việc tách data riêng ra không hề làm xáo trộn hay thay đổi phần giao diện của các đối tượng.
 
Ðề: Kết nối SQL server với Access

Private Sub Form_Load()
sqlstr = "select * from tbl_bangphong "
Dim db As Connection
Set db = New Connection
db.CursorLocation = adUseClient
' Cau lenh ket noi sql
db.Open "PROVIDER=MSDASQL;driver={SQL Server};server:-(local);uid=sa;pwd=sa;database=qlns;"

Set adoPrimaryRS = New Recordset
' adoPrimaryRS.Open sqlstr, db, adOpenStatic, adLockOptimistic
adoPrimaryRS.Open sqlstr, db, dbOpenDynaset, dbSeeChanges

Set Me.Form.Recordset = adoPrimaryRS

End Sub

Các bác thử xem nó chưa ổn chỗ nào giúp em nhé.Ah, mà em update office2003 chỉ có file Northwind thôi làm gì có cái nào dính với SQL đâu nhỉ
PS: 2 bac phatnq và muontennguoi co YM không cho em 1 cái để liên lạc cho tiện, nhiều khi post bài không biết bao giờ mới được trả lời
Y!M: muontennguoi
Trong office2003 có 2 cái sample: 1 cái có da ta Access, 1 cái không có phải kết nối vào SQL server.
Cái có data là NorthwindCS.mdb còn cái không có là NorthwindCS.apd

ĐOạn lệnh của bạn chạy trên máy của tôi thì nó báo lỗi: biến chưa khai báo tường minh.
Ngoài ra nên khai báo rõ dùng giao diện recordset, connection nào ...

Private Sub Form_Load()
Dim db As Connection
Dim sqlstr As String
sqlstr = "select * from tbl_bangphong "
Set db = New ADODB.Connection
db.CursorLocation = adUseClient
' Cau lenh ket noi sql
db.Open "PROVIDER=MSDASQL;driver={SQL Server};server:-(local);uid=sa;pwd=sa;database=qlns;"
'Chỗ này chỉ nên dùng 1 trong 2: Provider hoặc driver thôi.
Set adoPrimaryRS = New ADODB.Recordset
adoPrimaryRS.Open sqlstr, db, 3,3 'xem thêm nhận xét phía dưới
Set Me.Form.Recordset = adoPrimaryRS
End Sub

Chỗ open recordset: sqlstr, db, 3,3 hoặc sqlstr, db, 3,4 đều được.
Nhưng như đã nói hôm trước nên chọn 3,3 để update ngay từng record khi vừa rời khỏi record đó.
Nếu chọn 3,4 thì phải dùng lệnh UpDateBatch và dùng để update toàn bộ recordset 1 lần.
 
Ðề: Kết nối SQL server với Access

Đúng là chuyển sang ADP có nhiều thứ phải thay đổi quá. Bác có phương án nào giải quyết vấn đề này không:
1. Em có 1 form(form1) truy vấn ADO từ table1, trên form1 có 2 textbox txtMaphong, txtTenphong. Trường maphong chỉ có trong table1, còn cả 2 trường maphong,tenphong đều có trong table2. Trước chỉ cần dùng Dlookup("Tenphong","table2","txtMaphong=maphong") tại ô txtTenphong là OK. Giờ em muốn tại ô txtTenphong giá trị được gán theo txtMaphong mà chưa được.
2. Tại ô txtmaphong(form1) khi click đúp thì mở form bảng phòng ra. Khi click đúp vào giá trị của mã phòng(form2) thì đóng bảng phòng lại và chuyển giá trị đó vào ô mã phòng (form1).

Còn vụ kết nối và sửa dữ liệu thì em làm được rồi. Có 2 cái đều không cho sửa dữ liệu
1. Không khai báo Index,key
2.Bỏ mất dòng db.CursorLocation = adUseClient
Nhưng vẫn chưa hiểu tại sao cái thằng VB nó không cần khai báo cả 2 cái trên mà vẫn can thiệp được vào dữ liệu
 
Ðề: Kết nối SQL server với Access

Đúng là chuyển sang ADP có nhiều thứ phải thay đổi quá. Bác có phương án nào giải quyết vấn đề này không:
1. Em có 1 form(form1) truy vấn ADO từ table1, trên form1 có 2 textbox txtMaphong, txtTenphong. Trường maphong chỉ có trong table1, còn cả 2 trường maphong,tenphong đều có trong table2. Trước chỉ cần dùng Dlookup("Tenphong","table2","txtMaphong=maphong") tại ô txtTenphong là OK. Giờ em muốn tại ô txtTenphong giá trị được gán theo txtMaphong mà chưa được.

Có 1 đống cách. Tuỳ theo hứng thích làm theo cách nào.
Tuỳ theo lúc đó đang có cái gì và dự định làm cái form đó để làm gì.
Không thấy cái file của bạn, không biết bạn đang làm cái gì thì sao trả lời được.

2. Tại ô txtmaphong(form1) khi click đúp thì mở form bảng phòng ra. Khi click đúp vào giá trị của mã phòng(form2) thì đóng bảng phòng lại và chuyển giá trị đó vào ô mã phòng (form1).

Đã nói ở topic của tienduyet.

Còn vụ kết nối và sửa dữ liệu thì em làm được rồi. Có 2 cái đều không cho sửa dữ liệu
1. Không khai báo Index,key
2.Bỏ mất dòng db.CursorLocation = adUseClient
Nhưng vẫn chưa hiểu tại sao cái thằng VB nó không cần khai báo cả 2 cái trên mà vẫn can thiệp được vào dữ liệu

Lâu lâu sẽ hiểu ..:cheers1:
 
Ðề: Kết nối SQL server với Access

Của behattieu là file kèm theo phía dưới đây.
Trong chương trình của bạn còn khá nhiều vấn đề chưa xử lý.
Chẳg hạn như: nếu query mà không có record nào thoả điều kiện thì recordset sẽ là rỗng, khi đó gán vào form nó sẽ ra sao?
Nếu dùng Access trên cùng 1 file thì thực ra Access đã tự xử lý. Nay ta tự connect thì phải nhớ xử lý.
Chính nhờ tự làm lấy mà ta hiểu rõ hơn hoạt động của máy, điều mà thực ra Access mà ta dùng bấy lâu nay vẫn có làm nhưng ta không biết.
 

Đính kèm

  • vidu.rar
    27.4 KB · Lượt xem: 283
Ðề: Kết nối SQL server với Access

Cám ơn bác nó cũng tạm ổn nhưng ý em muốn mở rộng nó hơn chắc nói ở trên chưa rõ lắm. Với ví dụ trên
1. VÌ form frm_hosocanhan có nhiều ô lấy dữ liệu giống bảng nơi khám (trong file ví dụ nên em cắt bớt đi) nên nếu tạo query như trên rất phức tạp. Nếu có cách khai báo dạng rs1, rs2 rồi link được dữ liệu thì tốt hơn.
Bên cạnh đó với query như bác có những người họ chưa xác định được nơi KCB thì sẽ thiếu ngay trong form hiện thị. Cái này nếu dùng query chắc phải dùng kiểu relationship left, right, chứ không theo kiểu trực tiếp như thế được. Hồ sơ nhân sự được nhập ngay từ khi họ mới vào làm việc, nhưng việc cấp phát thẻ phải từ sau khi đóng BHXH nên hồ sơ sẽ tồn tại trước mặc dù trường MaKCB có thể là Null
2.Tại ô gán Tag, em không muốn chỉ định cụ thể là ô MaKCB mà là 1 ô bất kỳ nào đó đang nhận focus (vì có thể trên form này tên của nó là MaKCB, trên form khác là MaKCB1,..)
Thực ra mục đích là Control1 ban đầu kích hoạt Control 2. Control2 sau khi thao tác và close lại thì trả focus cho control 1
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Thì viết ra thêm. Mỗi ô cần gán thì đặt 1 button "Find" kế bên ô đó.

Muốn dùng cho nhiều chuyện khác nhau thì chính cái form Find đó phải thiết kế linh động hơn nữa để nhận tham số truyền vào.
Giống y cái Dlookup vậy thôi.

Nếu lập trình CSDL server-cleint thì hãy quên đi cái relationhship.
Chỉ sử dụng những gì mà chắc chắn rằng mọi phần mềm CSDL luôn luôn có.
Nếu không sẽ không tương thích nhau, giảm khả năng khai thác.
 
Ðề: Kết nối SQL server với Access

Khi em tạo 1 query trong data,mdb có dạng sau:
SELECT a.*, b.MaKCB AS xxx, b.TenNKB
FROM tbl_hosocanhan AS a LEFT JOIN tbl_0Bangnoikham AS b ON a.MaKCB = b.MaKCB;

Thì tại query đó có thể chỉnh sửa dữ liệu bình thường.
Tuy nhiên khi sử dụng câu lệnh SQL này cho form frm_hosocanhan thì form frm_hosocanhan lại không thể chỉnh sửa được.
 
Ðề: Kết nối SQL server với Access

Khai báo table nào là Unique để máy biết là MaKCB của table đó là không chỉnh sửa.
Xem kỹ lại mẫu của tôi trong bài trước.
 
Ðề: Kết nối SQL server với Access

Em đã xử lý được vấn đề này, không cần dùng Unique, và source của frm_hosocanhan cũng chỉ lấy từ chính tbl_hosocanhan. Cái này có thể áp dụng để mở rộng ghi chú trên mainform mà không cần thay đổi nguồn vào cho main form.
 
Ðề: Kết nối SQL server với Access

Đúng đó. Đó là cách cần làm.
Đừng dựa trên relationhship.
Query nhiều table chỉ nên dùng để xem.
Cần xem xét cách nào giảm tải cho server.
 
Ðề: Kết nối SQL server với Access

Ah, Bác cho em hỏi 1 cái. Em đang định dùng 1 table để lưu trữ các câu lệnh SQL . Làm thế nào để tạo 1 Function kết nối dạng Public để dùng chung cho toàn bộ các kết nối. Ví dụ
Private Sub Form1_Load()
sql="Câu lệnh đựoc lấy từ table SQL"
Call ketnoi
End sub
--------
Private Sub Form2_Load()
sql="Câu lệnh đựoc lấy từ table SQL"
Call ketnoi
End sub
--------
Module kết nối giờ phải khai báo như thế nào ?

-Tiện thể: Có cách nào để gán source object cho 1 subform (dạng datasheet) 1 recordset mà không tạo thêm 1 table, query hay form khác không (Chỉ có duy nhất 1 form và trong nó có 1 ô subform còn không có bất kỳ 1 đối tượng nào khác)
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Ah, Bác cho em hỏi 1 cái. Em đang định dùng 1 table để lưu trữ các câu lệnh SQL . Làm thế nào để tạo 1 Function kết nối dạng Public để dùng chung cho toàn bộ các kết nối. Ví dụ
Private Sub Form1_Load()
sql="Câu lệnh đựoc lấy từ table SQL"
Call ketnoi
End sub
--------
Private Sub Form2_Load()
sql="Câu lệnh đựoc lấy từ table SQL"
Call ketnoi
End sub
--------
Module kết nối giờ phải khai báo như thế nào ?

-Tiện thể: Có cách nào để gán source object cho 1 subform (dạng datasheet) 1 recordset mà không tạo thêm 1 table, query hay form khác không (Chỉ có duy nhất 1 form và trong nó có 1 ô subform còn không có bất kỳ 1 đối tượng nào khác)


Ý bạn tôi chưa hiểu lắm, nên hỏi lại bạn cái:
Bạn muốn rằng cứ mỗi form thì bạn sẽ cho open cái recordset tương ứng với câu lệnh SQL mà bạn chọn, đúng không?

Nếu thế thì bạn làm cái function trả về kết quả là 1 ADODB.Recordset, ví dụ như:

Public Function MyRecordset(stSQL As String) As ADODB.Recordset
Dim connStr As String, dim conn As New ADODB.Connection
connStr = "Data Source=servername;Initial Catalog=databasename;User Id=username;Password=password;"
On Error Goto err_Connection
With conn
.ConnectionString = connStr
.Open
End With
Dim rs As New ADODB.Recordset
With rs
.ActiveConnection = conn
.LockType = ... 'tùy
.CursorLocation = ... 'tùy
.Open (stSQL)
End With
MyRecordset = rs
end_MyRecordset:
Exit Function
err_Connection:
MsgBox err.Description
MyRecordset = Nothing
Resume end_MyRecordset
End Function

Đại khái vậy.

Còn cái câu tiện thể, cũng không hiểu luôn. Tuy nhiên về nguyên tắc thì subform phải có một source object, có thể là một table, một query, hay một form khác.
Nếu là một recordset thì bạn cũng phải tạo form, rồi gán recordsource cho form đó từ cái recordset của bạn.Sau đó bạn lấy cái form đó làm source object cho subform.
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Kỹ thuật giải trình thanh tra BHXH

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top