Korzystanie z wersji testowej Dapper, znalazłem ten działa jak czar:
result = dbConnection.ExecuteScalar<int>(typeof(UCCCCException).Name + "_c",
obj, commandType: CommandType.StoredProcedure);
piszę ogólny do użycia przy wstawianiu obiektów dowolnego typu do bazy danych.
Procedura przechowywana wygląda następująco:
ALTER PROCEDURE [dbo].[UCCCCException_c]
(
@Id int = null,
@ExceptionDate datetime = null,
@HResult int = 0,
@Message varchar(8000) = null,
@Source varchar(8000) = null,
@StackTrace varchar(8000) = null,
@Module varchar(8000) = null,
@Name varchar(8000) = null,
@created_at datetime = null,
@updated_at datetime = null,
@created_by int = null,
@updated_by int = null
,
@Creator varchar(255) = null,
@Updator varchar(255) = null
)
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Insert into dbo.uccccexceptions (ExceptionDate, HResult, [Message], [Source], StackTrace, Module, Name)
values (
coalesce(@ExceptionDate,getdate()),
@HResult,
@Message,
@Source,
@StackTrace,
@Module,
@Name
)
;
select @@Identity;
go
Te zastrzeżenia w tej sprawie jest to, że należy określić pozycję dla każdej nieruchomości w klasie używasz, nawet jeśli te właściwości nie istnieje w tabeli docelowej , jako parametr procedury składowanej. Może to być denerwujące, jeśli masz wiele pól, które są polami widoku w sytuacjach MVC.
Aby uzyskać wartość zwracaną, wystarczy użyć polecenia Wykonaj i upewnić się, że ostatnia instrukcja to Wybierz @@ Tożsamość w procedurze przechowywanej.
To działa doskonale i pozwala mi napisać polecenie rodzajowe insert w moim repozytorium jak poniżej:
public virtual int Insert(T obj)
{
int result = -2;
if (!databaseOnline)
{
throw new Exception(HttpStatusCode.ServiceUnavailable.ToString());
}
if (obj != null)
{
try
{
using (IDbConnection dbConnection = ConnectionProvider.OpenConnection())
{
dbConnection.Open();
result = dbConnection.ExecuteScalar<int>(typeof(T).Name + "_c",
obj, commandType: CommandType.StoredProcedure);
}
}
catch (SqlException sqlex)
{
Logger.LogError(sqlex, false);
throw;
}
catch (Exception ex)
{
Logger.LogError(ex);
throw;
}
}
return result;
}
używam konwencję w mojej bazy danych, że nazwa procedura przechowywana jest nazwa typu następnie "_s" dla wybierz, "_ c" dla wstawienia, "_d" dla usunięcia i "_u" dla aktualizacji.
PS: Nienawidzę używać DynamicParameters Dappera ani żadnego innego urządzenia, które wymaga użycia innej metody wstawiania lub aktualizacji dla każdej klasy w ogólnym repozytorium.
Co masz na myśli: "Nie jestem w stanie uzyskać dostępu do wartości w sposób opisany w dokumentacji" – MethodMan
Czy wypróbowany 'var IncidentID = con.Query (" usp_GetIncidentID ", commandType: CommandType.StoredProcedure) .SingleOrDefault();'? To jest najprostsze i będzie działać, jeśli procedura składowana zwraca wartości przez "wybierz" –
Po prostu wypróbowałem, wracam {DapperRow, INCIDENT_ID = '902306'}}, które udało mi się zobaczyć wcześniej, ale mając problemy z uzyskaniem dostępu do tej wartości. – yellowfever