2009-03-29 33 views
12

Ứng dụng Windows Forms của tôi sử dụng tập dữ liệu được nhập mạnh được tạo bằng cách sử dụng trình thiết kế trong Visual Studio. Khi chạy, tôi muốn có thể chọn cơ sở dữ liệu trực tiếp hoặc kiểm tra.Cách tốt nhất để đặt chuỗi kết nối tập dữ liệu mạnh mẽ khi chạy là gì?

Cách tốt nhất để lập trình chuỗi kết nối cho tập dữ liệu ở thời gian chạy là gì?

+0

Do VS2010 khả năng hiển thị của Kết nối có thể là pecified (ví dụ: công cộng) và một lớp cơ sở cho DataTableAdapters tạo ra có thể chỉ định ... (có nghĩa là, bài đăng này chủ yếu liên quan đến VS2008 và các vấn đề trước :-) –

Trả lời

1

Lưu chuỗi kết nối cho cả hai trong app.config và sau đó bạn có thể chuyển đổi dựa trên công tắc dòng lệnh/khởi động. Hoặc nếu bạn muốn cung cấp cho người dùng sự linh hoạt, bạn có thể cung cấp cho họ trang tùy chọn nơi họ có thể chọn kết nối để sử dụng.

Dưới đây là đoạn code để đọc một khởi động switch:

string[] args = Environment.GetCommandLineArgs(); 
// The first (0 index) commandline argument is the exe path. 
if (args.Length > 1) 
{ 
    if (Array.IndexOf(args, "/live") != -1) 
    { 
     // connection string = 
     // ConfigurationSettings.AppSettings["LiveConString"]; 
    } 
} 
else 
{ 
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"]; 
} 

Vì vậy, bây giờ bạn bắt đầu ứng dụng của bạn bằng cách gọi:

MyApp.exe /live 

Sử dụng MyApp.exe một mình hoặc với bất kỳ chuyển đổi khác sẽ giúp bạn có được cấu hình thử nghiệm.

+0

Cảm ơn bạn đã trả lời, nhưng câu hỏi của tôi là làm thế nào bạn có thể thiết lập chuỗi kết nối một tập dữ liệu mạnh mẽ được nhập khi chạy. – wethercotes

1

Re: wethercotes bình luận

Các cửa hàng phù thủy chuỗi kết nối khi bạn thiết lập các tập dữ liệu, nhưng điều đó không có nghĩa là bạn không thể làm cho nó năng động. Phụ thuộc vào phiên bản bạn đang sử dụng, nhưng nói chung nếu bạn mở rộng các tệp trong tập dữ liệu của mình, bạn sẽ tìm thấy tệp như Designer.cs hoặc DataTableNameAdapter.xsd. Bạn có thể mở các tệp đó và tìm kiếm _connection. Đây thường là biến riêng và được đặt trong hàm init trong lớp.

Bạn có thể làm cho các thiết lập năng động bằng cách thêm mã như sau:

public string ConnectionString 
{ 
    get { return this._connection.ConnectionString; } 
    set 
    { 
     if (this._connection == null) 
     { 
      this._connection = new System.Data.SqlClient.SqlConnection(); 
     } 
     this._connection.ConnectionString = value; 
    } 
} 

Lưu ý rằng nếu bạn tạo tập dữ liệu bạn có thể sẽ mất phần này của mã này, và không có sắp xếp các bộ dữ liệu bạn có thể phải thêm nó đến một số đối tượng.

+0

Cảm ơn Gary lần nữa. Tôi đã tạo một lớp một phần với mã của bạn trong đó nó dừng nó bị mất khi tập dữ liệu được tái tạo. Thật không may này phải được thực hiện cho mỗi bộ điều hợp dữ liệu, mà tôi có hàng chục. – wethercotes

0

Giải pháp tốt nhất tôi đã tìm thấy cho đến nay:

Thêm một thiết lập chương trình nắm giữ chuỗi kết nối nghỉ của bạn như được thiết lập bởi các khách hàng trong thời gian chạy (ví dụ newConnectionString.)

sau đó trước bằng cách sử dụng Bảng Adaptor:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString; 
+0

Không, bạn không thể làm theo cách này. Thuộc tính kết nối trong TableAdapters được định nghĩa là nội bộ. –

+0

Không có vấn đề gì đối với dự án của tôi ... – yimbot

3

sở hữu kết nối trong TableAdapters được định nghĩa là nội.

internal global::System.Data.SqlClient.SqlConnection Connection 

Vì vậy, trong trường hợp TypedDataset của bạn không có trong lắp ráp giống như cửa sổ chính của bạn hình thức ứng dụng, bạn sẽ không thể sở hữu kết nối truy cập. Vấn đề này có thể bật lên sau khi bạn refactor mã bộ dữ liệu của bạn và di chuyển nó vào một dự án riêng biệt mà sẽ sản xuất lắp ráp độc lập của riêng mình.

Để giải quyết vấn đề này, bạn có thể thực hiện như được đề cập bên dưới.

tạo một phần lớp cho TableAdapter của bạn và thêm một hàm tạo khác bên cạnh hàm tạo tham số công khai mặc định. Giả sử loại TableAdapter là MyTableAdapter

public partial class MyTableAdapter 
{ 
    public MyTableAdapter(SqlConnection connection) 
    { 
     thisSetConnection(connection); 
     this.ClearBeforeFill = true; 
    } 

    public void SetConnection(SqlConnection connection) 
    { 
     this._connection = connection; 
    } 
} 

Bạn sẽ cần thực hiện việc này cho nhiều như TableAdapters bạn có trong dự án của mình. TableAdapter không có bất kỳ lớp cơ sở chung nào nhưng cảm ơn rằng chúng được khai báo là các lớp một phần vì vậy chúng ta có thể thực hiện nó theo cách đã đề cập ở trên.

Bây giờ khi chạy, bạn có thể tạo một thể hiện của TableAdapter của bạn như thế này ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(connection); 

hoặc thậm chí có thể được gán nó sau này sau khi bạn tạo ra các ví dụ với parameterless mặc định constructor nào TableAdapter ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(); 
adapter.(connection); 
0

Thật là một nỗi đau khi chỉnh sửa tệp thiết kế.

Tôi tạo ra một mục Settings nằm bên dưới "User 'gọi 'ConnectionString', mà làm cho Visual Studio tạo một chuỗi ứng dụng 'Kết nối Chuỗi1' khi bạn thêm mạnh mẽ gõ dữ liệu thiết lập.

Vì vậy, tôi chỉ cần thay thế tất cả' ConnectionString1 'với' ConnectionString 'trong tập tin thiết kế tập dữ liệu, và điều đó sẽ cho phép bạn sử dụng cài đặt chuỗi' Người dùng 'để tải chuỗi kết nối của bạn vào thời gian chạy. (Có ai đang nghe ở Redmond không?)

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