Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Mam pytanie. Mam procedurę składowaną add_client, która po
dodaniu klienta zwraca mi wartość klucza dla wstawionego rekordu
przez parametr INOUT.

Jednak używając Entity Framework nie umiem dostać od bazy MySQL
tej wartości OUT - dostaję śliczny exception


OUT or INOUT argument 1 for routine test.add_client is not a
variable or NEW pseudo-variable in BEFORE trigger



int clientId = 1240;
var arg1 = new MySqlParameter[] { new MySqlParameter { ParameterName
= "inout_client_id", Value = clientId , Direction =
System.Data.ParameterDirection.InputOutput } };
_entities.ExecuteStoreCommand("call add_client(" +
"?inout_client_id")", arg1);


Jak to zrobić?
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Będę wdzięczny za wszelką pomoc. Jeśli ktokolwiek z Was umie korzystać z Entity Framework to bardzo proszę o jakieś rozwiązanie. Nie za bardzo mogę tknąć samą procedurę w bazie MySQL, więc pozostaje mi skorzystanie z tego co jest. W przykładzie podałem tylko jeden parametr INOUT, w rzeczywistości funkcja która mnie interesuje ma z 10 parametrów IN, co jest trochę niewygodne

Szukałem cały dzień w Google ale nic sensownego nie miałem szczęścia znaleźć. Tym sposobem, który podałem, udaje mi się uruchomić wszystkie procedury składowane oprócz tych, które mają w parametrze INOUT.

Próbowałem też korzystać z opcji "Import function" w Entity Framework, ale wcale nie mapowało mi poprawnie procedur (albo ja nie umiałem do nich parametrów poprawnie przekazać).

Metoda, którą wybrałem działa gdy mamy wszystkie parametry IN. Czego brakuje by zadziałała dla INOUT (w dodatku przekazując zaktualizowaną wartość do pola INOUT) ?

konto usunięte

Temat: Entity Framework + Procedury składowane

Borysław jakiej wersji EF używasz?

konto usunięte

Temat: Entity Framework + Procedury składowane

Sprawdź czy dodajesz parametry w tej samej kolejności w jakiej są zdefiniowane w procedurze.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Używam EF dostarczanego standardowo wraz z Visual Studio 2010 Pro.
MySql connector w wersji 6.3.6.0

Co do parametrów, to dodaję tylko jeden - pierwszy parametr, pozostałe parametry wpisuję w string - choć to nie powinno mieć akurat znaczenia.


"ExecuteStoreCommand("call add_client(?inout_client_id, '0','ss', 'ss', 's', 'ss', 'ss', 'ss', 'ss', 'ss', 'ss', 'ss', 'ss', '', 'true')", arg1)

konto usunięte

Temat: Entity Framework + Procedury składowane

Borysław Bobulski:
Próbowałem też korzystać z opcji "Import function" w Entity Framework, ale wcale nie mapowało mi poprawnie procedur (albo ja
Właśnie, czy możesz pokazać ten kod? U mnie z SQL Server działa:

var p_desc = new ObjectParameter("Description", typeof(string));
EFDbContext.NAZWA_PROCEDURY_PO_IMPORCIE(1 /*in*/, p_desc /*out*/);//execute
if (DBNull.Value != p_desc.Value) p_desc.Value.ToString();//just use it
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Po imporcie mam funkcje

public int add_client()
{
return base.ExecuteFunction("add_client");
}

Nie ma ona ani jednego parametru.

Ale mniejsza z tym. Zmodyfikowałem funkcje na

public int add_client(params ObjectParameter[] parameters)
{
return base.ExecuteFunction("add_client", parameters);
}

i zrobiłem to sposobem podanym powyżej, ale wciąż mam ten sam błąd

OUT or INOUT argument 1 for routine test.add_client is not a
variable or NEW pseudo-variable in BEFORE trigger
Borysław Bobulski edytował(a) ten post dnia 27.04.11 o godzinie 15:30
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Może tego nikt nigdy nie zrobił na świecie i to jest jakiś błąd w EF, albo MySQL Connector?

konto usunięte

Temat: Entity Framework + Procedury składowane

Borysław Bobulski:
Może tego nikt nigdy nie zrobił na świecie i to jest jakiś błąd w EF, albo MySQL Connector?

stawiam na MySQL-a
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Entity Framework + Procedury składowane

Klasycznie za pomocą


MySql.Data.MySqlClient.MySqlConnection conn;
MySql.Data.MySqlClient.MySqlCommand cmd;


bardzo łatwo wyciągnąć te dane jako OUT


Int64 vClientId = 0;
vClientId = (Int64)cmd.Parameters["?inout_client_id"].Value;


ale po to jest chyba EF, żeby NIE robić dodatkowych połączeń?Borysław Bobulski edytował(a) ten post dnia 27.04.11 o godzinie 16:54

Następna dyskusja:

Table Valued Functions in E...




Wyślij zaproszenie do