2012-12-19 7 views
7

Mam SqlDataReader, która zostanie zwrócona z oświadczenia ExecuteDataReader.Jak zmienić nazwę kolumny w DataReader W języku C#?

Wszystko, czego chcę, to: zmienić nazwę kolumny w czytniku danych, tuż przed powiązaniem z siatką.

Oto sytuacja:

  1. Najpierw budować struktury sieci (struktura jest w tabeli w bazie danych, która była wypełniona w oparciu o wyjściu procedury przechowywane w systemie w przeszłości)
  2. i wykonać dane czytelnika do wykonania procedury przechowywanej
  3. Oprawa czytnik danych do sieci

tutaj jest problem: jeśli jedna kolumna w procedurze przechowywanej jest w górnej części obudowy i re kolumna w siatce jest małymi literami, siatka nie wypełnia.

Mam wiele procedur przechowywanych w oparciu o tę architekturę. Niektóre z nich mają wiele wierszy do wyświetlenia. I z tego powodu używam czytnika danych do działania.

  1. Nie chcę, aby zmienić nazwę kolumny w procedurze przechowywanej (zbyt dużo pracy)
  2. Nie chcę skopiować wynik czytnika danych do innego posiadacza danych (z powodu napowietrznych i niska wydajność)
  3. I tylko jeden sposób, aby zmienić nazwę kolumny czytnika danych

    czytnika SqlDataReader; reader.executedatareadet();

Na przykład po zwróceniu czytnika danych mam dwie kolumny (A,B).

Chcę zmienić kolumnę 'A' do 'a' (konwersja do małych liter) przed wiążące go do siatki jak reader.GetName(i)

Chcę być w stanie zrobić coś takiego

reader.SetName(i) 

ale szwy, które nie możemy zmienić nazwy kolumny czytnika danych:

+0

Zamiast nazwy kolumny spróbuj użyć właściwości indeksu coloumn.if możliwe. – Pratik

Odpowiedz

0

Możesz spróbować załadować DbDataReader w DataTable z predefiniowanymi nazwami kolumn, a później użyć tabeli jako źródła danych w aplikacji tout.

+0

hi damyan Bogoev Dzięki .. Ale wynik procedury przechowywanej jest zbyt wiele i nie chcę, aby skopiować do innego podmiotu danych, takich jak datatabele. – abianari

+0

Następnie należy użyć procedury składowanej z ORM. Odwzoruj go na metodę, która zmaterializuje go do danego typu, a otrzymasz dane w wymaganym formacie. –

+0

Oto jak to zrobić z OpenAccess ORM przy użyciu API ADO niskiego poziomu http://www.telerik.com/help/openaccess-orm/openaccess-tasks-adonet-stored-procedures-materialize-result-set.html –

1
  1. Można zmienić nazwy kolumn w GridView
  2. Jeśli to możliwe zmienić procedury przechowywanej z nowymi nazwami kolumn
+0

dziękuję Anandowi, ale w pytaniu wspomniałem, że nie chcę robić żadnego z proponowanych rozwiązań .. – abianari

+0

Urządzenie DataReader służy wyłącznie do odczytu zwracanych danych. Czytasz wartości i umieszczasz je we własnych strukturach danych lub zmiennych. Jedynym sposobem zmiany struktury czytnika danych jest pochodzenie danych w twoim przypadku Procedura przechowywana lub powiązanie danych cotrol w twoim przypadku GridView. – andy

0

Moja rekomendacja tutaj to: oddzielenie UI i bazy kodu. Jeśli twój interfejs użytkownika jest dotknięty przez czytnik danych, to po prostu każe mi zapytać: "dlaczego interfejs użytkownika rozmawia z czytnikiem danych?". Te dwie rzeczy znajdują się na przeciwległych końcach stosu. Chciałbym abstrahować, że zwracając DAL konkretną listę wypełnionych typów POCO/DTO (lub prawdopodobnie typów modelu widoku), tj.

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

następnie wiąże się że tj

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

typu Customer następnie definiować takie właściwości jak:

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

Zmiany wdrożenia na DAL są teraz całkowicie oddzielone od interfejsu użytkownika.

+0

Cześć Marcel Dzięki, masz absolutną rację. ale w tej sytuacji dla mnie wydajność jest krytyczna. Kopiujesz dane do innego podmiotu danych. Myślę, że jedyną opcją dla mnie jest zmiana procedury przechowywanej, ponieważ wydaje się, że nie ma możliwości zmiany nazwy kolumny czytnika danych. – abianari

+0

@abianari w każdym scenariuszu, w którym istnieje * rozsądna * ilość danych, które są związane, to spowoduje ** dokładnie zero ** różnicę w stosunku do wydajności (zakładając, że twoja warstwa od czytelnika do POCO jest szybka, coś takiego jak "dapper" byłoby idealne). Jedyną wydajnością, która będzie pokazywać, jest opóźnienie sieci i wydajność zapytań do bazy danych. I rzeczywiście, nawet jeśli wiążesz dużą ilość danych, istnieją sposoby bez buforowania/przesyłania strumieniowego, aby zrobić to samo z 'IEnumerable ' zamiast 'List ' (i rzeczywiście, "dapper" ma to, że wbudowane też). Szczerze mówiąc: Odrzucam twoje roszczenie. Spędzam ** dużo ** czasu szukając ... –

+0

@abianari ... w krytycznym kodzie wydajności, a to po prostu nie będzie wąskim gardłem. –