Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

परिचय

<पी> हम .NET कोर में कैशिंग और यह कैसे काम करती है, इस पर चर्चा करने जा रहे हैं। तो, हम निम्नलिखित चीजों को एक-एक करके देखते हैं।

  • कैशिंग का परिचय
  • कैश क्या है
  • कैश के प्रकार
  • कैश कार्यान्वयन
<पी> आजकल सॉफ्टवेयर उद्योग में कैशिंग बहुत लोकप्रिय है क्योंकि यह एप्लिकेशन के प्रदर्शन और स्केलेबिलिटी में सुधार करेगा। हम जीमेल और फेसबुक जैसे कई वेब एप्लिकेशन का उपयोग करते हैं और देखते हैं कि वे कितने प्रतिक्रियाशील हैं, और हमारे पास एक शानदार उपयोगकर्ता अनुभव है। इंटरनेट का उपयोग करने वाले बहुत सारे उपयोगकर्ता हैं और यदि किसी एप्लिकेशन में भारी नेटवर्क ट्रैफ़िक और मांग है, तो हमें कई चीजों का ध्यान रखना होगा जो हमें एप्लिकेशन के प्रदर्शन और प्रतिक्रिया को बेहतर बनाने में मदद करते हैं। तो, उसके कारण, कैशिंग का समाधान है, और इसीलिए कैशिंग तस्वीर में आती है।

<पी> तो चलिए एक-एक करके शुरू करते हैं।

कैशिंग क्या है?

<पी> कैश वह मेमोरी स्टोरेज है जिसका उपयोग अस्थायी स्टोरेज में बार-बार एक्सेस किए जाने वाले डेटा को स्टोर करने के लिए किया जाता है, यह अनावश्यक डेटाबेस हिट से बचने के लिए प्रदर्शन में काफी सुधार करेगा और जब भी हमें आवश्यकता होगी, बफर में अक्सर उपयोग किए जाने वाले डेटा को स्टोर करेगा।

<पी> प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

<पी> प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

<पी> जैसा कि आप उपरोक्त छवि में देख सकते हैं, दो परिदृश्य हैं, एक कैश का उपयोग किए बिना है, और दूसरा कैश के साथ है। तो यहां, जब हम कैश का उपयोग नहीं करते हैं, तो उस स्थिति में, मान लीजिए कि उपयोगकर्ता डेटा चाहते हैं, तो वे हर बार डेटाबेस से टकराएंगे, और यह समय की जटिलता को बढ़ाएगा और प्रदर्शन को कम कर देगा यदि उपयोगकर्ता कुछ स्थिर डेटा चाहते हैं, और यह सभी उपयोगकर्ताओं के लिए समान है। उस स्थिति में, जब हम कैश का उपयोग नहीं करते हैं, तो प्रत्येक डेटा लाने के लिए अनावश्यक डेटाबेस से टकराता है। दूसरी तरफ, जैसा कि आप देख सकते हैं, हम कैश का उपयोग करते हैं, और उस स्थिति में, यदि सभी उपयोगकर्ताओं के लिए समान स्थिर और समान डेटा है, तो केवल पहला उपयोगकर्ता डेटाबेस को हिट करेगा, डेटा लाएगा, और इसे कैश मेमोरी में संग्रहीत करेगा और फिर अन्य दो उपयोगकर्ताओं ने डेटा लाने के लिए डेटाबेस को अनावश्यक रूप से हिट किए बिना कैश से इसका उपयोग किया।

कैश के प्रकार

<पी> मूल रूप से, कैशिंग .NET कोर सपोर्ट दो प्रकार के होते हैं।

  1. इन-मेमोरी कैशिंग
  2. वितरित कैशिंग
<पी> जब हम In-Memory Cache का उपयोग करते हैं तो उस स्थिति में डेटा एप्लिकेशन सर्वर मेमोरी में संग्रहीत होता है, और जब भी हमें आवश्यकता होती है, हम उससे डेटा प्राप्त करते हैं और जहां भी हमें इसकी आवश्यकता होती है, उसका उपयोग करते हैं। और डिस्ट्रीब्यूटेड कैशिंग में, रेडिस और कई अन्य जैसे कई तृतीय-पक्ष तंत्र हैं। लेकिन इस अनुभाग में, हम रेडिस कैश पर विस्तार से नज़र डालते हैं और यह .NET कोर में कैसे काम करता है

वितरित कैशिंग

<पी> प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

  • मूल रूप से, वितरित कैशिंग में, जी डेटा को कई सर्वरों के बीच संग्रहीत और साझा किया जाता है
  • इसके अलावा, जब हम मल्टी-टेनेंट एप्लिकेशन का उपयोग करते हैं, तो कई सर्वरों के बीच लोड को प्रबंधित करने के बाद एप्लिकेशन की स्केलेबिलिटी और प्रदर्शन में सुधार करना आसान होता है
  • मान लीजिए, भविष्य में, यदि एक सर्वर क्रैश हो जाता है और पुनरारंभ होता है तो एप्लिकेशन पर कोई प्रभाव नहीं पड़ता है क्योंकि यदि हम चाहें तो एकाधिक सर्वर हमारी आवश्यकता के अनुसार हैं
<पी> रेडिस सबसे लोकप्रिय कैश है, जिसका उपयोग आजकल कई कंपनियां एप्लिकेशन के प्रदर्शन और स्केलेबिलिटी को बेहतर बनाने के लिए करती हैं। तो, हम एक-एक करके रेडिस और इसके उपयोग पर चर्चा करने जा रहे हैं।

रेडिस कैश

  • रेडिस एक ओपन सोर्स (बीएसडी लाइसेंस प्राप्त) इन-मेमोरी डेटा स्ट्रक्चर स्टोर है जिसका उपयोग डेटाबेस के रूप में किया जाता है।
  • मूल रूप से, इसका उपयोग अक्सर उपयोग किए जाने वाले और कुछ स्थिर डेटा को कैश के अंदर संग्रहीत करने और उपयोगकर्ता की आवश्यकता के अनुसार उपयोग और आरक्षित करने के लिए किया जाता है।
  • रेडिस में कई डेटा संरचनाएं मौजूद हैं जिनका उपयोग हम डेटा को संग्रहीत करने के लिए सूची, सेट, हैशिंग, स्ट्रीम और कई अन्य जैसे उपयोग करने में सक्षम हैं।

रेडिस कैश की स्थापना

<पी> चरण 1. निम्नलिखित URL का उपयोग करके रेडिस सर्वर डाउनलोड करें।

<पी> https://github.com/microsoftarchive/redis/releases/tag/win-3.0.504

<पी> चरण 2. ज़िप फ़ाइल निकालें और बाद में Redis सर्वर और Redis CLI खोलें।

<पी> प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

.NET कोर एपीआई का उपयोग करके रेडिस कैश का कार्यान्वयन

<पी> चरण 1. .NET कोर एपीआई वेब एप्लिकेशन

बनाएं <पी> चरण 2. निम्नलिखित NuGet पैकेज स्थापित करें, जिन्हें हमारे एप्लिकेशन में चरण दर चरण आवश्यकता है

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Swashbuckle.AspNetCore
  • StackExchange.Redis
<पी> चरण 3. मॉडल फ़ोल्डर बनाएं और विवरण के साथ उसके अंदर एक उत्पाद वर्ग बनाएं।

namespace RedisCacheDemo.Model
{
 public class Product
 {
 public int ProductId { get; set; }
 public string ProductName { get; set; }
 public string ProductDescription { get; set; }
 public int Stock { get; set; }
 }
}
<पी> चरण 4. इसके बाद, डेटाबेस संचालन के लिए DbContextClass क्लास बनाएं, जैसा कि मैंने नीचे दिखाया है।

using Microsoft.EntityFrameworkCore;
using RedisCacheDemo.Model;
namespace RedisCacheDemo.Data {
 public class DbContextClass: DbContext {
 public DbContextClass(DbContextOptions < DbContextClass > options): base(options) {}
 public DbSet < Product > Products {
 get;
 set;
 }
 }
}
<पी> चरण 5. अब, हम रेडिस कैश-संबंधित उपयोग के लिए ICacheService इंटरफ़ेस और CacheService क्लास बनाने जा रहे हैं।

using System;
namespace RedisCacheDemo.Cache
{
 public interface ICacheService
 {
 /// <summary>
 /// Get Data using key
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="key"></param>
 /// <returns></returns>
 T GetData<T>(string key);
 /// <summary> 
 /// Set Data with Value and Expiration Time of Key
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="key"></param>
 /// <param name="value"></param>
 /// <param name="expirationTime"></param>
 /// <returns></returns>
 bool SetData<T>(string key, T value, DateTimeOffset expirationTime);
 /// <summary>
 /// Remove Data 
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 object RemoveData(string key);
 }
}
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
namespace RedisCacheDemo.Cache {
 public class CacheService: ICacheService {
 private IDatabase _db;
 public CacheService() {
 ConfigureRedis();
 }
 private void ConfigureRedis() {
 _db = ConnectionHelper.Connection.GetDatabase();
 }
 public T GetData < T > (string key) {
 var value = _db.StringGet(key);
 if (!string.IsNullOrEmpty(value)) {
 return JsonConvert.DeserializeObject < T > (value);
 }
 return default;
 }
 public bool SetData < T > (string key, T value, DateTimeOffset expirationTime) {
 TimeSpan expiryTime = expirationTime.DateTime.Subtract(DateTime.Now);
 var isSet = _db.StringSet(key, JsonConvert.SerializeObject(value), expiryTime);
 return isSet;
 }
 public object RemoveData(string key) {
 bool _isKeyExist = _db.KeyExists(key);
 if (_isKeyExist == true) {
 return _db.KeyDelete(key);
 }
 return false;
 }
 }
}
<पी> चरण 6. ProductController क्लास बनाएं और नीचे दिखाए अनुसार निम्न विधि बनाएं।

using Microsoft.AspNetCore.Mvc;
using RedisCacheDemo.Cache;
using RedisCacheDemo.Data;
using RedisCacheDemo.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace RedisCacheDemo.Controllers {
 [Route("api/[controller]")]
 [ApiController]
 public class ProductController: ControllerBase {
 private readonly DbContextClass _dbContext;
 private readonly ICacheService _cacheService;
 public ProductController(DbContextClass dbContext, ICacheService cacheService) {
 _dbContext = dbContext;
 _cacheService = cacheService;
 }
 [HttpGet("products")]
 public IEnumerable < Product > Get() {
 var cacheData = _cacheService.GetData < IEnumerable < Product >> ("product");
 if (cacheData != null) {
 return cacheData;
 }
 var expirationTime = DateTimeOffset.Now.AddMinutes(5.0);
 cacheData = _dbContext.Products.ToList();
 _cacheService.SetData < IEnumerable < Product >> ("product", cacheData, expirationTime);
 return cacheData;
 }
 [HttpGet("product")]
 public Product Get(int id) {
 Product filteredData;
 var cacheData = _cacheService.GetData < IEnumerable < Product >> ("product");
 if (cacheData != null) {
 filteredData = cacheData.Where(x => x.ProductId == id).FirstOrDefault();
 return filteredData;
 }
 filteredData = _dbContext.Products.Where(x => x.ProductId == id).FirstOrDefault();
 return filteredData;
 }
 [HttpPost("addproduct")]
 public async Task < Product > Post(Product value) {
 var obj = await _dbContext.Products.AddAsync(value);
 _cacheService.RemoveData("product");
 _dbContext.SaveChanges();
 return obj.Entity;
 }
 [HttpPut("updateproduct")]
 public void Put(Product product) {
 _dbContext.Products.Update(product);
 _cacheService.RemoveData("product");
 _dbContext.SaveChanges();
 }
 [HttpDelete("deleteproduct")]
 public void Delete(int Id) {
 var filteredData = _dbContext.Products.Where(x => x.ProductId == Id).FirstOrDefault();
 _dbContext.Remove(filteredData);
 _cacheService.RemoveData("product");
 _dbContext.SaveChanges();
 }
 }
}
<पी> चरण 7. Appsetting.json के अंदर SQL सर्वर कनेक्शन स्ट्रिंग और Redis URL जोड़ें।

{
 "Logging": {
 "LogLevel": {
 "Default": "Information",
 "Microsoft": "Warning",
 "Microsoft.Hosting.Lifetime": "Information"
 }
 },
 "AllowedHosts": "*",
 "RedisURL": "127.0.0.1:6379",
 "ConnectionStrings": {
 "DefaultConnection": "Data Source=Server;Initial Catalog=RedisCache;User Id=sa;Password=***;"
 }
}
<पी> चरण 8. इसके बाद, स्टार्टअप क्लास के कॉन्फिगर सर्विस मेथड के अंदर ICacheService को रजिस्टर करें और हमारे एपीआई एंडपॉइंट्स का परीक्षण करने के लिए स्वैगर से संबंधित कुछ कॉन्फ़िगरेशन भी जोड़ें।

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using RedisCacheDemo.Cache;
using RedisCacheDemo.Data;
namespace RedisCacheDemo {
 public class Startup {
 public Startup(IConfiguration configuration) {
 Configuration = configuration;
 }
 public IConfiguration Configuration {
 get;
 }
 // This method gets called by the runtime. Use this method to add services to the container.
 public void ConfigureServices(IServiceCollection services) {
 services.AddControllers();
 services.AddScoped < ICacheService, CacheService > ();
 services.AddDbContext < DbContextClass > (options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
 services.AddSwaggerGen(c => {
 c.SwaggerDoc("v1", new OpenApiInfo {
 Title = "RedisCacheDemo", Version = "v1"
 });
 });
 }
 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
 if (env.IsDevelopment()) {
 app.UseDeveloperExceptionPage();
 app.UseSwagger();
 app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RedisCacheDemo v1"));
 }
 app.UseHttpsRedirection();
 app.UseRouting();
 app.UseAuthorization();
 app.UseEndpoints(endpoints => {
 endpoints.MapControllers();
 });
 }
 }
}
<पी> चरण 9. वहां ऐप सेटिंग कॉन्फ़िगर करने के लिए एक कॉन्फ़िगरेशन मैनेजर क्लास बनाएं

using Microsoft.Extensions.Configuration;
using System.IO;
namespace RedisCacheDemo {
 static class ConfigurationManager {
 public static IConfiguration AppSetting {
 get;
 }
 static ConfigurationManager() {
 AppSetting = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();
 }
 }
}
<पी> चरण 10. अगला, रेडिस कनेक्शन के लिए एक कनेक्शन हेल्पर क्लास बनाएं।

using StackExchange.Redis;
using System;
namespace RedisCacheDemo.Cache {
 public class ConnectionHelper {
 static ConnectionHelper() {
 ConnectionHelper.lazyConnection = new Lazy < ConnectionMultiplexer > (() => {
 return ConnectionMultiplexer.Connect(ConfigurationManager.AppSetting["RedisURL"]);
 });
 }
 private static Lazy < ConnectionMultiplexer > lazyConnection;
 public static ConnectionMultiplexer Connection {
 get {
 return lazyConnection.Value;
 }
 }
 }
}
<पी> चरण 11. पैकेज मैनेजर कंसोल में निम्नलिखित कमांड का उपयोग करके डीबी निर्माण के लिए माइग्रेशन और डेटाबेस अपडेट करें।

add-migration “FirstMigration”
update-database
<पी> इसलिए, जब आप इस कमांड को दर्ज और निष्पादित करते हैं, तो यह माइग्रेशन से संबंधित कुछ चीजें उत्पन्न करेगा और SQL सर्वर के अंदर डेटाबेस बनाएगा, जैसा कि आप एपसेटिंग.जेसन में कनेक्शन स्ट्रिंग के अंदर डालते हैं।

<पी> चरण 12. अंत में, एप्लिकेशन चलाएं और स्वैगर यूआई का उपयोग करके डेटा जोड़ें और फिर जांचें कि उत्पादों और उत्पाद समापन बिंदु के अंदर कैशिंग कैसे काम करती है।

<पी> मूलतः, मैंने नियंत्रक में उत्पाद और उत्पाद समापनबिंदु में कैश जोड़ा; जैसा कि आप देखते हैं, जब उपयोगकर्ता सभी उत्पादों का डेटा प्राप्त करना चाहता है, तो सबसे पहले, यह जांच करेगा कि डेटा रेडिस कैश के अंदर मौजूद है या नहीं और यदि यह कैश के अंदर मौजूद है तो उस डेटा को उपयोगकर्ता को लौटा दें, और यदि डेटा कैश के अंदर मौजूद नहीं है, तो यह डेटाबेस से डेटा लाएगा और साथ ही, उसे कैश में सेट करेगा। तो अगली बार उपयोगकर्ता को वह कैश से ही मिलेगा और वह अनावश्यक रूप से डेटाबेस पर हमला करने से बच जाएगा

<पी> साथ ही, जब उपयोगकर्ता उत्पाद आईडी का उपयोग करके डेटा प्राप्त करना चाहता है, जैसा कि आप उत्पाद के दूसरे समापन बिंदु में नियंत्रक में देखते हैं, हम सभी उत्पादों के कैश से डेटा लाते हैं और फिर उत्पाद आईडी का उपयोग करके फ़िल्टर करते हैं। यदि वह मौजूद है, तो हम कैश से उपयोगकर्ता के पास लौट आते हैं; यदि नहीं, तो हम डेटाबेस से लाते हैं और फ़िल्टर लागू करने के बाद उपयोगकर्ता के पास वापस आ जाते हैं।

<पी> जैसा कि आप उत्पाद नियंत्रक के अपडेट, डिलीट और पोस्ट एंडपॉइंट के अंदर देखते हैं, हम कैश से उत्पाद कुंजी डेटा को हटाने के लिए रिमूव विधि का उपयोग करते हैं। मेमोरी कैश के कई परिदृश्य और उपयोग हैं जिनका उपयोग आप अपनी आवश्यकताओं और आवश्यकताओं के अनुसार कर सकते हैं। मैं बस रेडिस कैश की बुनियादी बातों से परिचित कराना चाहता हूं और यह .NET कोर के अंदर कैसे काम करता है, जिसे मैंने यहां कवर किया है।

<पी> इसके अलावा, कैशिंग का उपयोग करते समय आपको एक परिदृश्य का ध्यान रखना होगा। मान लीजिए दो उपयोगकर्ता आपके एप्लिकेशन का उपयोग कर रहे हैं। तब निम्नलिखित परिदृश्य घटित होंगे।

  • जब पहला उपयोगकर्ता सभी उत्पादों का डेटा लाने के लिए अनुरोध भेजता है, तो पहला अनुरोध आता है, और फिर यह जांच करेगा कि डेटा कैश के अंदर मौजूद है या नहीं। यदि डेटा कैश के अंदर मौजूद है, तो यह डेटाबेस से डेटा लाएगा और इसे कैश में भी सेट करेगा।
  • इस बीच, दूसरा उपयोगकर्ता उत्पाद विवरण प्राप्त करने के लिए अनुरोध भेजता है। हुआ यह है कि पहले उपयोगकर्ता के अनुरोध को पूरा करने से पहले अनुरोध भी डेटाबेस को हिट करता है, और उसके कारण दूसरा उपयोगकर्ता भी उत्पाद विवरण प्राप्त करने के लिए डेटाबेस को हिट करता है।
  • तो, इसके लिए नीचे दिखाए अनुसार लॉक तंत्र का उपयोग करना एक समाधान है
<पी> क्लास के शीर्ष पर लॉक का यह निजी ऑब्जेक्ट बनाएं।

private static object _lock = new object()
<पी> अगला, जैसा कि मैंने नीचे दिखाया है, प्राप्त विधि को संशोधित करें।

public IEnumerable < Product > Get() {
 var cacheData = _cacheService.GetData < IEnumerable < Product >> ("product");
 if (cacheData != null) {
 return cacheData;
 }
 lock(_lock) {
 var expirationTime = DateTimeOffset.Now.AddMinutes(5.0);
 cacheData = _dbContext.Products.ToList();
 _cacheService.SetData < IEnumerable < Product >> ("product", cacheData, expirationTime);
 }
 return cacheData;
}
<पी> तो यहां, जैसा कि आप देख रहे हैं, सबसे पहले, हम जांचते हैं कि डेटा कैश के अंदर मौजूद है या नहीं। अगर डेटा उपलब्ध है तो उसे वापस कर दें. इसके बाद, यदि मान रेडिस कैश में मौजूद नहीं है, तो हम वहां लॉक लागू करते हैं, और फिर अनुरोध लॉक कर दिया जाता है और अनुभाग में दर्ज किया जाता है, डेटाबेस से उत्पाद विवरण प्राप्त करता है और फिर इसे कैश में सेट करता है और डेटा लौटाता है। So, what happens when the second user sends a request before the user’s request is complete? So, in that case, the second request is in the queue, and after completing the first user request, the second request comes into the picture

<पी> इसके अलावा, आप Redis CLI का उपयोग करके Redis के अंदर पहले से मौजूद मुख्य विवरण देख सकते हैं, जैसा कि नीचे दिखाया गया है

<पी> प्रदर्शन और स्केलेबिलिटी के लिए रेडिस कैशिंग को .NET कोर एपीआई में एकीकृत करना

<पी> तो, यहां आप देख सकते हैं कि कई कमांड हैं जो हमें रेडिस कैश में मौजूद कुंजियों के बारे में जानकारी प्रदान करते हैं।

<पी> यह सब .NET कोर में रेडिस कैश के बारे में है। मुझे उम्मीद है कि आप उससे जुड़ी बातें समझ गए होंगे।

<पी> हैप्पी कोडिंग!


  1. एंड्रॉइड टेक्स्ट व्यू के हिस्से को क्लिक करने योग्य के रूप में कैसे सेट करें? एंड्रॉइड टेक्स्ट व्यू के हिस्से को क्लिक करने योग्य के रूप में कैसे सेट करें?

    यह उदाहरण दर्शाता है कि मैं Android टेक्स्ट व्यू के हिस्से को क्लिक करने योग्य के रूप में कैसे सेट करूं। चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। दूसरा चरण - निम्न कोड को res/layout/activity_main.xml

  1. डेटा संरचना में हफ़मैन पेड़ डेटा संरचना में हफ़मैन पेड़

    परिभाषा हफमैन कोडिंग वर्णों को कोड प्रदान करता है जैसे कि कोड की लंबाई संबंधित वर्ण की सापेक्ष आवृत्ति या वजन पर निर्भर करती है। हफ़मैन कोड चर-लंबाई के होते हैं, और बिना किसी उपसर्ग के (अर्थात कोई भी कोड किसी अन्य का उपसर्ग नहीं होता है)। किसी भी उपसर्ग-मुक्त बाइनरी कोड को पत्तियों पर संग्रहीत एन्को

  1. SAP.net कनेक्टर 3.0 में अपग्रेड किया गया विजुअल स्टूडियो 2008 और 2010 में काम नहीं कर रहा है SAP.net कनेक्टर 3.0 में अपग्रेड किया गया विजुअल स्टूडियो 2008 और 2010 में काम नहीं कर रहा है

    ध्यान दें कि SAP.net कनेक्टर 2.0 कनेक्टर के समान कार्य नहीं करता है। बहुत सारे बदलाव हैं- .net 3.0 संस्करण में अच्छे और बुरे प्रावधान किए गए हैं। यह SAP.net कनेक्टर की सामान्य क्षमताओं के बारे में SAP दस्तावेज़ीकरण लिंक है: https://help.sap.com/saphelp_crm700_ehp02/helpdata/EN/4a/097b0543f4088ce 100