Witam,
Na wstępie dodam, że w C# jestem dopiero początkującym.
Chciałbym, aby przy pomocy C# wykonać procedurę składowaną SQL i następnie wyniki tej procedury wyświetlić w GridControl (każdy jako osobny wiersz oczywiście).
Pomoże mi ktoś ?
Witam,
Na wstępie dodam, że w C# jestem dopiero początkującym.
Chciałbym, aby przy pomocy C# wykonać procedurę składowaną SQL i następnie wyniki tej procedury wyświetlić w GridControl (każdy jako osobny wiersz oczywiście).
Pomoże mi ktoś ?
Ja Ci pomogę.
Łączenie z bazą danych odbywa się w klasie Db. Poniżej kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace TestProceduryGrid
{
public partial class Db : DbContext
{
public Db(string con)
:base($"data source=111.111.1.1\\Nazwa_serwera;initial catalog = {con}; User ID = xyz; Password=xyz")
{
}
}
}
Procedura jest wywoływana bez parametrów. Jest wynik to string, poniżej screen z przykładem:
Czy powyższe rozwiązania nie zadziałały?
Jest jeszcze klasa Model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestProceduryGrid
{
public class Model
{
public string Blad { get; set; }
}
}
Procedura zwraca string i chcesz ja podpiąć do Grida czy zwraca jakieś dane lub błąd w string?
Procedura zwraca w wyniku tekst, który wyżej zamieściłem na screenie. Nazwa kolumny Blad jest przypadkowa. Tekst który jest widoczny na screenie składa się z numeru umowy oraz dwóch dat - pobieranych z bazy. Poniżej kod z procedury:
SELECT CONCAT('Umowa ', @NR_UM, ' posiada więcej niż jeden okres dla okresu ', @DATA_OD, ' - ', @DATA_DO) AS BLAD
Ogólnie to wygląda tak.
Wstawiasz komponent BindingSource na form bsErrors
Masz GridControl o nazwie np. grid1 Ustawiasz grid1.DataSource na bsErrors
Ustawiasz bsErrors.DataSource na swoją klasę Model (rozwijasz, opcja Add Project Data Source, wybierasz Object, Next, szukasz dll gdzie jest klasa Model i wybierasz tę klasę)
Wywołania procedury, jak w linku od @WeiXiao
var res = db.Database.SqlQuery<Model>("NAZWA PROCEDURY").FirstOrDefault(); // albo ToList() zamiast FirstOrDefault() jeśli zwracana jest lista
bsErrors.DataSource = res; //podpięcie do grida
Uwaga!
Jeśli procedura zwraca kilka datasetów, jak chyba u Ciebie, to tak nie zadziała bo odczyta tylko pierwszy dataset. Albo procedura powinna to wszystko skleić w jeden zbiór albo cos takiego
List<Model> models = new List<Model>(); // lista na dane zwracane z procedury
using (var db = new DatabaseContext()) // // tu Twój db context
using (var connection = db.Database.Connection)
{
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = "Test123"; // tu twoja nazwa procedury
using (var reader = cmd.ExecuteReader())
{
while (reader.HasRows)
{
var errs = ((IObjectContextAdapter)db).ObjectContext.Translate<Model>(reader).ToList();
models.AddRange(errs);
reader.NextResult();
}
}
}
i potem bsErrors.DataSOurce = models;
EDIT
Wymaga
using System.Data.Entity.Infrastructure;