In this Code snippet you will find a comprehensive Extension Methods for executing stored procedures. This code is taken from different posts online. And tested using different scenarios. Including api and parallel requests.
- Add the following class to your dotnet Core Project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 | using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
public static class CommonExtentions
{
public static List<T> MapToList<T>(this DbDataReader dr)
{
var objList = new List<T>();
var props = typeof(T).GetRuntimeProperties();
var colMapping = dr.GetColumnSchema()
.Where(x => props.Any(y => y.Name.ToLower() == x.ColumnName.ToLower()))
.ToDictionary(key => key.ColumnName.ToLower());
if (dr.HasRows)
{
while (dr.Read())
{
T obj = Activator.CreateInstance<T>();
foreach (var prop in props)
{
if (colMapping.ContainsKey(prop.Name.ToLower()))
{
var val =
dr.GetValue(colMapping[prop.Name.ToLower()].ColumnOrdinal.Value);
prop.SetValue(obj, val == DBNull.Value ? null : val);
}
}
objList.Add(obj);
}
}
return objList;
}
public static DbCommand LoadStoredProc(
this DbContext context, string storedProcName)
{
var cmd = context.Database.GetDbConnection().CreateCommand();
cmd.CommandText = storedProcName;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
return cmd;
}
public static DbCommand WithSqlParam(
this DbCommand cmd, string paramName, object paramValue)
{
if (string.IsNullOrEmpty(cmd.CommandText))
throw new InvalidOperationException(
"Call LoadStoredProc before using this method");
var param = cmd.CreateParameter();
param.ParameterName = paramName;
param.Value = paramValue == null ? DBNull.Value : paramValue;
cmd.Parameters.Add(param);
return cmd;
}
public static int ExecuteStoredProc(this DbCommand command)
{
using (command)
{
command.CommandType = System.Data.CommandType.StoredProcedure;
if (command.Connection.State == System.Data.ConnectionState.Closed)
command.Connection.Open();
try
{
var toreturn = command.ExecuteNonQuery();
return toreturn;
}
catch (Exception e)
{
throw (e);
}
finally
{
command.Connection.Close();
}
}
}
public static List<T> ExecuteStoredProc<T>(this DbCommand command)
{
using (command)
{
if (command.Connection.State == System.Data.ConnectionState.Closed)
command.Connection.Open();
try
{
using (var reader = command.ExecuteReader())
{
return reader.MapToList<T>();
}
}
catch (Exception e)
{
throw (e);
}
finally
{
command.Connection.Close();
}
}
}
}
|
Usage : you can Use extensions like this1
2
3
4
5
6
7
8
9 | List<MyType> myTypeList = new List<MyType>();
using (var context = new MyDbContext())
{
myTypeList = context.LoadStoredProc("StoredProcedureName")
.WithSqlParam("firstparamname", firstParamValue)
.WithSqlParam("secondparamname", secondParamValue).
.ExecureStoredProc<MyType>();
}
|
Post a Comment
Post a Comment