2009-04-07 30 views
6

Đây là trong C#, Visual Studio 2008, báo cáo tinh thể đi kèm với VS2008Báo cáo tinh thể - đóng kết nối cơ sở dữ liệu

Tôi có biểu mẫu trình xem báo cáo tinh thể nằm trong tệp DLL. DLL chịu trách nhiệm tải báo cáo tinh thể (dựa trên tên tệp báo cáo) và hiển thị báo cáo trên biểu mẫu.

Khi tôi hoàn tất báo cáo tinh thể, tôi sẽ hủy bỏ đối tượng trên đối tượng báo cáo tài liệu đã tải. Tuy nhiên, kết nối cơ sở dữ liệu vẫn còn.

Tinh thể dường như phát hiện thấy có các kết nối khác (từ ứng dụng chính của tôi) đến cùng một cơ sở dữ liệu và giữ kết nối của nó mở. Kết nối tinh thể được đóng khi kết nối cơ sở dữ liệu ứng dụng chính bị đóng.

Có cách nào để buộc tinh thể đóng kết nối của nó, với việc đóng kết nối cơ sở dữ liệu ứng dụng chính không?

Trả lời

0

Tôi không quá quen thuộc với Crystal Reports, nhưng có nhiều đối tượng có phương thức Dispose() vô dụng do một chuỗi kế thừa bao gồm giao diện IDisposable. Nếu bạn không thấy bất kỳ vấn đề hiệu năng nào trên máy chủ, thì đừng lo lắng về nó. GC sẽ chăm sóc các kết nối trên máy khách khi nó sẵn sàng. Bạn không nên cố gắng thông minh hơn GC, bạn sẽ chỉ cho mình nhiều đau đầu hơn.

Và luôn gọi Dispose() (hoặc sử dụng {}) khi có.

+0

Điều này thực sự là về kết nối cơ sở dữ liệu. Ứng dụng chính có chức năng khôi phục và sao lưu cơ sở dữ liệu. Kết nối db tinh thể ngăn chặn điều này. Tôi đã có một scurry xung quanh trên google, và xử lý các báo cáo đóng kết nối, nhưng chỉ khi tinh thể là điều duy nhất kết nối. – user87945

+0

Tôi giả định rằng bạn đang sử dụng MSSQL, đúng không? Tại sao không sử dụng được xây dựng trong sao lưu/khôi phục từ đó? – Ariel

+0

vì sản phẩm được thiết kế để người sử dụng phi kỹ thuật sử dụng. Có hai mục trình đơn nói rằng sao lưu/phục hồi là rất dễ hiểu hơn sau đó đi vào phòng quản lý sql, đăng nhập như một người dùng có những người tư nhân vv – user87945

1

Làm cách nào để kết nối với cơ sở dữ liệu, bằng cách tạo kết nối của riêng bạn khi chạy qua cài đặt xác thực hoặc bạn cho phép Crystal thực hiện kết nối thông qua kết nối đã lưu trong báo cáo? Nếu bạn đang thực hiện kết nối của riêng mình theo bất kỳ cách nào, hình dạng hoặc biểu mẫu, bạn phải đóng kết nối theo cách thủ công và gọi đến việc xử lý trước khi xử lý báo cáo.

Rất có thể đây là rò rỉ bộ nhớ. Tôi đã trải qua những điều này trước đây. Ngoài ra còn có một vấn đề rò rỉ bộ nhớ với Crystal Reports và được nói về trên diễn đàn của họ khá nhiều nhưng không có sửa chữa đã được ban hành khi tôi đã sử dụng nó một vài năm trước đây. Tôi bỏ Crystal cho các lựa chọn khác.

0

Tôi gặp sự cố tương tự, ngoại trừ tôi đang sử dụng Sybase. Một thời gian ngắn trước đây tôi đã đăng các mã tôi đã viết để vứt bỏ kết nối (và điều đó không làm việc) khi tôi nhìn thấy một lỗi! Tôi sửa lỗi, và, qua các ngón tay của tôi, bây giờ nó có vẻ làm việc. Tôi đã mở gần 100 báo cáo mà tôi không thể mở 10 trước đó. Nếu bạn thử điều này, xin vui lòng cho tôi biết nếu nó hoạt động cho bạn.

Đây là những gì tôi đang làm ngay trước khi tôi đóng cửa sổ có chứa người xem Crystal Reports:

var rd = (ReportDocument)crystalReportViewer1.ReportSource; 
foreach (Table table in rd.Database.Tables) 
    table.Dispose(); 
rd.Database.Dispose(); 
rd.Close(); 
rd.Dispose(); 
GC.Collect(); 

Đánh dấu

0

Marks mã dường như hơi làm giảm tình trạng này mặc dù nó là một chút về phía sau , phải là một cái gì đó như:

ReportDocument rd = (ReportDocument) viewer.ReportSource; 
foreach (Table table in rd.Database.Tables) 
    table.Dispose(); 
viewer.ReportSource = null; 
rd.Database.Dispose(); 
rd.Close(); 
rd.Dispose(); 
rd = (ReportDocument) viewer.ReportSource; 
GC.Collect(); 

Điều này không hoàn toàn cắm rò rỉ cho tôi nhưng chắc chắn đã giúp.

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