Kiểm tra kết nối ổ đĩa mạng bằng VBA

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
568
Em đang dùng ADO để lấy dữ liệu 1 từ file .csv trên ổ đĩa mạng (Ví dụ: \\192.168.1.110\TaiLieu\abc.csv) và đẩy vào SQL server database (VD: IP của server Database 192.168.2.220)
Có rất nhiều lý do mà kết nối đến ổ đĩa mạng và SQL server này bị mất. Những lúc như vậy Excel cứ đơ khoảng 30s rồi mới báo lỗi. Nhờ các bác cho xin đoạn code VBA để kiểm tra 2 kết nối nói trên trước khi đoạn code chính thực hiện việc lấy và đẩy dữ liệu.
Em xin cảm ơn !
 
PHP:
Sub RunTestConn()
    Dim ipLAN As String
    ipLAN = "192.168.1.110"
    MsgBox bolCheckConnectingByPing(ipLAN)
End Sub
''
Function bolCheckConnectingByPing(ByVal strHostAddress As String) As Boolean
    bolCheckConnectingByPing = False
    Dim queryPing As Object, objItem As Object
    Set queryPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("Select * from Win32_PingStatus Where Address = '" & strHostAddress & "'")
    For Each objItem In queryPing
        If objItem.StatusCode = 0 Then      'connected!'
            bolCheckConnectingByPing = True
            Exit Function
        End If
    Next objItem
    Set queryPing = Nothing
End Function
 
Upvote 0
SQL Server DBase mà cho phép làm việc (kết nối với Excel) vậy cũng lạ.

Công việc này đáng lẽ phải là một task có đồng ý với admin của SQL Server, gọi một stored procedure để thực hiện.
 
Upvote 0
Em đang dùng ADO để lấy dữ liệu 1 từ file .csv trên ổ đĩa mạng (Ví dụ: \\192.168.1.110\TaiLieu\abc.csv) và đẩy vào SQL server database (VD: IP của server Database 192.168.2.220)
Có rất nhiều lý do mà kết nối đến ổ đĩa mạng và SQL server này bị mất. Những lúc như vậy Excel cứ đơ khoảng 30s rồi mới báo lỗi.

Đối với việc kiểm tra kết nối các ứng dụng tôi cũng làm theo trình tự giống như befaint. Tức là trước hết phải kiểm tra xem máy chủ có mở hay không, có kết nối được hay không (do internet, cáp v.v..). Sau đó mới kiểm tra xem file cơ sở dữ liệu có tồn tại, có bị đổi tên, đổi đường dẫn hay không rồi mới kết nối. Nếu không thông qua bước kiểm tra IP mà dùng Dir() hay FSO để kiểm tra file cơ sở dữ liệu thì kết quả trả về sẽ rất lâu.
Ứng dụng có thể kết nối với máy chủ CSDL qua mạng LAN hoặc qua Internet nên cần xử lý thêm công đoạn tách IP từ chuỗi kết nối (qua mạng LAN sẽ có dấu "\\") rồi chạy lệnh Ping của befaint.
 
Upvote 0
PHP:
Sub RunTestConn()
    Dim ipLAN As String
    ipLAN = "192.168.1.110"
    MsgBox bolCheckConnectingByPing(ipLAN)
End Sub
''
Function bolCheckConnectingByPing(ByVal strHostAddress As String) As Boolean
    bolCheckConnectingByPing = False
    Dim queryPing As Object, objItem As Object
    Set queryPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("Select * from Win32_PingStatus Where Address = '" & strHostAddress & "'")
    For Each objItem In queryPing
        If objItem.StatusCode = 0 Then      'connected!'
            bolCheckConnectingByPing = True
            Exit Function
        End If
    Next objItem
    Set queryPing = Nothing
End Function
Cảm ơn bác nhiều nhé, để em thử chạy rồi báo lại
 
Upvote 0
SQL Server DBase mà cho phép làm việc (kết nối với Excel) vậy cũng lạ.

Công việc này đáng lẽ phải là một task có đồng ý với admin của SQL Server, gọi một stored procedure để thực hiện.
Em là người tạo ra các SQL database đó từ các file csv đơn giản nói trên và và dữ liệu chỉ phục vụ việc học tập. Em tự cài SQL Server trên Windows Server chạy trên con Desktop quèn để dùng nên cũng không có gì là lạ bác ạ.
Lỗi kết nối như em mô tả phần lớn là do kết nối vật lý (máy chạy SQL Server quên chưa bật, wifi cho các máy dùng bị đổi...) vì vậy mới xin đoạn code kiểm tra nói trên.
Bác cho em xin 1 đoạn code VBA gọi Stored Procedure để thực hiện nhé. Giả sử em có sẵn 1 SP, từ Excel gọi SP đó thực thi và trải các record lên Excel thì viết như thế nào ạ ?
Em xin cảm ơn !
 
Upvote 0
...Bác cho em xin 1 đoạn code VBA gọi Stored Procedure để thực hiện nhé. Giả sử em có sẵn 1 SP, từ Excel gọi SP đó thực thi và trải các record lên Excel thì viết như thế nào ạ ?
Em xin cảm ơn !
Làm việc đúng là phải chính cái SQL Server nó làm.
Thường thì người ta tạo một cái trusted connection với SS Management Studio trong máy Desktop. Khi vào SSMS thì biết cái instance của SSL Server có chạy hay không. Nếu chưa chạy thì kích động nó. Nếu đang chạy thì gọi SP.
Gần như không bao giờ người quản lý CSDL cho phép kết nối qua phần mềm lỏng lẻo cỡ Excel. Tói thiểu cũng phải những phần mềm được built qua các nên tảng có bảo mật như Visual Studio.

Nêu công việc của bạn cần sự uyển chuyển thì đừng dùng SQL Server. Bạn chỉ tốn thời gian authenticate mấy cái kết nối thôi chứ chẳng lợi bao nhiêu. Dùng phiên bản Express, SQL Lite hoặc MySQL tốt hơn. Những phần mềm nhẹ này chúng không cần bảo mật chặt chẽ cho nên set up nhanh và kết nối nhanh.
 
Upvote 0
Làm việc đúng là phải chính cái SQL Server nó làm.
Thường thì người ta tạo một cái trusted connection với SS Management Studio trong máy Desktop. Khi vào SSMS thì biết cái instance của SSL Server có chạy hay không. Nếu chưa chạy thì kích động nó. Nếu đang chạy thì gọi SP.
Gần như không bao giờ người quản lý CSDL cho phép kết nối qua phần mềm lỏng lẻo cỡ Excel. Tói thiểu cũng phải những phần mềm được built qua các nên tảng có bảo mật như Visual Studio.

Nêu công việc của bạn cần sự uyển chuyển thì đừng dùng SQL Server. Bạn chỉ tốn thời gian authenticate mấy cái kết nối thôi chứ chẳng lợi bao nhiêu. Dùng phiên bản Express, SQL Lite hoặc MySQL tốt hơn. Những phần mềm nhẹ này chúng không cần bảo mật chặt chẽ cho nên set up nhanh và kết nối nhanh.
Xin bác cho biết bản SQL Express setup nhanh hơn, kết nối nhanh hơn bản Standard ở phần nào ạ ?
Bài đã được tự động gộp:

PHP:
Sub RunTestConn()
    Dim ipLAN As String
    ipLAN = "192.168.1.110"
    MsgBox bolCheckConnectingByPing(ipLAN)
End Sub
''
Function bolCheckConnectingByPing(ByVal strHostAddress As String) As Boolean
    bolCheckConnectingByPing = False
    Dim queryPing As Object, objItem As Object
    Set queryPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("Select * from Win32_PingStatus Where Address = '" & strHostAddress & "'")
    For Each objItem In queryPing
        If objItem.StatusCode = 0 Then      'connected!'
            bolCheckConnectingByPing = True
            Exit Function
        End If
    Next objItem
    Set queryPing = Nothing
End Function
Code này kiểm tra tình trạng online của server đúng là nhanh thật. Tuy nhiên nó mới chỉ kiểm tra trạng thái online của server. Nếu bác có thể code thêm 1 vài tình huống để xác định 1 file không thể lấy dữ liệu (file không tồn tại theo đường dẫn, file không được phân quyền truy cập....) thì tốt quá. Em hỏi chỉ tham khảo thôi chứ cũng không đòi hỏi file của mình bẫy được hết các tình huống.
Trân trọng cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
Cái winmgmts còn nhiều cái hay lắm bạn có thời gian mò nó xem
 
Upvote 0
hihi lâu rồi mình đâu có thời gian viết code với mò code đâu nên quên hết rồi. Bây giờ vòng lập For Next mình còn không nhớ nữa +-+-+-+, giờ này đầu óc mình chỉ biết có Covid-nineteen. Chắc bạn phải đợi người khác nhé.
 
Upvote 0
Web KT
Back
Top Bottom