Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да извикам SQL съхранена процедура с помощта на EntityFramework 7 и Asp.Net 5

Надявам се, че разбирам правилно проблема ви. Имате съществуваща СЪХРАНЕНА ПРОЦЕДУРА, например dbo.spGetSomeData , в базата данни, която връща списъка с някои елементи с някои полета и трябва да предоставите данните от метода на уеб API.

Реализацията може да бъде следната. Можете да дефинирате празен DbContext като:

public class MyDbContext : DbContext
{
}

и да дефинирате appsettings.json с низа за връзка към базата данни

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

Трябва да използвате Microsoft.Extensions.DependencyInjection за да добавите MyDbContext към

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)
    {
        ...
    }
}

Сега можете да приложите действието си за WebApi по следния начин:

[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;
        }
    }
}

Горният код просто се изпълнява с помощта на exec dbo.spGetSomeData и използвайте dataRader, за да прочетете всички резултати и да ги запишете в dynamic обект. Ако бихте направили $.ajax обаждане от api/My ще получите данните, върнати от dbo.spGetSomeData , който можете директно да използвате в JavaScript код. Горният код е много прозрачен. Имената на полетата от набора от данни, върнати от dbo.spGetSomeData ще бъдат имената на свойствата в JavaScript кода. Не е необходимо по никакъв начин да управлявате никакви класове обекти във вашия C# код. Вашият C# код няма имена на полета, върнати от съхранената процедура. По този начин, ако искате да разширите/промените кода на dbo.spGetSomeData (преименувайте някои полета, добавете нови) ще трябва да коригирате само своя JavaScript код, но не и 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. Как можете да наименувате таблиците на набора от данни, които връщате в съхранена процедура?

  2. Как да разделя разделен низ в SQL Server, без да създавам функция?

  3. Получаване на данни с UTF-8 charset от MSSQL сървър с помощта на PHP FreeTDS разширение

  4. Статистика на базата данни за актуализиране на SQL Server

  5. Заявката е изключително бавна в кода, но бърза в SSMS