मुझे आशा है कि मैं आपकी समस्या को सही ढंग से समझता हूं। आपके पास मौजूदा संग्रहीत प्रक्रिया है, उदाहरण के लिए 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
. का उपयोग करके निष्पादित करें और सभी परिणामों को पढ़ने और वहां dynamic
. में सहेजने के लिए dataRader का उपयोग करें वस्तु। अगर आप $.ajax
api/My
. से कॉल करें आपको dbo.spGetSomeData
. से लौटाया गया डेटा मिलेगा , जिसे आप सीधे जावास्क्रिप्ट कोड में उपयोग कर सकते हैं। उपरोक्त कोड बहुत पारदर्शी है। डेटासेट से फ़ील्ड के नाम dbo.spGetSomeData
. द्वारा लौटाए गए हैं जावास्क्रिप्ट कोड में गुणों के नाम होंगे। आपको किसी भी तरह से अपने C# कोड में किसी भी इकाई वर्ग को प्रबंधित करने की आवश्यकता नहीं है। आपके सी # कोड में संग्रहीत प्रक्रिया से लौटाए गए फ़ील्ड का कोई नाम नहीं है। इस प्रकार यदि आप dbo.spGetSomeData
. के कोड को बढ़ा/बदलेंगे/बदलेंगे (कुछ फ़ील्ड का नाम बदलें, नए फ़ील्ड जोड़ें) आपको केवल अपना जावास्क्रिप्ट कोड समायोजित करने की आवश्यकता होगी, लेकिन कोई C# कोड नहीं।