2010-07-09 30 views
11

Tôi có một Mẫu Excel có mã MDB Ms Access được mã hóa cứng trong mã VBA được sử dụng để kết nối với các bảng Access và lưu, truy xuất dữ liệu.Cách lưu trữ an toàn chi tiết Chuỗi kết nối trong VBA

Tôi đã di chuyển cơ sở dữ liệu MS Access sang máy chủ SQL có xác thực tích hợp cho người dùng mẫu Excel.

Câu hỏi của tôi là, cách đề xuất/thực tiễn tốt nhất để lưu chuỗi kết nối DB SQL Server và truy xuất nó trong Excel 2007 VBA để lưu và truy xuất dữ liệu là gì?

Trong quá khứ, tôi đã làm như sau.

  1. Sử dụng cài đặt Khóa đăng ký có chuỗi kết nối. Sau đó, trong VBA, viết một hàm đọc khoá đăng ký và trả về chuỗi kết nối.

  2. Đặt trang tính ẩn "Cài đặt" trong Mẫu Excel, với ô được đặt tên cho chuỗi kết nối. Đọc chuỗi kết nối trong VBA bằng cách truy cập phạm vi được đặt tên đó.

  3. Sử dụng tệp .INI txt đi kèm với mẫu Excel. (Điều này không lý tưởng và tôi muốn tránh điều này vì nó xây dựng sự phụ thuộc vào tệp bên ngoài đó)

Tôi không thích # 1 vì tôi muốn tránh viết/đọc từ Registry nếu có thể. # 2 cảm thấy ok, nghĩ rằng tôi không chắc chắn nếu có một cách "sạch hơn" tốt hơn để làm điều này.

Mọi suy nghĩ?

+0

Xem câu trả lời của tôi cho chủ đề http://stackoverflow.com/questions/1987333/excel-vba-secure-way-to-get-users-database-login-password-for-connection-string/2018970 # 2018970 – MikeD

+0

@Remou. cảm ơn. @MikeD. Cảm ơn, tôi đã kiểm tra điều đó. Là sử dụng registry mặc dù, và tôi đang cố gắng để tránh điều đó. Bởi vì khắc phục sự cố một vấn đề prod sẽ trở thành một cơn ác mộng khi sử dụng cài đặt đăng ký (vì nó sẽ là thiết lập máy người dùng cụ thể) .... – Shiva

+0

Tôi đã tìm thấy sổ đăng ký là một nơi tuyệt vời cho nó, nhưng điều đó đòi hỏi phải thiết lập bổ sung cho mỗi người dùng. Tôi có thể hiểu tại sao bạn lại muốn tránh điều đó. – RubberDuck

Trả lời

21

Đây là những gì tôi sẽ làm một cách an toàn lưu trữ kết nối chuỗi thông tin

Tải về và cài đặt Visual Studio Express 2012 for Windows (FREE)

mở nó as Administrator và tạo ra một dự án mới.Chọn Visual C# sau đó Class Library và đổi tên nó để HiddenConnectionString

enter image description here

Trong Solution Explorer, đổi tên Class1.cs để MyServer.cs

enter image description here

Nhấp chuột phải dự án MyConnection của bạn trong Solution Explorer và chọn Add Reference

Loại activeX trong hộp tìm kiếm và đánh dấu vào Microsoft ActiveX Data Objects 6.1 Library

enter image description here

Sao chép và dán bên dưới mã vào số MyServer.cs thay thế hoàn toàn mọi thứ trong tệp.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using System.IO; 
using ADODB; 

namespace HiddenConnectionString 
{ 
    [InterfaceType(ComInterfaceType.InterfaceIsDual), 
    Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")] 
    public interface IMyServer 
    { 
     Connection GetConnection(); 
     void Shutdown(); 
    } 

    [ClassInterface(ClassInterfaceType.None)] 
    [Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")] 
    public class MyServer : IMyServer 
    { 
     private Connection cn; 

     private string cnStr = "Provider=SQLOLEDB; Data Source=SERVER\\INSTANCE; Initial Catalog=default_catalog; User ID=your_username; Password=your_password"; 

     public MyServer() 
     { 
     } 

     public Connection GetConnection() 
     { 
      cn = new Connection(); 
      cn.ConnectionString = cnStr; 
      cn.Open(); 
      return cn; 
     } 

     public void Shutdown() 
     { 
      cn.Close(); 
     } 
    } 
} 

Xác định vị trí cnStr biến trong các mã và cập nhật chi tiết chuỗi kết nối của bạn.

Nhấp chuột phải vào giải pháp *HiddenConnectionString * trong Solution Explorer và chọn Thuộc tính.

Nhấp vào Application tab ở phía bên trái, sau đó Assembly Info và đánh dấu Make Assembly COM-Visible

enter image description here

Nhấp vào *Build* từ menu bên trái và đánh dấu Register For COM Interop

enter image description here

Lưu ý: Nếu bạn đang phát triển cho Văn phòng 64 bit thì hãy đảm bảo bạn thay đổi Platform Target trên menu Xây dựng tới x64! Điều này là bắt buộc đối với các thư viện Office COM 64 bit để tránh bất kỳ lỗi liên quan đến ActiveX nào.


Nhấp chuột phải vào HiddenConnectionString trong Solution Explorer và chọnBuild từ menu.

Nếu mọi thứ đều ổn, thì HiddenConnectionString.dllHiddenConnectionString.tlb của bạn sẽ được tạo thành công.Đi tới con đường này ngay bây giờ

C:\Users\administrator\Documents\Visual Studio 2012\Projects\HiddenConnectionString\HiddenConnectionString\bin\Debug 

và bạn sẽ thấy tệp của mình.

enter image description here


Bây giờ mở Excel và đi đến VBE. Nhấp vào Tools và chọn References.

Nhấp vào nút Duyệt và điều hướng đến HiddenConnectionString.tlb.

Ngoài ra, hãy thêm tham chiếu đến Microsoft ActiveX Object 6.1 Library - điều này là để bạn có thể sử dụng thư viện ADODB.

enter image description here

nhấp chuột Bây giờ ngay bất cứ nơi nào trong cửa sổ Project Explorer và Chèn mới Module

sao chép và dán đoạn mã dưới đây để nó

Option Explicit 

Sub Main() 

    Dim myCn As MyServer 
    Set myCn = New MyServer 

    Dim rs As ADODB.Recordset 
    Set rs = New ADODB.Recordset 

    rs.Open "Select * from [TABLE_NAME]", myCn.GetConnection 

    Range("A1").CopyFromRecordset rs 

    rs.Close 
    myCn.Shutdown 

    Set rs = Nothing 
    Set myCn = Nothing 

    Columns.AutoFit 

End Sub 

Thay thế [TABLE_NAME] với tên bảng thực tế trong y cơ sở dữ liệu của chúng tôi.

Lượt F5 hoặc nhấn nút màu xanh lá cây phát trên ribbon.

enter image description here

Nếu mọi thứ OK, bây giờ bạn sẽ thấy Bảng được trả lại trên bảng tính của bạn.

mẫu của tôi:

enter image description here


Như bạn có thể nhìn thấy. Thêm tài liệu tham khảo vào thư viện COM của riêng bạn và lưu trữ thông tin đăng nhập và các dữ liệu nhạy cảm khác bên trong biên dịch .dll bảo vệ dữ liệu của bạn (chuỗi kết nối). Rất khó để dịch ngược tệp *.dll để nhận bất kỳ thông tin hợp lý nào từ nó. Có nhiều kỹ thuật mã hóa khác nhau để bảo vệ *.dll của bạn nhiều hơn nhưng tôi sẽ không đi sâu vào chi tiết ngay bây giờ. Điều này tự nó đạt được những gì bạn yêu cầu.

myCn.GetConnection trả về đối tượng ADODB.Connection đã được khởi tạo bên trong thư viện COM được tham chiếu. Không có người dùng Excel sẽ được trình bày với chuỗi kết nối hoặc dữ liệu nhạy cảm (thực sự không ai khác).

Bạn có thể sửa đổi mã C# để chấp nhận các tham số từ VBA tức là đăng nhập, mật khẩu, danh mục ban đầu, truy vấn để thực thi v.v ... nếu bạn có người dùng với các đặc quyền khác nhau trên phiên bản SQL Server của bạn ý tưởng tồi để cho phép mọi người đăng nhập.


Lưu ý: không có lỗi xử lý được thêm vào mã C# và VBA.Tôi khuyên bạn nên làm việc trên nó nếu bạn đang có kế hoạch sử dụng kỹ thuật tôi đã mô tả ở trên.


+1

"Tôi cũng đã đăng câu trả lời này trên blog của mình" - Đã được đánh dấu trang! Cảm ơn những đóng góp tuyệt vời của bạn trong các loại chủ đề này. – tbur

+1

@mehow Cảm ơn câu trả lời chi tiết. Như bạn có thể thấy, điều này đã hơn 3 năm trước và tôi không còn làm việc với dự án hoặc khách hàng đó nữa, nhưng tôi vẫn chấp nhận câu trả lời của bạn. Có vẻ như nó sẽ hoạt động. – Shiva

+2

@Shiva cảm ơn. Tôi quyết định đưa ra câu trả lời này bởi vì tôi không thể tìm thấy câu trả lời cho bản thân vào một thời điểm nào đó. Hy vọng rằng nó sẽ phục vụ người khác tốt :) –

2

Làm thế nào để lưu trữ nó dưới CustomDocumentProperties?

Lưu ý: Tôi không chắc chắn, nếu sổ làm việc (dựa trên mẫu đã cho) sẽ kế thừa thuộc tính được xác định bằng cách sử dụng CustomDocumentProperties trong mẫu.

Các vấn đề liên quan