2012-06-05 12 views
8

मैं एक customquery जो डेटाबेस में कहीं बचाया जा wil पर अमल करने की जरूरत है और मैं इसे एक datatable, या डेटासेट में लौट सकते हैं और एक gridview जो सच को autogenerate कॉलम होगा करने के लिए इसे बाध्य करने के लिए की जरूरत है।इकाई ढांचे के साथ कस्टम एसक्यूएल निष्पादित करें?

मेरे सभी डेटा एक्सेस परत इकाई ढांचे के साथ सही काम करता है, लेकिन कुछ विशिष्ट परिदृश्य के लिए मैं ऐसा करने की जरूरत है और मैं एफई यह किसी भी तरह से कर सकते हैं अगर

उत्तर

8

आश्चर्य है कि अगर मैं इकाई ढांचे के साथ ado.net संयोजित करना चाहिए, या यदि आपका लक्ष्य ADO.NET संरचनाओं (डेटाटेबल या डेटासेट) को वापस करना है, तो क्लासिक ADO.NET का उपयोग करें। आप इसे एक इकाई सेट करने के लिए डेटा के लिए बाध्य करने की कोशिश कर और फिर एक DataTable या डेटासेट खुद को आबाद करने की तुलना में आसान मिल जाएगा।

हालांकि, अगर आप वास्तव में और सही मायने में रुचि रखते EntityFramework के माध्यम से एक कस्टम क्वेरी चल रहे हैं, ExecuteQuery पर एक नज़र डालें। यह आपको एक SQL क्वेरी निष्पादित करने की अनुमति देता है और परिणाम को आपके मॉडल में परिणामों को वापस देखता है। यह आपके अंश पर IENumerable परिणाम लेने के लिए एक अभ्यास होगा और इसे डेटाटेबल या डेटासेट पर मैप करेगा। इसलिए मेरे मूल जवाब "बस अच्छे ओल के साथ ऐसा करें" एडीओ.NET विधियों का बना। " फ्रेमवर्क

16

इकाई के लिए 5 उपयोग

context.Database.SqlQuery


और इकाई के लिए फ्रेमवर्क 4 निम्नलिखित कोड का उपयोग

context.ExecuteStoreQuery


public string BuyerSequenceNumberMax(int buyerId) 
    { 
     string sequenceMaxQuery = "SELECT TOP(1) btitosal.BuyerSequenceNumber FROM BuyerTakenItemToSale btitosal " + 
            "WHERE btitosal.BuyerID = " + buyerId + 
            "ORDER BY CONVERT(INT,SUBSTRING(btitosal.BuyerSequenceNumber,7, LEN(btitosal.BuyerSequenceNumber))) DESC"; 

     var sequenceQueryResult = context.Database.SqlQuery<string>(sequenceMaxQuery).FirstOrDefault(); 

     string buyerSequenceNumber = string.Empty; 

     if (sequenceQueryResult != null) 
     { 
      buyerSequenceNumber = sequenceQueryResult.ToString(); 
     } 

     return buyerSequenceNumber; 
    } 

वापसी के लिए एक सूची निम्नलिखित कोड

public List<PanelSerialList> PanelSerialByLocationAndStock(string locationCode, byte storeLocation, string itemCategory, string itemCapacity, byte agreementType, string packageCode) 
{ 
     string panelSerialByLocationAndStockQuery = "SELECT isws.ItemSerialNo, im.ItemModel " + 
     "FROM Inv_ItemMaster im " + 
     "INNER JOIN " + 
     "Inv_ItemStockWithSerialNoByLocation isws " + 
     " ON im.ItemCode = isws.ItemCode " + 
     "  WHERE isws.LocationCode = '" + locationCode + "' AND " + 
     " isws.StoreLocation = " + storeLocation + " AND " + 
     " isws.IsAvailableInStore = 1 AND " + 
     " im.ItemCapacity = '" + itemCapacity + "' AND " + 
     " isws.ItemSerialNo NOT IN (" + 
     "   Select sp.PanelSerialNo From Special_SpecialPackagePriceForResale sp " + 
     "   Where sp.PackageCode = '" + packageCode + "')"; 



    context.Database.SqlQuery<PanelSerialList>(panelSerialByLocationAndStockQuery).ToList(); 


} 
+7

के लिए आप सुनिश्चित नहीं है कि तुम सब आदानों स्वच्छ किया है, तो उपयोग एसक्यूएल के लिए एसक्यूएल इंजेक्शन हमलों को रोकने के लिए पैरामीटर। –

9

का उपयोग यहाँ एक और आयाम और आसान तरीका है। अपने इकाई की रूपरेखा संदर्भ का उपयोग कर एसक्यूएल कनेक्शन प्राप्त करें:

var connection = (System.Data.SqlClient.SqlConnection) _db.Database.Connection; 

if (connection != null && connection.State == ConnectionState.Closed) 
{ 
    connection.Open(); 
} 

var dt = new DataTable(); 

using (var com = new System.Data.SqlClient.SqlDataAdapter("Select * from Table", connection)) 
{ 
    com.Fill(dt); 
} 

और हम DataAdapter या किसी अन्य क्लासिक विधि का उपयोग कर सकते एफई कनेक्शन का उपयोग कर प्रश्नों पर अमल करने। जब हम गतिशील रूप में कुछ करने

यह बहुत उपयोगी हो जाएगा और जब हम एक इकाई के लिए नक्शे नहीं कर सकते। उदाहरण के लिए हम डेटाटेबल में चीजें प्राप्त कर सकते हैं।

उपरोक्त सिंटेक्स ईएफ 5.0 के लिए है।

2

मैं EF6 का उपयोग करें और एक दिन मैं गतिशील एसक्यूएल स्ट्रिंग निष्पादित और DataTable प्राप्त करने के लिए जिस तरह से की जरूरत है। सबसे पहले मैं केवल SqlConnection करने के लिए DbContext.Database.Connection डाली और पूरे काम किया है। यह परीक्षणों के लिए काम करता था, लेकिन आवेदन तोड़ दिया गया था, क्योंकि झलक, जिसका हम उपयोग करते हैं, DbConnection के प्रकार Glimpse.Ado.AlternateType.GlimpseDbConnection के साथ स्वयं कार्यान्वयन इंजेक्ट करता है। मुझे दृष्टिकोण की आवश्यकता है जो डीबीकनेक्शन के स्वतंत्र रूप से काम करता है।अंत में मैं निम्नलिखित कोड के साथ अंत:

public class SqlDataProvider : ISqlDataProvider 
{ 
    private readonly DbContext _context; 

    public SqlDataProvider(DbContext context) 
    { 
     _context = context; 
    } 

    public DataTable GetDataTable(string sqlQuery) 
    { 
     try 
     { 
      DbProviderFactory factory = DbProviderFactories.GetFactory(_context.Database.Connection); 

      using (var cmd = factory.CreateCommand()) 
      { 
       cmd.CommandText = sqlQuery; 
       cmd.CommandType = CommandType.Text; 
       cmd.Connection = _context.Database.Connection; 
       using (var adapter = factory.CreateDataAdapter()) 
       { 
        adapter.SelectCommand = cmd; 

        var tb = new DataTable(); 
        adapter.Fill(tb); 
        return tb; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new SqlExecutionException(string.Format("Error occurred during SQL query execution {0}", sqlQuery), ex); 
     } 
    } 

और यह किसी भी मामले के लिए काम करता है: परीक्षण जहां DbContext.Database.ConnectionSqlConnection और Glimpse.Ado.AlternateType.GlimpseDbConnection

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^