Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak mogę wywołać procedurę składowaną SQL przy użyciu EntityFramework 7 i Asp.Net 5?

Mam nadzieję, że dobrze rozumiem Twój problem. Masz już istniejącą PROCEDURA PRZECHOWYWANA, na przykład dbo.spGetSomeData , w bazie danych, która zwraca listę niektórych pozycji z pewnymi polami i musisz podać dane z metody Web API.

Wdrożenie może dotyczyć następujących kwestii. Możesz zdefiniować pusty DbContext jak:

public class MyDbContext : DbContext
{
}

i zdefiniować appsettings.json z ciągiem połączenia do bazy danych

{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=MyDb;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  }
}

Powinieneś użyć Microsoft.Extensions.DependencyInjection dodać MyDbContext do

public class Startup
{
    // property for holding configuration
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
            .AddEnvironmentVariables();
        // save the configuration in Configuration property
        Configuration = builder.Build();
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc()
            .AddJsonOptions(options => {
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options => {
                options.UseSqlServer(Configuration["ConnectionString"]);
            });
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ...
    }
}

Teraz możesz zaimplementować swoje działanie WebApi w następujący sposób:

[Route("api/[controller]")]
public class MyController : Controller
{
    public MyDbContext _context { get; set; }

    public MyController([FromServices] MyDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async IEnumerable<object> Get()
    {
        var returnObject = new List<dynamic>();

        using (var cmd = _context.Database.GetDbConnection().CreateCommand()) {
            cmd.CommandText = "exec dbo.spGetSomeData";
            cmd.CommandType = CommandType.StoredProcedure;
            // set some parameters of the stored procedure
            cmd.Parameters.Add(new SqlParameter("@someParam",
                SqlDbType.TinyInt) { Value = 1 });

            if (cmd.Connection.State != ConnectionState.Open)
                cmd.Connection.Open();

            var retObject = new List<dynamic>();
            using (var dataReader = await cmd.ExecuteReaderAsync())
            {
                while (await dataReader.ReadAsync())
                {
                    var dataRow = new ExpandoObject() as IDictionary<string, object>;
                    for (var iFiled = 0; iFiled < dataReader.FieldCount; iFiled++) {
                        // one can modify the next line to
                        //   if (dataReader.IsDBNull(iFiled))
                        //       dataRow.Add(dataReader.GetName(iFiled), dataReader[iFiled]);
                        // if one want don't fill the property for NULL
                        // returned from the database
                        dataRow.Add(
                            dataReader.GetName(iFiled),
                            dataReader.IsDBNull(iFiled) ? null : dataReader[iFiled] // use null instead of {}
                        );
                    }

                    retObject.Add((ExpandoObject)dataRow);
                }
            }
            return retObject;
        }
    }
}

Powyższy kod po prostu wykonaj za pomocą exec dbo.spGetSomeData i użyj dataRader, aby odczytać wszystkie wyniki i zapisać je w dynamic obiekt. Gdybyś zrobił $.ajax zadzwoń z api/My otrzymasz dane zwrócone z dbo.spGetSomeData , którego możesz użyć bezpośrednio w kodzie JavaScript. Powyższy kod jest bardzo przejrzysty. Nazwy pól z zestawu danych zwróconego przez dbo.spGetSomeData będą nazwy właściwości w kodzie JavaScript. Nie musisz w żaden sposób zarządzać klasami jednostek w kodzie C#. Twój kod C# nie ma nazw pól zwróconych z procedury składowanej. Tak więc, jeśli chcesz rozszerzyć/zmienić kod dbo.spGetSomeData (zmień nazwy niektórych pól, dodaj nowe pola) będziesz musiał dostosować tylko kod JavaScript, ale nie kod C#.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 sposobów na zwrócenie wszystkich tabel z kluczem podstawowym w SQL Server

  2. Uzyskaj 1 górny wiersz z każdej grupy

  3. Jak przekonwertować ciąg na datę/godzinę w SQL Server za pomocą funkcji CONVERT()

  4. Co oznacza exec sp_reset_connection w programie Sql Server Profiler?

  5. Wartości dziesiętne w SQL do dzielenia wyników