2012-12-19 32 views
7

Tôi có SqlDataReader được trả về từ tuyên bố ExecuteDataReader.Làm thế nào để thay đổi tên cột trong DataReader trong C#?

Tất cả những gì tôi muốn là: thay đổi một số tên cột trong trình đọc dữ liệu, ngay trước khi liên kết với lưới.

Đây là tình hình:

  1. Trước tiên tôi xây dựng cấu trúc của lưới (cấu trúc có trong bảng trong cơ sở dữ liệu đã được điền dựa trên đầu ra của một thủ tục lưu trữ trong hệ thống trong quá khứ)
  2. tôi thực hiện dữ liệu đọc để thực hiện thủ tục lưu trữ
  3. Ràng buộc người đọc dữ liệu vào lưới

Dưới đây là các vấn đề: nếu một cột trong thủ tục lưu trữ là trong trường hợp trên và tái cột lated trong lưới là trong trường hợp thấp hơn, lưới điện không điền.

Và tôi có rất nhiều quy trình được lưu trữ dựa trên kiến ​​trúc này. Một số người trong số họ có nhiều hàng để hiển thị. Và do đó tôi sử dụng trình đọc dữ liệu để thực hiện.

  1. Tôi không muốn thay đổi tên cột trong thủ tục lưu trữ (quá nhiều công việc)
  2. Tôi không muốn sao chép kết quả của đầu đọc dữ liệu đến một người giữ dữ liệu (vì trên cao, và hiệu suất thấp)
  3. Tôi chỉ là một cách để thay đổi tên cột của trình đọc dữ liệu

    đọc sqlDataReader; reader.executedatareadet();

Ví dụ sau khi trình đọc dữ liệu được trả về, tôi có hai cột (A,B).

Tôi muốn thay đổi cột 'A'-'a' (chuyển đổi để giảm trường hợp) trước khi ràng buộc nó vào lưới như reader.GetName(i)

Tôi muốn để có thể làm điều gì đó như

reader.SetName(i) 

nhưng nó seams rằng chúng tôi không thể thay đổi tên cột của trình đọc dữ liệu

+0

Thay vì tên Cột, hãy thử sử dụng các thuộc tính chỉ mục của coloumn..if có thể. – Pratik

Trả lời

0

Bạn có thể thử tải DbDataReader trong một DataTable với tên cột được xác định trước và sau đó sử dụng bảng làm nguồn dữ liệu trong ứng dụng chào hàng.

+0

hi damyan Bogoev Thanks..Nhưng kết quả của thủ tục lưu trữ là quá nhiều và tôi không Watn để sao chép vào dataholder khác như datatabele. – abianari

+0

Hơn bạn zcould sử dụng một thủ tục được lưu trữ với một ORM. Ánh xạ nó vào một phương thức để hiện thực hóa nó thành một kiểu nhất định và bạn sẽ nhận được dữ liệu theo định dạng cần thiết. –

+0

Dưới đây là cách thực hiện điều đó với OpenAccess ORM sử dụng API ADO cấp thấp http://www.telerik.com/help/openaccess-orm/openaccess-tasks-adonet-stored-procedures-materialize-result-set.html –

1
  1. Bạn có thể thay đổi tên cột trong GridView
  2. Nếu có thể thay đổi các Stored Procedure với tên cột mới
+0

cảm ơn Anand nhưng trong câu hỏi tôi đề cập đến rằng tôi không muốn làm một trong hai giải pháp bạn sugest .. – abianari

+0

DataReader chỉ để đọc dữ liệu trả về. Bạn đọc các giá trị và bạn đặt chúng vào các cấu trúc dữ liệu hoặc các biến của riêng bạn. Cách duy nhất để thay đổi cấu trúc của trình đọc dữ liệu là nguồn gốc dữ liệu trong trường hợp của bạn Thủ tục lưu trữ hoặc cotrol ràng buộc dữ liệu trong trường hợp GridView của bạn. – andy

0

khuyến nghị của tôi ở đây sẽ là: tách UI và cơ sở dữ liệu mã. Nếu giao diện người dùng của bạn bị ảnh hưởng bởi trình đọc dữ liệu thì điều đó đơn giản khiến tôi hỏi: "tại sao giao diện người dùng lại nói chuyện với một trình đọc dữ liệu?". Hai thứ này nằm ở các đầu đối diện nhau của chồng. Tôi sẽ trừu tượng rằng bằng cách yêu cầu DAL trả về một danh sách cụ thể về các loại POCO/DTO được điền cụ thể (hoặc có thể là các kiểu chế độ xem), tức là

public List<Customer> GetCustomers({some filter etc}) {...} 

sau đó liên kết với rằng, tức là

var customers = dal.GetCustomers(...); 
... 
someUI.DataSource = customers; 

Loại Customer sau đó được xác định rõ với những đặc tính như:

public class Customer { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    ... 
} 

Mọi thay đổi thực hiện tại Dal bây giờ hoàn toàn được tách khỏi giao diện người dùng.

+0

Xin chào Marcel Cảm ơn, bạn hoàn toàn đúng. Nhưng, trong tình huống này cho tôi hiệu suất là critical.you sao chép dữ liệu dữ liệu khác dataholder.i nghĩ rằng tùy chọn duy nhất cho tôi là thay đổi các thủ tục lưu trữ beacause nó dường như không có cách nào để thay đổi tên cột của đầu đọc dữ liệu – abianari

+0

@abianari trong bất kỳ kịch bản nào có lượng dữ liệu * sane * bị ràng buộc, điều đó sẽ làm cho ** chênh lệch không chính xác thành hiệu suất (giả sử lớp đọc POCO của bạn nhanh, một cái gì đó như "dapper" sẽ là lý tưởng). Hiệu suất duy nhất sẽ hiển thị có độ trễ mạng và hiệu suất truy vấn cơ sở dữ liệu. Và thực sự, ngay cả khi bạn đang ràng buộc một lượng lớn dữ liệu, có những cách không đệm/phát trực tuyến để thực hiện tương tự với 'IEnumerable ' thay vì 'Danh sách ' (và thực sự, "công cụ" đã được tích hợp sẵn). Thành thật mà nói: Tôi từ chối yêu cầu của bạn. Tôi dành nhiều ** ** thời gian để tìm kiếm ... –

+0

@abianari ... ở mã hiệu suất quan trọng và điều đó đơn giản là không phải là nút cổ chai. –