2009-06-22 12 views
7

प्रस्तावना:सेट कमांडटाइमआउट को मजबूत टाइप किए गए डेटासेट टेबल एडाप्टर में उपयोग किया जाता है?

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

दृढ़ता से टाइप किए गए डेटासेट का उपयोग करने वाली बड़ी प्रक्रियाओं में से एक अब समय समाप्त हो रहा है ... मेरा इरादा है अगले कुछ महीनों में nHibernate का उपयोग करके पूरी प्रक्रिया को फिर से लिखने के लिए, लेकिन इस पल के लिए मुझे समय-समय पर परिवर्तन करने की आवश्यकता है ताकि हमारे उपयोगकर्ताओं को प्रक्रिया का उपयोग करने की अनुमति मिल सके, हालांकि धीरे-धीरे ... दुर्भाग्यवश माइक्रोसॉफ्ट ने कमांडटाउट विधियों को निजी बना दिया ताकि मैं एक्सेस नहीं कर सकूं उन्हें सीधे।

एकमात्र समाधान मैं भर में अब तक आए हैं प्रत्येक TableAdapter के लिए एक आंशिक वर्ग बना सकते हैं और वहाँ टाइमआउट तरीकों में शामिल करने के लिए ... है

यह काफी भद्दा के रूप में यह काफी के लिए आंशिक वर्गों को जोड़ने का मतलब होगा है कुछ TableAdapters ...

किसी को भी इसे संभालने के लिए एक और अधिक प्रभावी तरीका पता है?

उत्तर

2

आप यह नहीं कहते कि आप किस भाषा का उपयोग कर रहे हैं।

Namespace AdventureWorksPurchasingDSTableAdapters 
    Partial Public Class SalesOrderHeaderTableAdapter 
    Public Property SelectCommandTimeout() As Integer 
     Get 
     Return Adapter.SelectCommand.CommandTimeout 
     End Get 
     Set(ByVal value As Integer) 
     Adapter.SelectCommand.CommandTimeout = value 
     End Set 
    End Property 
    End Class 
End Namespace 
+0

ठीक है, लेकिन यह है कि मैं क्या करने से बचने की कोशिश कर रहा हूं ... व्यक्तिगत रूप से ऐसा करना आसान है ... यदि आपके पास कई सौ डेटासेट के लिए कई सौ टेबल एडेप्टर हैं तो यह वास्तव में बहुत व्यवहार्य नहीं है। – Gary

+0

मैं नहीं सोच सकता कि आप और क्या कर सकते हैं। कोई वैश्विक कमांडटाइमआउट संपत्ति नहीं है। यदि वहां थे, तो फिर भी किसी भी तरह से व्यक्तिगत SqlCommand.CommandTimeout गुणों को सेट करना होगा। –

+0

कोई डेटासेट डिज़ाइनर में कमांडटाइमआउट संपत्ति को समायोजित क्यों नहीं कर सकता है? और यह अभी भी 30 सेकंड क्यों है जब मैं कनेक्शन टाइमआउट 300 सेकंड में बदलता हूं? बीटीडब्ल्यू, इनमें से क्या अंतर है? अग्रिम धन्यवाद ... –

2

ठीक है, अब तक के रूप में मैं यह बता सकें कि इन स्थितियों के लिए कोई शॉर्टकट/वैकल्पिक हल है: निम्नलिखित के बाद से मैं पहली बार इस तरह के एक उदाहरण खोजने के लिए हुआ VB.NET में है। कोशिश करने के लिए जॉन के लिए धन्यवाद।

मेरे सबसे अच्छा सलाह त्वरित और गंदी प्रोटोटाइप के बाहर एमएस डेटासेट का उपयोग नहीं करते ... जब आपके आवेदन बढ़ता है और विस्तार किया जा करने के लिए आप केवल गंदा बाईं :)

+0

यह एक काफी संकीर्ण आधार है जिस पर टाइप किए गए डेटासेट की निंदा करना है। हालांकि, कनेक्ट पर एक फीचर सुझाव के लिए यह एक अच्छा आधार है (http://connect.microsoft.com/visualstudio/)। एक बार जब आप सुझाव पोस्ट कर लेंगे, तो इस उत्तर को सुझाव के यूआरएल के साथ संपादित करें, ताकि अन्य लोग वोट दे सकें कि हम कितना महत्वपूर्ण महसूस करते हैं। –

+0

खैर, यह समस्या उस कथन का एकमात्र आधार नहीं है ... डेटासेट के साथ मेरे पास सबसे बड़ा मुद्दा बुद्धिमान डिफ़ॉल्ट की कमी है ... यदि आपकी कॉन्फ़िगरेशन फ़ाइल में सही कनेक्शन स्ट्रिंग नहीं है तो यह जो भी कनेक्शन स्ट्रिंग के साथ बनाया गया था, उसके लिए डिफ़ॉल्ट ... उस मुद्दे पर मेरा आंत महसूस करना है कि किसी भी परिस्थिति में जहां कोई अस्पष्टता है तो एकमात्र सही प्रतिक्रिया अपवाद फेंकना और मरना है ... – Gary

+0

मैं सुझाव दूंगा बाद में कनेक्ट करने पर, मैं आपके सुझाव को अनदेखा नहीं कर रहा था :) – Gary

3

मैं "हल" मिल गया है की जरूरत है यह प्रतिबिंब का उपयोग कर। (VS2010 मॉडल Adapter संपत्ति उजागर की अनुमति देता है, SelectCommand, आदि, null पहले GetData लिए, उदाहरण के लिए किया जाएगा।)

"बदसूरत कोड लेकिन कार्यात्मक कोड" मैं वर्तमान में उपयोग कर रहा हूँ:

void SetAllCommandTimeouts(object adapter, int timeout) 
{ 
    var commands = adapter.GetType().InvokeMember(
      "CommandCollection", 
      BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, 
      null, adapter, new object[0]); 
    var sqlCommand = (SqlCommand[])commands; 
    foreach (var cmd in sqlCommand) 
    { 
     cmd.CommandTimeout = timeout; 
    } 
} 

// unfortunately this still requires work after a TableAdapter is obtained... 
var ta = new MyTableAdapter(); 
SetAllCommandTimeouts(ta, 120); 
var t = ta.GetData(); 

सामान्य आधार/इंटरफेस की कमी के कारण एडाप्टर को बेहतर टाइप करना संभव नहीं है (हालांकि शायद Component पर)।

हैप्पी कोडिंग।

+0

मेरी समस्या को ठीक करने में बहुत मददगार है। :) –

0

मैंने इस समस्या को आसानी से हल किया। मैं अपने डेटासेट के डिजाइनर कोड (dataset1.designer.vb) में गया और निम्न आदेश, Me._commandCollection(0), Me._commandCollection(1) से Me._commandCollection(5) पाया, क्योंकि मेरे पास मेरे SQL सर्वर 2008 डेटाबेस के विरुद्ध निष्पादित कुल पांच आदेश हैं। इन आदेशों में से प्रत्येक (0 से 5) में मैंने Me._commandCollection(0).CommandTimeout = 60 लिखा, जहां मैं चार अन्य आदेशों के लिए अगली संख्या में 0 को बदलता हूं। प्रत्येक पांच आदेशों में से प्रत्येक कोड का एक ब्लॉक होता है, जिसमें से दो उदाहरण आपको उदाहरण प्रदान करने के लिए नीचे दिखाई देते हैं।

Me._commandCollection = New Global.System.Data.SqlClient.SqlCommand(5) {} 

Me._commandCollection(0) = New Global.System.Data.SqlClient.SqlCommand() 

Me._commandCollection(0).Connection = Me.Connection 

Me._commandCollection(0).CommandTimeout = 60 

Me._commandCollection(0).CommandText = "SELECT MK_QR_SUB_AND_DETAIL.*" & _ "Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10)" & _ "FROM MK_QR_SUB_AND_DETAIL" 

Me._commandCollection(0).CommandType = Global.System.Data.CommandType.Text  

Me._commandCollection(1) = New Global.System.Data.SqlClient.SqlCommand() 

Me._commandCollection(1).Connection = Me.Connection 

Me._commandCollection(1).CommandTimeout = 60 

Me._commandCollection(1).CommandText = "dbo.spQtrRptTesting_RunInserts_Step1of4" 

Me._commandCollection(1).CommandType = Global.System.Data.CommandType.StoredProcedure 

Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@RETURN_VALUE", Global.System.Data.SqlDbType.Int, 4, Global.System.Data.ParameterDirection.ReturnValue, 10, 0, Nothing, Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", "")) 

Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@pStartADate", Global.System.Data.SqlDbType.[Date], 3, Global.System.Data.ParameterDirection.Input, 10, 0, Nothing, Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", "")) 

Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@pEndADate", Global.System.Data.SqlDbType.[Date], 3, Global.System.Data.ParameterDirection.Input, 10, 0, Nothing, Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", "")) 

Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@pStartBDate", Global.System.Data.SqlDbType.[Date], 3, Global.System.Data.ParameterDirection.Input, 10, 0, Nothing, Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", "")) 

Me._commandCollection(1).Parameters.Add(New Global.System.Data.SqlClient.SqlParameter("@pEndBDate", Global.System.Data.SqlDbType.[Date], 3, Global.System.Data.ParameterDirection.Input, 10, 0, Nothing, Global.System.Data.DataRowVersion.Current, False, Nothing, "", "", "")) 
+0

चेतावनी: मैन्युअल रूप से 'डिजाइनर' फ़ाइलों को कभी भी संपादित न करें। यह स्वचालित रूप से जेनरेट कोड होता है, जो कुछ भी आप लिखते हैं उसे विजुअल स्टूडियो द्वारा ओवरराइट किया जा सकता है जब यह कोड को पुन: उत्पन्न करेगा। –

0

मैं DataSet.cs फ़ाइल जो TableAdapter कक्षाएं निकला है और निर्माता में यह commandtimeouts के लिए App.config की जाँच करता है में एक नया वर्ग बनाने का फैसला किया गया है। मैं एक विशिष्ट तालिका एडाप्टर के लिए कमांड टाइम निर्दिष्ट करने की क्षमता भी जोड़ता हूं और यदि वह मौजूद नहीं है, तो वैश्विक मान की जांच करें।

public class ImprovedMyTableAdapter : MyTableAdapter 
{ 
    public ImprovedMyTableAdapter() 
     : base() 
    { 
     int parsedInt = int.MinValue; 
     string appSettingValue = System.Configuration.ConfigurationManager.AppSettings["MyTableAdapter_CommandTimeout"]; 
     if (string.IsNullOrEmpty(appSettingValue)) 
      appSettingValue = System.Configuration.ConfigurationManager.AppSettings["CommandTimeout"]; 
     if (!string.IsNullOrEmpty(appSettingValue) && int.TryParse(appSettingValue, out parsedInt)) 
     { 
      foreach (var command in this.CommandCollection) 
       command.CommandTimeout = parsedInt; 
     } 
    } 
} 
0

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

फिर कमांडकोलेक्शन के माध्यम से लूप करें और टाइमआउट तर्क में पारित होने के लिए टाइमआउट सेट करें।

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