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

MinhKhai

Giải pháp Ếc-xào
Tham gia ngày
16 Tháng tư 2008
Bài viết
877
Được thích
543
Điểm
868
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 !
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
11,457
Được thích
13,720
Điểm
5,168
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
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
11,576
Được thích
14,551
Điểm
4,868
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.
 

ongke0711

Thành viên tích cực
Tham gia ngày
7 Tháng chín 2006
Bài viết
870
Được thích
1,010
Điểm
1,068
Nơi ở
HCM
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.
 

MinhKhai

Giải pháp Ếc-xào
Tham gia ngày
16 Tháng tư 2008
Bài viết
877
Được thích
543
Điểm
868
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
 

MinhKhai

Giải pháp Ếc-xào
Tham gia ngày
16 Tháng tư 2008
Bài viết
877
Được thích
543
Điểm
868
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 !
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
11,576
Được thích
14,551
Điểm
4,868
...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.
 

MinhKhai

Giải pháp Ếc-xào
Tham gia ngày
16 Tháng tư 2008
Bài viết
877
Được thích
543
Điểm
868
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:

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,673
Được thích
811
Điểm
968
Cái winmgmts còn nhiều cái hay lắm bạn có thời gian mò nó xem
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,673
Được thích
811
Điểm
968
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é.
 
Top Bottom