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

Thảo luận trong 'Access và VBA' bắt đầu bởi phatnq2002, 29/2/08.

  1. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

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

    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.
     
  2. behattieu

    behattieu Member Hội viên mớ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
    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
     
    Chỉnh sửa cuối: 18/8/08
  3. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

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

    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.



    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:
     
  4. behattieu

    behattieu Member Hội viên mới

    Ðề: 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:
     
  5. behattieu

    behattieu Member Hội viên mới

    Ðề: 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
     
  6. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: 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 ...
     
  7. behattieu

    behattieu Member Hội viên mới

    Ðề: 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.
     
  8. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: 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
     
  9. behattieu

    behattieu Member Hội viên mới

    Ðề: 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
     
  10. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

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

    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.
     
  11. behattieu

    behattieu Member Hội viên mớ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.

    ----
    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.
     
  12. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

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

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

    Private Sub Form_Load()
    set me.form.recordset = MyRecordset("select * from table1")
    End Sub
    ----
    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.
     
    Chỉnh sửa cuối: 23/8/08
  13. behattieu

    behattieu Member Hội viên mớ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é
     
    Chỉnh sửa cuối: 24/8/08
  14. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: 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.
     
  15. behattieu

    behattieu Member Hội viên mới

    Ðề: 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.
     
  16. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: 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ứ.
     
    Chỉnh sửa cuối: 24/8/08
  17. behattieu

    behattieu Member Hội viên mớ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.
     
  18. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: 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 đó?
     
  19. behattieu

    behattieu Member Hội viên mớ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)
     
    Chỉnh sửa cuối: 28/8/08
  20. phatnq2002

    phatnq2002 Tích cực giảm cân... Hội viên mới

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

    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.

    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

    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é.
     

Chia sẻ trang này

XenForo Add-ons by Brivium ™ © 2012-2013 Brivium LLC.