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

Ðề: 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ừng làm:

Dim conn As ADODB.Connection
... open conn ....
Rồi sau đó:

Dim rs As ADODB.Recordset
rs = New ADODB.Recordset
rs.open srtSQL, conn ...

Hiển nhiên là cũng có thể tiếp:
Dim rs1 As ADODB.Recordset
rs1 = New ADODB.Recordset
rs1.open srtSQL, conn ...
Dim rs2, rs3, rs4 ...
Tóm lại:
1 Connection dùng để tạo 1 kết nối đến 1 data.
Các Recordset dùng để chứa các kết quả query.

Khai báo public để các form khác có thể nhìn thấy.


Như vậy ta chỉ cần dùng nhiều conn khi cần connect đến nhiều data cùng lúc (các data có thể là khác nhau, thậm chí khác hệ như là SQL server, MySQL, Foxpro, Excel ...).


Vấn đề nữa, bạn đã từng:
Set conn = Nothing
Set rs = Nothing
Điều đó nghĩa là gì?

Bởi vì trong môi trường server-cleint thì cùng lúc có nhiều connect từ phía cleint vào cùng 1 data trên server, do đó, nếu lưu giữ handle của data đó quá lâu hơn mức cần thiết sẽ làm server nhồi máu cơ tim...
Vì thế, bạn đã cắt đường connect ngay sau khi đã lấy đủ dữ liệu về máy.

Hãy suy nghĩ khi quyết định: giữ connection để có ngay khi cần; hay là mỗi lần cần thì mỗi lần connect?

Chỉ 1 mình mình dùng trên máy đơn thì hoặc trên server nhỏ thì chắc không có hiện tượng quá nhiều connection cùng lúc vào 1 data. Nhưng cần nhớ xoá handle khỏi bộ nhớ khi đóng project. VÌ lúc đó ODBC vẫn còn đang mở data. Phải báo đóng lại bằng Set conn= Nothing
Với Access nghe nói có thể chịu cùng lúc 31 connection.
Nhưng khi tôi thử trên máy của tôi thì chưa bao giờ nó nối nổi cùng lúc 12 connection.:sweatdrop:
Nghe nói SQL server có thể chịu nổi cùng lúc hàng ngàn connection.
 
Ðề: Kết nối SQL server với Access

1/Đang gán đoạn code của bác vào chương trình nhưng chưa chạy. Ý của em cụ thể thế này:
Trong chương trình ta có nhiều form. Mỗi form sẽ được gán bằng 1 recordset. Thay vì phải theo dõi đoạn code rất dài và mỗi lần sửa thì phải thay thế các khai báo kết nỗi trong từng form thì ta khai báo chung 1 function kết nối. Khi kích hoạt mỗi form thì chỉ cần khai báo chuỗi SQl cho form rồi gọi function để kết nối với SQL khai báo.
Nếu rộng hơn nữa về sau ta chỉ cần thay đổi các thông tin kết nối được lưu trữ trong 1 table để kết nối từ chươngtrình đến CSDL
2/Còn về cái mục tiện thể thì em đi được 1/2 quãng đường rồi. Trước đây dữ liệu của em rất nhiểu quan hệ 1-nhiều nên phải dùng kiểm master-Detail nên toàn dùng mainform và subform. Nay em chỉ muốn dùng 1 form mà thể hiện Master/Detail. Sau một hồi hì hục thì đã nghĩ ra là dùng 1 cái kết nối với master còn thay thế subform bằng datagrid. Tuy nhiên mới đựoc 1 nửa đoạn đường vì thằng datagrid chưa biết làm sao để update dữ liệu (có thể edit nhưng chưa biết cách update). Bên cạnh đó dữ liệu tại datagrit nó không có dạng nhiều dòng trong 1 ô mặc dù đã để chiều cao của dòng dữ liệu chứa được đến vài dòng. Các bác giúp việc edit cái datagrid hộ em với

Bài viết vừa rồi của bác muontennguoi chính là cách thức mà em đã sử dụng để tạo các ghi chú cho mainform
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

1/Đang gán đoạn code của bác vào chương trình nhưng chưa chạy. Ý của em cụ thể thế này:
Trong chương trình ta có nhiều form. Mỗi form sẽ được gán bằng 1 recordset. Thay vì phải theo dõi đoạn code rất dài và mỗi lần sửa thì phải thay thế các khai báo kết nỗi trong từng form thì ta khai báo chung 1 function kết nối. Khi kích hoạt mỗi form thì chỉ cần khai báo chuỗi SQl cho form rồi gọi function để kết nối với SQL khai báo.
Nếu rộng hơn nữa về sau ta chỉ cần thay đổi các thông tin kết nối được lưu trữ trong 1 table để kết nối từ chươngtrình đến CSDL

Dài là bao nhiêu? Chưa chắc code dài thì khi chạy sẽ chậm hơn code ngắn.
Tuy nhiên việc thay đổi data là có thể.
Giả sử ta đang thiết kế trên máy ở nhà. Sau đó sẽ mang vào cty để chạy. Khi đó da ta và userID, pass ... sẽ thay đổi.
Vì thế hãy đặt 1 biến ConnectString ở mức public.
Vì tất cả những gì ưa biến động đều nằm cả trong giá trị chuỗi ConnectString này
Khi thay đổi nguồn data thì chỉ cần sửa biến đó thôi. Tất cả các form của project sẽ không cần sửa code.

Nếu là phần mềm dùng để bán cho nhiều cty thì chỉ cần lưu chúng trong table thông tin DN.
Khi project chạy sẽ tính toán và tạo chuỗi ConnectString.



2/Còn về cái mục tiện thể thì em đi được 1/2 quãng đường rồi. Trước đây dữ liệu của em rất nhiểu quan hệ 1-nhiều nên phải dùng kiểm master-Detail nên toàn dùng mainform và subform. Nay em chỉ muốn dùng 1 form mà thể hiện Master/Detail. Sau một hồi hì hục thì đã nghĩ ra là dùng 1 cái kết nối với master còn thay thế subform bằng datagrid. Tuy nhiên mới đựoc 1 nửa đoạn đường vì thằng datagrid chưa biết làm sao để update dữ liệu (có thể edit nhưng chưa biết cách update). Bên cạnh đó dữ liệu tại datagrit nó không có dạng nhiều dòng trong 1 ô mặc dù đã để chiều cao của dòng dữ liệu chứa được đến vài dòng. Các bác giúp việc edit cái datagrid hộ em với

Bài viết vừa rồi của bác muontennguoi chính là cách thức mà em đã sử dụng để tạo các ghi chú cho mainform

Subform thì đã sao chứ? Khác gì với grid đâu? Cũng 1 thứ thôi.
Khi mở 1 project thì nó cũng đã load toàn bộ các form rồi.
Và do đó nếu khai báo public thì cũng có thể nhìn thấy được recordset.
Cái chính là không thể chỉnh sửa cùng lúc 2 table có quan hệ.
Nếu 2 table gọi lên màn hình không phải là Join query thì vô tư.
Hiển nhiên khi đó cần tưới lại cho gird (subform) mỗi khi master sang dòng khác. Dùng filter chẳng hạn.

Mở Recordset với clocktype = 3 thì mỗi lần con trỏ bàn phím rời khỏi 1 dòng thì nó sẽ update ngay dòng đó.

Còn cái gird cho xuống dòng khi đoạn text dài thì tự mò đi chứ, làm Access bao lâu rồi mà ...:dapghe:

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

Cái mục 1 của bác nói đúng ý em rồi đấy, đang kiểm tra nhưng vẫn chưa được, mệt quá.

Còn cái phần 2 em muốn cho chương trình ít form thôi nên định gắn cái datagrid vào nhưng gặp trục trặc quá. Cả buổi tối tìm trên google mà chẳng có (với VB thì ngon lành còn VBA thì chịu chết).
Tình huống xấu nhất là quay trở về cái máng lợn (mainform+subform):hysterical:
 
Ðề: Kết nối SQL server với Access

Bác nào có công cụ chuyển mdb==> ADP mà giữ nguyên được key không?
Hiện nay cứ mỗi lần chuyển mdb==> ADP thì phải log vào SQL đặt lại tất cả các key nên mất thời gian quá. Bên cạnh đó nó mất cả relationship(diagram). Em test thử mấy phần mềm rồi nó chỉ co import data chứ không giữ được key và diagram
 
Ðề: Kết nối SQL server với Access

Vậy cho biết mặt.
Cứ quen click click chọn chọn trong Access rồi nên bây giờ đâm ra bối rối .. kê kê ..

Mô hình CSDL quan hệ đến hồi phá sản rồi em ui ...
 
Ðề: Kết nối SQL server với Access

Nó hơi mất thời gian thôi bác ơi, chứ em cũng đã xử lý được rồi. Tuy nhiên em không thích lặp đi lặp lại các thao tác giống hệt nhau. Sử dụng mấy phần mềm chuyển đổi dữ liệu nhưng chẳng thấy cái nào giữ được key như ban đầu, phải thiết lập toàn bộ lại bằng tay.
Nhưng bác cho em hỏi làm sao để 1 file ADP có thể vừa kết nối với 1 CSDL SQL , vừa kết nối với 1 CSDL bằng access. Tức là khi người dùng không muốn cài đặt SQLServer(dùng cho 1 máy đơn) ta cho kết nối với data access, còn khi dùng cho nhiều người dùng ta cho kết nối với SQLserver.
 
Ðề: Kết nối SQL server với Access

?????
Thì:
IF abc THEN
conStr = "nối vào access"
ELSE
conStr = "nối vào SQL"
END IF
 
Ðề: Kết nối SQL server với Access

ac, ac, khi chay ADP em có thấy nó hỏi hoặc chỗ nào điền string kết nối đâu bác.
Em chỉ thấy nó hỏi ngay từ ban đầu về thông tin server, user, pass. Khai báo đúng 1 lần rồi chạy, sau đó có muốn tìm xem nó ở đâu cũng chẳng thấy nữa lấy đâu ra mà chỉnh.
Trừ phi file dạng mdb thì em làm theo kiểu của bác được chứ file .adp thì em thử mãi mà chưa được
 
Ðề: Kết nối SQL server với Access

ac, ac, khi chay ADP em có thấy nó hỏi hoặc chỗ nào điền string kết nối đâu bác.
Em chỉ thấy nó hỏi ngay từ ban đầu về thông tin server, user, pass. Khai báo đúng 1 lần rồi chạy, sau đó có muốn tìm xem nó ở đâu cũng chẳng thấy nữa lấy đâu ra mà chỉnh.
Trừ phi file dạng mdb thì em làm theo kiểu của bác được chứ file .adp thì em thử mãi mà chưa được

Tạm thời cất cái .adp đó qua 1 bên đi.
Lấy cái cũ ra rồi thêm 1 form để người dùng chỉ định vị trí của data. Rồi theo đó mà kết cấu chuỗi conStr.

Đến đây thì thấy rõ là nó sẽ là form ******* rồi.
 
Ðề: Kết nối SQL server với Access

Ý 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ái đoạn code này hình như bị thiếu từ khóa set tại myrecordset=rs.
Em đã chạy như thế này nhưng bị lỗi:

Private Sub Form_Load()
MyRecordset("select * from table1")
set me.form.recordset=rs(hoặc bằng myrecordset)
End Sub
đều không chạy được. Các bác thử xem giúp em nó bị do nguyên nhân gì với.

----
Nếu không sửa được chuỗi kết nối cho ADP==> nó bắt buộc phải kết nối với SQLserver?. NHư vậy muốn thay đổi chuỗi kết nối như bác muontennguoi nói phải dùng .mdb hoặc .mde rồi.
 
Ðề: Kết nối SQL server với Access

Cái đoạn code này hình như bị thiếu từ khóa set tại myrecordset=rs.
Em đã chạy như thế này nhưng bị lỗi:

Private Sub Form_Load()
MyRecordset("select * from table1")
set me.form.recordset=rs(hoặc bằng myrecordset)
End Sub
đều không chạy được. Các bác thử xem giúp em nó bị do nguyên nhân gì với.

Nguyên nhân: trật cơ bản.

Private Sub Form_Load()
set me.form.recordset = MyRecordset("select * from table1")
End Sub
----
Nếu không sửa được chuỗi kết nối cho ADP==> nó bắt buộc phải kết nối với SQLserver?. NHư vậy muốn thay đổi chuỗi kết nối như bác muontennguoi nói phải dùng .mdb hoặc .mde rồi.

Thì mdb hay mde đã sao nào?
Bồ tưởng xài adp cho khác thường là xịn, là ngon hơn người ta ư?
.adp mặc định connect vào 1 SQL server data.
Tuy nhiên bồ vẫn có thể đóng nó lại và mở .mdb để lấy data.
CurrentProject. CloseConnection '<------ đóng connection và set nó thành null.
Sau đó tạo 1 connection mới và lấy data.
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Tất nhiên là em biết nó bị lỗi ( do tranh chấp SQL) nhưng để xử lý thì phải làm thế nào?
Recordset trong function đã được lấy đúng. Bây giờ làm thế nào để gán đối tượng recordset do function trả về vào 1 form nào đó.

Cám ơn bác em đã sửa được rồi (xem lại bài viết của bác, cấu hình lại 1 số trong Refe...). . Trước em cũng khai báo như báo chỉ giáo nhưng cũng không được (do thiếu thư viện). Bây giờ thì ổn rồi.
-----------------------------------------------------------------------------------------
Em có 1 cơ sở dữ liệu đang muốn chuyển từ access sang SQL, tuy nhiên đang chưa có phương án xử lý:
Tổng số bản ghi lớn (>10.000 record). Dữ liệu có dạng (MLD, QTCT,HSL). Trong đó các trường dữ liệu này có thể trùng nhau(Một người có nhiều quá trình công tác, một quá trình công tác có thể đúng với nhiều người, tương tự trường Hệ số lương cũng vậy). Trong access ta không cần đặt Key/Index. Tuy nhiên khi chuyển sang SQL thì phải đặt thêm 1 trường ID (định dạng Int) để làm key nhưng Int giới hạn chỉ là 4 do đó không đủ thể hiện cho số lương bản ghi.
CÁc bác đã từng xử lý các vụ tương tự cho em ý kiến nhé
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

10.000 record chỉ là hạt tiêu.
Thông thường key nên đặt kiểu chuỗi. Lý do: nó là chỉ số, không dùng để tính toán nên không đặt là kiểu số.
Tuy nhiên nếu đặt kiểu số cũng không thành vấn đề.

Để làm key ta có thể dùng tổ hợp nhiều field.
ví dụ: MaLD + IDnum
Trong đó: MaLD là mã số chỉ danh 1 người, IDnum là số thứ tự mà thông tin về người đó có thay đổi (đổi lần 1, đổi lần 2 ...)
Tình huống này thấy rằng IDnum là kiểu chuỗi thì tiện hơn.
 
Ðề: Kết nối SQL server với Access

Như vậy ta phải đánh chỉ số bằng tay với quy ước là MLD+một giá trị tăng dần do ta mặc định? Có cách nào để chỉ số tự động tăng không bác? Em chỉ muốn thêm 1 trường ID vào dữ liệu khi chuyển đổi access==> SQL chứ không muốn động đến giao diện của chương trình vì nếu phải đánh bằng tay thì chắc chắn trên giao diện phải thêm trường ID rồi , mà cái này lại ảnh hưởng đến độ dài của các cột trong bảng.
 
Ðề: Kết nối SQL server với Access

Thêm 1 cột ID kiểu số cũng được.
Nhưng mà tại sao lại chỉ cho độ rộng là 4?
Mở độ rộng lên hết cỡ của nó đi. Kiểu Long hay gì gì đó.
Khi tạo CSDL phải tính trước mã hoá cho đủ dùng trong 10-15 năm chứ.
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Nếu SQL làm thế cũng được. EM đang muốn chuẩn hóa cơ sở dữ liệu giữa access và SQL. Nếu được thằng này thì lại không được cho thằng kia. Chắc mỗi lần chuyển đổi giữa SQL và access đều phải can thiệp bằng tay rồi.
 
Ðề: Kết nối SQL server với Access

Chưa hiểu ý bạn lắm.
Nếu trên table của Access đã có cột ID thì khi chuyển vào SQL nó cũng có mang theo luôn chứ?
Chẳng lẽ khi import vào SQL nó lại chừa ra field đó?
 
Ðề: Kết nối SQL server với Access

Ví dụ:
Access không có kiểu "số" mà tự động tăng dần trong khi SQL lại có (cái này thường áp dụng cho ID để làm key) nên bác thử xem có cách nào để tạo 1 CSDL trên access rồi sau đó import nó vào SQL mà để trường dữ liệu đó trong SQL có dạng numberic nhưng tự động tăng 1 không?
Em đang vị vướng 1 chỗ bác xem giúp nhé.
Em có 1 table có dạng: MLD, Tunam, Dennam, QTCT,ID (mã lao đông, từ năm, đến năm,quá trình công tác, ID).Tunam,dennam kiểu mm/yyyy
Dennam có thể nhận giá trị Null (vì đang làm nên mốc cuối cùng của đến năm có thể trống".
Trên mainform có 2 ô(txttungay, txtdenngay) để làm điều kiện lọc cho dữ liệu
1/ Tính thâm niên công tác của mọi người. Nếu Dennam mà không có dữ liệu hoặc lơn hơn txtdenngay thì gán Dennam bằng txtdenngay; nếu tungay nhỏ hơn txttungay thì gán bằng txttungay.
Trước trong access thì dùng hàm IIF rất đơn giản để gán , nhưng chuyển sang SQL thì hàm đó không có tác dụng. .
2/ Recordset của em có dạng rs=myrs(SQL) (vẫn phát triển theo mô hình trước). Bây giờ xuất ra excell thì làm thế nào (em không muốn tạo ra 1 query mà xuất thẳng từ rs ra excell luôn)
 
Sửa lần cuối:
Ðề: Kết nối SQL server với Access

Ví dụ:
Access không có kiểu "số" mà tự động tăng dần trong khi SQL lại có (cái này thường áp dụng cho ID để làm key) nên bác thử xem có cách nào để tạo 1 CSDL trên access rồi sau đó import nó vào SQL mà để trường dữ liệu đó trong SQL có dạng numberic nhưng tự động tăng 1 không?
Em đang vị vướng 1 chỗ bác xem giúp nhé.
Em có 1 table có dạng: MLD, Tunam, Dennam, QTCT,ID (mã lao đông, từ năm, đến năm,quá trình công tác, ID).Tunam,dennam kiểu mm/yyyy
Dennam có thể nhận giá trị Null (vì đang làm nên mốc cuối cùng của đến năm có thể trống".
Trên mainform có 2 ô(txttungay, txtdenngay) để làm điều kiện lọc cho dữ liệu
1/ Tính thâm niên công tác của mọi người. Nếu Dennam mà không có dữ liệu hoặc lơn hơn txtdenngay thì gán Dennam bằng txtdenngay; nếu tungay nhỏ hơn txttungay thì gán bằng txttungay.
Trước trong access thì dùng hàm IIF rất đơn giản để gán , nhưng chuyển sang SQL thì hàm đó không có tác dụng. .
2/ Recordset của em có dạng rs=myrs(SQL) (vẫn phát triển theo mô hình trước). Bây giờ xuất ra excell thì làm thế nào (em không muốn tạo ra 1 query mà xuất thẳng từ rs ra excell luôn)

Access không có kiểu "số" mà tự động tăng dần trong khi SQL lại có (cái này thường áp dụng cho ID để làm key) nên bác thử xem có cách nào để tạo 1 CSDL trên access rồi sau đó import nó vào SQL mà để trường dữ liệu đó trong SQL có dạng numberic nhưng tự động tăng 1 không?
Em đang vị vướng 1 chỗ bác xem giúp nhé.

Ai nói Access không có kiểu số tự động tăng dần? kiểu AutoNumber là kiểu gì vậy ta?
Khi import vào SQL Server, nó không import các key hoặc các constraint nếu có ở Access đi qua đâu, vào là phải định lại. Khi import field AutoNumber qua SQL Server, SQL Server vẫn hiểu là field số kiểu int. Phải định lại Identity là Yes mới được.

... 1/ Tính thâm niên công tác của mọi người. Nếu Dennam mà không có dữ liệu hoặc lơn hơn txtdenngay thì gán Dennam bằng txtdenngay; nếu tungay nhỏ hơn txttungay thì gán bằng txttungay.
Trước trong access thì dùng hàm IIF rất đơn giản để gán , nhưng chuyển sang SQL thì hàm đó không có tác dụng. .
..

Trong cú pháp T-SQL thì không có hàm IIF nhưng có hàm CASE:

(CASE WHEN điều kiện WHEN giá trị 1 ELSE giá trị 2 END) AS fieldname

2/ Recordset của em có dạng rs=myrs(SQL) (vẫn phát triển theo mô hình trước). Bây giờ xuất ra excell thì làm thế nào (em không muốn tạo ra 1 query mà xuất thẳng từ rs ra excell luôn)

Bạn gọi điện hỏi Microsoft coi nó có làm cái phương thức này chưa? :giggle:, chứ tôi "bó ..." rồi. Nhân tiện Excel có 1 chữ "lờ", chứ không phải là 2 nhé.
 

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