Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào tôi có thể gọi một Thủ tục được lưu trữ trong SQL bằng EntityFramework 7 và Asp.Net 5

Tôi hy vọng rằng tôi hiểu đúng vấn đề của bạn. Bạn hiện có THỦ TỤC ĐƯỢC LƯU TRỮ, ví dụ:dbo.spGetSomeData , trong cơ sở dữ liệu, trả về danh sách một số mục với một số trường và bạn cần cung cấp dữ liệu từ phương thức API Web.

Việc thực hiện có thể là về những điều sau đây. Bạn có thể xác định một trống DbContext như:

public class MyDbContext : DbContext
{
}

và để xác định appsettings.json với chuỗi kết nối với cơ sở dữ liệu

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

Bạn nên sử dụng Microsoft.Extensions.DependencyInjection để thêm MyDbContext tới

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

Bây giờ bạn có thể triển khai hành động WebApi của mình như sau:

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

Đoạn mã trên chỉ thực thi bằng cách sử dụng exec dbo.spGetSomeData và sử dụng dataRader để đọc tất cả kết quả và lưu vào đó trong dynamic vật. Nếu bạn thực hiện $.ajax gọi từ api/My bạn sẽ nhận được dữ liệu trả về từ dbo.spGetSomeData , mà bạn có thể sử dụng trực tiếp trong mã JavaScript. Đoạn mã trên rất minh bạch. Tên của các trường từ tập dữ liệu được trả về bởi dbo.spGetSomeData sẽ là tên của các thuộc tính trong mã JavaScript. Bạn không cần quản lý bất kỳ lớp thực thể nào trong mã C # của mình theo bất kỳ cách nào. Mã C # của bạn không có tên các trường được trả về từ quy trình được lưu trữ. Do đó, nếu bạn muốn mở rộng / thay đổi mã của dbo.spGetSomeData (đổi tên một số trường, thêm các trường mới), bạn sẽ chỉ cần điều chỉnh mã JavaScript của mình chứ không cần điều chỉnh mã 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. Những điều bạn nên biết với NOCHECK khi kích hoạt ràng buộc CHECK trong SQL Server

  2. Làm cách nào để lấy tổng của nhiều giá trị ngày giờ?

  3. Cách tìm định dạng ngày được sử dụng trong phiên hiện tại trong SQL Server (T-SQL)

  4. Phương pháp lưu trữ mật khẩu trong cơ sở dữ liệu ưa thích

  5. Làm cách nào để sao chép cơ sở dữ liệu SQL Azure vào máy chủ phát triển cục bộ của tôi?