2009-07-31 15 views
12

मैं एक डब्ल्यूपीएफ destop एप्लिकेशन लिख रहा हूं, और बैकएंड के रूप में SQL सर्वर सीई का उपयोग करना चाहता हूं। मैं कुशल डेटा पेजिंग करने के लिए एक अच्छे तरीके से आने की कोशिश कर रहा हूं। एसक्यूएल सर्वर एक्सप्रेस में, मैं ऐसा कुछ कर सकता हूं:एसक्यूएल सर्वर सीई (कॉम्पैक्ट संस्करण) में डेटा पेजिंग

Select ID, FirstName, LastName 
From (SELECT ROW_NUMBER() OVER (ORDER BY ID) 
AS Row, ID, FirstName, LastName 
From TestTable        
) 
WHERE Row > 1 AND Row <= 10  

क्या SQL सर्वर सीई में कुछ तुलनीय है? मुझे पूरी तरह से यकीन नहीं है कि क्या है और समर्थित नहीं है। मैं डेटाबेस से एक समय में केवल 10 पंक्तियां वापस करना चाहता हूं, और सभी डेटा को वापस खींचना नहीं है और फिर उपयोगकर्ता को प्रदर्शित करने के लिए इसे फ़िल्टर करना होगा, क्योंकि यह बहुत धीमा है। धन्यवाद।

+0

नील, मेरे उत्तर पर मेरी टिप्पणी देखें। –

उत्तर

2

ईमानदारी से, शायद सबसे तेज़ चीज SqlCeDataReader का उपयोग करें और कॉल करें() 10 बार। फिर जब उपयोगकर्ता अगले पृष्ठ पर जाता है, तो आप पहले ही 11 वें परिणाम पर इंगित कर रहे हैं, और 10 और पढ़ सकते हैं। यदि आपको पीछे की ओर जाना है, तो आप या तो अपने परिणाम कैश कर सकते हैं या SqlCeResultSet पर स्विच कर सकते हैं जो seeking का समर्थन करता है।

इसके अलावा, SqlCeDataReader/परिणाम अनुभव से, डेस्कटॉप पर डेटाबेस के साथ संवाद करने का सबसे तेज़ तरीका है। डेटासेट/डेटा एडाप्टर का उपयोग करने से यह सचमुच 100 गुना तेज हो सकता है।

+0

क्या SqlCeResultSet डेटाबेस से सेट किए गए परिणाम में सबकुछ वापस खींचता है (जैसे डिस्कनेक्ट किया गया डेटासेट), या क्या यह डेटाबेस से कनेक्शन खोलता है और पंक्तियों को अनुरोध के रूप में पढ़ता है? यदि यह डेटाबेस को खोलने के लिए कनेक्शन छोड़ देता है, तो शायद मैं आवश्यक रिकॉर्ड्स पर कूदने के लिए SqlCeResultSet और ReadAbsolute विधि के संयोजन का उपयोग कर सकता हूं, उन्हें एक सूची में पढ़ सकता हूं, और फिर सूची वापस कर सकता हूं और कनेक्शन बंद कर सकता हूं। – Neil

+1

@Neil, परिणामसेट/डेटा रीडर को लगातार कनेक्शन की आवश्यकता है। वे सभी उद्देश्यों और उद्देश्यों के लिए, बस एक एसक्यूएल कर्सर हैं। विशेष रूप से अच्छा क्या है कि आप टेबल टेबल को पूरी तरह से खोल सकते हैं, इसे एक इंडेक्स दे सकते हैं, और उस इंडेक्स पर खोज सकते हैं और यह * तेज़ * तेज है। –

5

मैं वर्तमान में एक WPF अनुप्रयोग पर काम कर रहा हूं जो स्थिरता तंत्र के रूप में SQL सर्वर सीई का उपयोग करता है। हमारे पास कई (40+) टेबल हैं और उनमें से कुछ बहुत बड़े हैं (50k रिकॉर्ड, कम से कम मेरे मानकों के लिए यह बड़ा है)।

एसक्यूएल सीई में सीधे डेटा पेजिंग के बारे में मेरी सलाह यह है: अगर आप कर सकते हैं तो इससे बचें! मैंने बॉब किंग द्वारा वर्णित दृष्टिकोण का उपयोग किया है, और कम से कम मेरे लिए इसके परिणामस्वरूप बहुत ही बदसूरत कोड, वास्तविक रखरखाव दुःस्वप्न हुआ।

जब तक आपको हजारों रिकॉर्डों से अधिक पेजों की आवश्यकता नहीं होगी, मुझे विश्वास है कि कस्टम वर्गों के संग्रह में और फिर स्मृति में संग्रह के पृष्ठ पर SqlCeDataReader का उपयोग करके उन्हें सभी को लोड करना सबसे अच्छा तरीका है। मुझे यह दृष्टिकोण कैशिंग के साथ भी हर बार SQL क्वेरी को फिर से निष्पादित करने से अधिक उत्तरदायी होने के लिए मिला। क्या हुआ कि मेरे मामले में प्रश्न काफी जटिल थे, और SqlCeDataReader प्रदर्शन काफी अच्छा था ताकि प्रदर्शन हिट लगभग अपरिहार्य हो। यह इंगित करने की कोई आवश्यकता नहीं है कि, पहले बैच लोड के बाद, प्रत्येक पृष्ठ परिवर्तन लगभग तत्काल होता है क्योंकि सब कुछ स्मृति में रखा जाता है।

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

1

कुछ तरीके हैं, लेकिन सबसे साधारण तरीका निम्नलिखित की तरह होगा:

मान लिया जाये कि

  1. पृष्ठ आकार = 10
  2. पृष्ठ = 2

फिर

  1. पहला टॉप = Pa geSize (10)
  2. दूसरा टॉप = PageSize * पृष्ठ (20)

SELECT 
[Page].[ID], 
[Page].[FirstName], 
[Page].[LastName] 
FROM 
(
SELECT TOP (10) 
[FirstRows].[ID], 
[FirstRows].[FirstName], 
[FirstRows].[LastName] 
FROM 
(
SELECT TOP (20) 
    [TestTable].[ID], 
    [TestTable].[FirstName], 
    [TestTable].[LastName] 
FROM 
    [TestTable] 
ORDER BY 
    [TestTable].[ID] ASC 
) AS [FirstRows] 
ORDER BY 
[FirstRows].[ID] DESC 
) AS [Page] 
ORDER BY 
    [Page].[ID] ASC
8

मामले कि किसी यह पेज जवाब की तलाश में ... मैं इस पोस्ट के पार आया तक पहुँच जाता है: के लिए समर्थन एसक्यूएल सर्वर ईस्वी में पेजिंग प्रश्नों 4,0

http://beyondrelational.com/blogs/jacob/archive/2010/07/13/support-for-paging-queries-in-sql-server-ce-4-0.aspx

आशा इस

+0

धन्यवाद लैलाल्टा, एसक्यूएल सर्वर सीई 4.0 उस समय उपलब्ध नहीं था जब मैंने मूल रूप से इस प्रश्न को पोस्ट किया था, लेकिन मुझे लगता है कि यह निश्चित रूप से आगे बढ़ने वाले पेजिंग तक पहुंचने का तरीका होगा। – Neil

1

मैं impl किया मदद करता है एसक्यूएल सीई का उपयोग कर डेटाग्रिड के लिए ईमेंट कस्टम पेजिंग। मैंने उपरोक्त उत्तर में चर्चा के अनुसार चयन कथन में शीर्ष का उपयोग करने और सबक्वायरी का उपयोग करके रिकॉर्ड छोड़ने की विधि लागू की। लेकिन यह छोटी मात्रा में डेटा के साथ अच्छा काम करता है। चूंकि रिकॉर्ड हजारों में बढ़ते हैं, उपर्युक्त पद्धति कम सहायक हो जाती है और प्रदर्शन में धीमी हो जाती है।

मैंने अपनी तकनीक का उपयोग करके खराब प्रदर्शन समस्या हल की। मैंने क्या किया है मैं चर में प्रत्येक पृष्ठ पर पहले और अंतिम रिकॉर्ड की आईडी स्टोर करता हूं।

dim firstRecord=dt.rows(0)("id") 

और

dim lastRecord=dt.Rows(dt.rows.count-1)("id") 

मैं के बाद ग्रिड प्रत्येक पृष्ठ के लिए आबद्ध है इन चरों आरंभ।

यदि उपयोगकर्ता अगले बटन पर क्लिक करता है तो मैं पिछले रिकॉर्डर से अधिक डेटाबेस से शीर्ष (पग्सएज़) रिकॉर्ड प्राप्त करता हूं यदि उपयोगकर्ता पिछले बटन पर क्लिक करता है तो मैं पहले रिकॉर्ड से कम डेटाबेस से शीर्ष (पेजसाइज़) रिकॉर्ड प्राप्त करता हूं। इसके अलावा मैं इस मामले में आईडी desc द्वारा आदेश। और डेटाग्रिड के लिए बाध्यकारी से पहले एटीएटी के लिए डेटाव्यू का उपयोग करके डेटाटेबल को पुन: व्यवस्थित करें।

यह मेरी पेजिंग को सबसे अधिक कुशल बना दिया। हालांकि मुझे रिकॉर्ड्स मामलों को सम्मिलित करने और हटाने के लिए कुछ अतिरिक्त प्रयास करना पड़ा। लेकिन मैं इसे संभालने में सक्षम था।

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