C# przeniesienie do bazy wszystkich zapytań z kodu jako procedury składowane

0

Witam,
Chciałbym wszystkie zapytania do bazy danych z kodu aplikacji przenieść do bazy jako procedury składowane. Pytanie dotyczy głównie zapytań, które w warunku mają wartość pobieraną z pola tekstowego. Poniżej kod przykładowego zapytania w kodzie aplikacji:

string sql = @"SELECT d.NUMER, d.DATA, p.CENA, p.ILOSC, p.NAZWA_POZ
FROM DOKUMENTY as d
INNER JOIN POZYCJE_DOK as p
WHERE d.NUMER = '" + TextBox1.Text + @"'
              ";

W bazie to zapytanie jako procedura wyglądało by np. tak:

CREATE PROCEDURE N_PobierzDaneDokumentow
@Param1 VARCHAR(20)
AS
BEGIN TRY
	BEGIN TRAN
	       SELECT d.NUMER, d.DATA, p.CENA, p.ILOSC, p.NAZWA_POZ
               FROM DOKUMENTY as d
               INNER JOIN POZYCJE_DOK as p
               WHERE d.NUMER = @Param1
	COMMIT TRAN
END TRY
BEGIN CATCH
	ROLLBACK TRAN
	;THROW
END CATCH

Teraz chodzi o to, aby przesłać z pola tekstowego TextBox1.Text stringa do procedury, a następnie wczytać dane z SELECT do TextBoxów w aplikacji ?

0

Wysłanie parametru do procedury bym zrobił np. tak:

Private void PobierzDane()
{
   var builder = new SqlConnectionStringBuilder()
   {
       DataSource = "ServerName",
       InitialCatalog = "DatabaseName",
       UserID = "UserName",
       Password = "UserPassword"
   };

   var conn = new SqlConnection(builder.ConnectionString);

   SqlCommand cmd = conn.CreateCommand();

   conn.Open();

   cmd.CommandType = CommandType.StoredProcedure;

   cmd.Parameters.Add(new SqlParameter("@Param1", TextBox1.Text));

   cmd.CommandText = "N_PobierzDaneDokumentow";

   cmd.ExecuteNonQuery();

   conn.Close();
}

Ale jak teraz z procedury składowanej pobrać dane do TextBoxów ??

1

Wywołujesz procedurę np. za pomocą Dappera, który może Ci je mapować od razu na obiekty, wtedy nie męczysz się z DataTable https://dapper-tutorial.net/stored-procedure. Ale trzymanie zapytań po stronie bazy jako procedury to zła droga, już lepiej pisać widoki i robić SELECT z widoku. Klejenie parametrów zapytania przez Stringi też kiepsko wygląda. No i po co Ci Transakcja przy instrukcji SELECT?

0

Tak, zgadza się transakcja przy SELECT jest zbyteczna

2

To jest kolejny głupi pomysł.
Poczytaj o EnityFramework i ogólnie o mapowaniu relacyjno-obiektowym. Albo jakiś inny mapper jak wspomniany już Dapper.

Jeśli chcesz jakoś sprawnie bindowac dane do kontrolek to i tak raczej będziesz musiał mieć klasy-modele dla tych danych.
Nie myśl tabelkami z bazy tylko obiektami w programie.

0

Ok, dziękuję za opinię. Zostaję przy Entity Framework.

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