Raw SQL, Stored Procedures और Interpolation
FromSqlRaw, FromSqlInterpolated और stored procedures से raw SQL सुरक्षित रूप से चलाएँ तथा injection से बचें।
Raw SQL, Stored Procedures और Interpolation, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
EF कोर में कच्ची SQL का उपयोग कब करें
अधिकांश क्वेरी LINQ के साथ अच्छी तरह काम करती हैं, लेकिन कुछ स्थितियों में कच्ची SQL आवश्यक होती है: जटिल विश्लेषण, विक्रेता-विशिष्ट फ़ंक्शन, संग्रहीत प्रक्रियाएँ या ऐसी प्रदर्शन-संवेदी क्वेरी जिन्हें LINQ ठीक से अनुवादित नहीं कर पाता।
EF Core सुरक्षा से समझौता किए बिना कच्ची SQL का उपयोग करने के सुरक्षित तरीके उपलब्ध कराता है।
FromSqlRaw: सुरक्षित पैरामीटरयुक्त क्वेरी
FromSqlRaw कच्ची SQL चलाता है और परिणामों को वापस इकाइयों में मैप करता है। SQL इंजेक्शन से बचने के लिए हमेशा {0} प्लेसहोल्डर का उपयोग करें — स्ट्रिंग को कभी जोड़कर न बनाएँ।
// SAFE: parameterized
var products = await _db.Products
.FromSqlRaw("SELECT * FROM Products WHERE Price > {0}", 100m)
.ToListAsync();
// DANGEROUS: never do this
// FromSqlRaw("SELECT * FROM Products WHERE Price > " + price)FromSqlInterpolated: इंटरपोलेटेड सुरक्षा
FromSqlInterpolated C# की इंटरपोलेटेड स्ट्रिंग स्वीकार करता है। EF Core इंटरपोलेट किए गए मानों को स्वचालित रूप से SQL पैरामीटर में बदल देता है — यह सुरक्षित और पढ़ने में सरल है।
decimal minPrice = 100m;
string category = "Electronics";
var products = await _db.Products
.FromSqlInterpolated(
$"SELECT * FROM Products WHERE Price > {minPrice} AND Category = {category}")
.OrderBy(p => p.Name)
.ToListAsync();
// Values become @p0, @p1 parameters automaticallyFromSql के बाद LINQ की रचना
आप FromSql के बाद LINQ ऑपरेटरों को श्रृंखलाबद्ध कर सकते हैं। EF Core आपकी कच्ची SQL को सबक्वेरी में लपेटकर उसके ऊपर LINQ लागू करता है, जिससे फ़िल्टरिंग या पृष्ठांकन जोड़ना उपयोगी हो जाता है।
decimal min = 50m;
var page = await _db.Products
.FromSqlInterpolated($"SELECT * FROM Products WHERE Price > {min}")
.Where(p => p.IsActive) // additional LINQ filter
.OrderBy(p => p.Price)
.Skip(0).Take(20) // pagination
.ToListAsync();
// Generates: SELECT ... FROM (raw SQL) AS p WHERE ...संग्रहीत प्रक्रियाएँ चलाना
इकाई-पंक्तियाँ लौटाने वाली संग्रहीत प्रक्रियाओं को FromSqlRaw के माध्यम से कॉल करें। जो प्रक्रियाएँ पंक्तियाँ नहीं लौटातीं (जैसे INSERT/UPDATE), उनके लिए ExecuteSqlRawAsync का उपयोग करें।
// Stored proc returning Products
var products = await _db.Products
.FromSqlRaw("EXEC GetProductsByCategory {0}", "Books")
.ToListAsync();
// Stored proc with no return rows
await _db.Database.ExecuteSqlRawAsync(
"EXEC ArchiveOldOrders {0}",
DateTime.UtcNow.AddYears(-1));DML के लिए ExecuteSqlInterpolated
ExecuteSqlInterpolated इंटरपोलेटेड स्ट्रिंग की सुरक्षा के साथ DML कथन (INSERT, UPDATE, DELETE) चलाता है। यह प्रभावित पंक्तियों की संख्या लौटाता है।
int days = 30;
int affected = await _db.Database.ExecuteSqlInterpolatedAsync(
$"UPDATE Orders SET Status = 'Expired' WHERE PlacedAt < {DateTime.UtcNow.AddDays(-days)}");
Console.WriteLine($"{affected} orders expired");गैर-इकाई प्रकारों पर क्वेरी करना
ऐसे मनमाने स्केलर या DTO प्रकारों पर क्वेरी करने के लिए SqlQuery<T> (.NET 7+) का उपयोग करें जो EF Core की इकाइयाँ नहीं हैं। DbSet की आवश्यकता नहीं होती।
// Query a DTO directly — no entity needed
var stats = await _db.Database
.SqlQuery<ProductStats>(
$"SELECT Category, COUNT(*) AS Count, AVG(Price) AS AvgPrice FROM Products GROUP BY Category")
.ToListAsync();
public record ProductStats(string Category, int Count, decimal AvgPrice);दृश्यों के लिए बिना-कुंजी वाली इकाई के प्रकार
HasNoKey() और ToView() का उपयोग करके किसी डेटाबेस दृश्य या कच्ची क्वेरी के परिणाम को बिना-कुंजी वाले इकाई प्रकार में मैप करें। प्राथमिक कुंजी की आवश्यकता के बिना, उस पर DbSet की तरह क्वेरी करें।
public class ProductSalesSummary
{
public string Category { get; set; } = "";
public int TotalSold { get; set; }
public decimal Revenue { get; set; }
}
// In OnModelCreating:
modelBuilder.Entity<ProductSalesSummary>()
.HasNoKey()
.ToView("vw_ProductSalesSummary");
// Query:
var summary = await _db.Set<ProductSalesSummary>().ToListAsync();SQL इंजेक्शन की समस्याओं से बचना
सुनहरा नियम: उपयोगकर्ता इनपुट को कभी भी SQL स्ट्रिंग में जोड़कर न बनाएँ। हमेशा FromSqlRaw के प्लेसहोल्डर, FromSqlInterpolated या EF Core के LINQ के माध्यम से पैरामीटरयुक्त क्वेरी का उपयोग करें।
// SAFE
var name = userInput;
var result = await _db.Products
.FromSqlInterpolated($"SELECT * FROM Products WHERE Name = {name}")
.ToListAsync();
// INJECTION RISK (never do this)
// FromSqlRaw("SELECT * FROM Products WHERE Name = '" + name + "'");ADO.NET फ़ॉलबैक के साथ आउटपुट पैरामीटर
EF Core मूल रूप से संग्रहीत प्रक्रिया के आउटपुट पैरामीटर का समर्थन नहीं करता। ऐसी स्थितियों में _db.Database.GetDbConnection() का उपयोग करके ADO.NET पर जाएँ।
await _db.Database.OpenConnectionAsync();
var conn = _db.Database.GetDbConnection();
using var cmd = conn.CreateCommand();
cmd.CommandText = "EXEC GetOrderCount @CustomerId, @Count OUTPUT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@CustomerId", 5));
var outParam = new SqlParameter("@Count", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(outParam);
await cmd.ExecuteNonQueryAsync();
int count = (int)outParam.Value;वास्तविक दुनिया: पूर्ण-पाठ खोज फ़ॉलबैक
LINQ डेटाबेस-विशिष्ट पूर्ण-पाठ खोज की शर्तों को व्यक्त नहीं कर सकता। मूल FREETEXT या टीएसवीक्टर क्षमताओं का लाभ उठाने के लिए FromSqlInterpolated का उपयोग करें।
string query = "keyboard mechanical";
var results = await _db.Products
.FromSqlInterpolated(
$"SELECT * FROM Products WHERE FREETEXT(Name, {query})")
.AsNoTracking()
.Take(20)
.ToListAsync();त्वरित जाँच
पैरामीटरयुक्त क्वेरी के लिए FromSqlInterpolated स्ट्रिंग जोड़ने की तुलना में अधिक सुरक्षित क्यों है?
पुनरावलोकन: EF Core में कच्ची SQL
मुख्य बातें:
FromSqlRaw: {0} प्लेसहोल्डर का उपयोग करें; उपयोगकर्ता इनपुट को कभी न जोड़ेंFromSqlInterpolated: सुरक्षित इंटरपोलेटेड स्ट्रिंग → ADO.NET पैरामीटर- फ़िल्टरिंग, क्रमबद्धता और पृष्ठांकन जोड़ने के लिए FromSql के बाद LINQ ऑपरेटरों को श्रृंखलाबद्ध करें
ExecuteSqlInterpolatedAsync: सुरक्षित DML निष्पादनSqlQuery<T>: गैर-इकाई DTO पर क्वेरी (.NET 7+)- आउटपुट पैरामीटर या जटिल संग्रहीत प्रक्रियाओं के लिए सीधे ADO.NET का उपयोग करें
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Raw SQL, Stored Procedures और Interpolation” पाठ निःशुल्क है?
हाँ—“Raw SQL, Stored Procedures और Interpolation” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Raw SQL, Stored Procedures और Interpolation” में मैं क्या सीखूँगा?
FromSqlRaw, FromSqlInterpolated और stored procedures से raw SQL सुरक्षित रूप से चलाएँ तथा injection से बचें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“Raw SQL, Stored Procedures और Interpolation” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Eager, Lazy और Explicit Loading
- Raw SQL, Stored Procedures और Interpolation
- Compiled Queries और Performance
- Global Query Filters और Owned Entities