sql >> データベース >  >> RDS >> Sqlserver

EntityFramework7とAsp.Net5を使用してSQLストアドプロシージャを呼び出すにはどうすればよいですか

    私はあなたの問題を正しく理解することを望みます。 dbo.spGetSomeDataなどの既存のストアドプロシージャがあります 、データベース内。これは、いくつかのフィールドを持ついくつかのアイテムのリストを返し、WebAPIメソッドからデータを提供する必要があります。

    実装は次のようになります。 を定義できます 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. dtexecを使用したSSISパッケージの実行

    2. MySQLで日付から年と月を取得する方法

    3. crfclust.bdbからの高いスペース使用量

    4. SQLSELECTAND演算子