Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa memanggil Prosedur Tersimpan SQL menggunakan EntityFramework 7 dan Asp.Net 5

Saya harap saya memahami masalah Anda dengan benar. Anda sudah memiliki PROSEDUR TERSIMPAN, misalnya dbo.spGetSomeData , dalam database, yang mengembalikan daftar beberapa item dengan beberapa bidang dan Anda perlu menyediakan data dari metode Web API.

Implementasinya bisa tentang berikut ini. Anda dapat menentukan kosong DbContext seperti:

public class MyDbContext : DbContext
{
}

dan untuk mendefinisikan appsettings.json dengan koneksi string ke database

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

Anda harus menggunakan Microsoft.Extensions.DependencyInjection untuk menambahkan MyDbContext ke

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

Sekarang Anda dapat mengimplementasikan tindakan WebApi Anda sebagai berikut:

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

Kode di atas cukup jalankan menggunakan exec dbo.spGetSomeData dan gunakan dataRader untuk membaca semua hasil dan simpan di sana dalam dynamic obyek. Jika Anda ingin membuat $.ajax panggilan dari api/My anda akan mendapatkan data yang dikembalikan dari dbo.spGetSomeData , yang dapat langsung Anda gunakan dalam kode JavaScript. Kode di atas sangat transparan. Nama bidang dari kumpulan data yang dikembalikan oleh dbo.spGetSomeData akan menjadi nama properti dalam kode JavaScript. Anda tidak perlu mengelola kelas entitas apa pun dalam kode C# Anda dengan cara apa pun. Kode C# Anda tidak memiliki nama bidang yang dikembalikan dari prosedur tersimpan. Jadi jika Anda ingin memperpanjang/mengubah kode dbo.spGetSomeData (ganti nama beberapa bidang, tambahkan bidang baru) Anda hanya perlu menyesuaikan kode JavaScript Anda, tetapi tidak ada kode 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. Pilih 10 catatan teratas untuk setiap kategori

  2. Pencocokan fuzzy menggunakan T-SQL

  3. Bagaimana cara mendapatkan perbedaan antara dua baris untuk bidang kolom?

  4. Bagaimana cara menghindari satu kutipan di SQL Server?

  5. Bergabung dengan beberapa tabel di SQL