Odwołanie do bazy danych

0

Witam,
Na wstępie chce zaznaczyć, że jeśli chodzi o język c# jestem w pełni samoukiem i moje "programowanie" wygląda raczej jak składnie puzzli znalezionych w Internecie. Ale robię to już od jakiegoś czasu i mam za sobą kilka aplikacji z wykorzystaniem Windows form.

Więc tak, do mapowania połączenia z bazą SQL używam LINQ. Pobieram sobie nazwy kolumn i chciałbym zrobić mniej więcej coś takiego, że użytkownik wybiera sobie w check list box, które kolumny mają zostać pobrane do data grid wiew. Jednak aby to zrobić muszę wykorzystać nazwę zapisaną w string i tutaj pojawia się problem, ponieważ nie mogę nigdzie znaleźć rozwiązania.

Dla przykładu teraz robię to tak:

              {
                  var wpisy = from wpisy_ in baza.LICZNIKI
                              where wpisy_.DATA >= dateTimePicker1.Value
                                                       && wpisy_.DATA <= dateTimePicker2.Value
                              orderby wpisy_.DATA descending
                              select wpisy_;
foreach (var wpis in wpisy)
                  { ....
                      if (i == "test")
                      {
                          dataGridView2.Rows[o].Cells[i].Value = wpis.test;
                          o = o + 1;
                      } ...}

W tym przypadku string z check list box znajduję się w zmiennej "i" i to działa prawidłowo. Jednak chciałbym ten kod "zautomatyzować" aby stał się bardziej dynamiczny tzn. aby nie musieć pisać osobnego if dla każdej kolumny. Do tego muszę wiedzieć czy da się pobrać dane w jakiś inny sposób niż "wpis.test" (zamiast takiego odwołania wykorzystać zmienną i).

Drugim problemem jest czy da się w sposób dynamiczny mapować dane w linq teraz robię to przez okno graficzne .bdml, a chciałbym by w przypadku ręcznego dodania nowej kolumny np. przez SSMS program automatycznie ją znajdował. Tak abym nie musiał przerabiać każdorazowo mapowania linq. Potrzebuję czegoś co da mi dostęp do wszystkich danych w bazie (ew. jakiegokolwiek punktu zaczepienia jak to zrobić).

0

100 razy lepiej będzie jak odbierzesz wszystkie kolumny z bazy i ulryjesz w Gridzie te, które mają być niewidoczne.
To co chcesz zrobić nie ma zwykle sensu.

2

Poczytaj też o CodeFirst i migracjach. Baza danych ie jest najważniejsza. Najważniejsze są klasy. Nie myśl bazą danych tylko klasami (obiektami).

1

Na początku kilka uwag.
Tak nie rób

where wpisy_.DATA >= dateTimePicker1.Value
&& wpisy_.DATA <= dateTimePicker2.Value

Odczytaj sobie wcześniej dateTimePicker1.Value i dateTimePicker2.Value do własnych zmiennych, sprawdź czy mają wartości (!NULL) i sens (od > do, albo odwrotnie)

Tak też nie rób

if (i == "test")
{
dataGridView2.Rows[o].Cells[i].Value = wpis.test;
o = o + 1;
} ...}

Zbuduj sobie model - listę obiektów, tabele czy co tam chcesz i podepnij pod grida

Entity Framework w takim przypadku raczej nie ma sensu.
SCADY mogą mieć różne bazy i różne schematy tabel w db ale, przynajmniej jeśli chodzi o dane z procesów to zwykle są to jakieś przebiegi czasowe - data + decimal lub bool.
Musiałbyś zbudować sobie własną abstrakcję na bazę danych SCADY. Własną, abstrakcyjną, definicję danych i potem, w jakiejś konfiguracji, mapować to na tabele i kolumny ze SCADY.

Np

// abstrakcyjna definicja tabeli danych
public class SignalDef{
  public string Name {get;set}
  
  public string TableName {get;set}

  public List<SIgnalColumnDef> Columns{get;set;}
}

public class SIgnalColumnDef
{
  public string Name{get;set;}
  public string ColumnName{get;set;}
   public bool HasWhereCondition{get;set;} // trzeba jeszcze gdzieś dodać same wartości dla where i to pewnie z jakimś typowaniem np. dla dat 30 dni do tyłu
}

i potem budować sql-owe selecty na podstawie takiej konfiguracji własnym kodem albo tym: https://sqlkata.com/

I kilka uwag na końcu.
Ja bym się nie skupiał na tym, żeby od razu wszystkie SCADY były obsługiwane. I tak się nie obędzie bez jakiejś Twojej abstrakcji danych (Twojej uogólnionej wersji modelu danych). Firmowych SCADA na rynku jest kilka (może maks. z 10) plus jakieś autorskie systemy. Napisz najpierw porządnie dla jednej i może się okazać, że mniej czasu Ci zajmie przerobienie/dostosowanie do kolejnej niż pisanie abstrakcji dla różnych systemów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1