2011-03-30 16 views
6

मैं एक SQL डेटाबेस के रूप में नीचे में एक Windows Forms रूप से डेटा डालने हूँ:एक एसक्यूएल तालिका में डेटा को कई बार सम्मिलित करना, विंडोज पर एक बटन से फॉर्म्स

public partial class Form1 : Form 
{ 
    SqlConnection c = new SqlConnection(); 
    string q = "Trusted_Connection = true; "; 

    public Form1() 
    { 
     InitializeComponent(); c.ConnectionString = q; 
     MessageBox.Show("Connecting Database"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string w = "insert into checkmultiuser(username) values (@username)"; 

     SqlCommand cmd = new SqlCommand(w, c); 
     cmd.Parameters.Add("@username", SqlDbType.VarChar); 
     cmd.Parameters["@username"].Value = textBox1.Text; 
     cmd.ExecuteReader(); 
    } 

लेकिन, जब मैं बटन को फिर से क्लिक करें, तो यह कहता है "इस कमांड से पहले से ही एक खुला डेटा रीडर है जो पहले बंद होना चाहिए।"

मैं इसके साथ कैसे निपटूं?

* अद्यतन:

private void button1_Click(object sender, EventArgs e) 
{ 
    **c.Open();** 

    string w = "insert into checkmultiuser(username) values (@username)"; 

    SqlCommand cmd = new SqlCommand(w, c); 

    cmd.Parameters.Add("@username", SqlDbType.VarChar); 
    cmd.Parameters["@username"].Value = textBox1.Text; 
    //cmd.ExecuteNonQuery(); 
    cmd.ExecuteReader(); 
    **c.Close();** 
} 

अपनी कमियां क्या हैं: * मैं के रूप में नीचे दिए गए बटन क्लिक करें घटना कोड बदल गए हैं? एक होगा कि जब बटन क्लिक किया जाता है तो बार-बार कनेक्शन खोला और बंद हो जाता है।

+0

में अपने कनेक्शन बंद, कृपया पूरी तरह से निकाल cmd.ExecuteReader() लाइन और cmd.ExecuteNonQuery() लाइन uncomment। –

उत्तर

11

एक पाठक को एक खुले कनेक्शन की आवश्यकता होती है क्योंकि आप एक बार में परिणाम पुनर्प्राप्त करते हैं। आप आवेषण, हटाना और अपडेट के लिए ExecuteNonQuery() करना चाहेंगे। आपको बाद में अपना कनेक्शन बंद करने की भी आवश्यकता है। विकल्प यदि आप एकाधिक प्रविष्टियां करने की योजना बनाते हैं तो अपने आवेषण को लूप में लपेटना है।

कुछ तरीके हैं जो आप कर सकते हैं। इस तरह से उपयोगी है जब आप पर एक ही कनेक्शन वस्तु और कमांड वस्तु और फिर पुन: उपयोग करने की योजना:

public partial class Form1 : Form 
{ 
    SqlConnection _cn; 
    SqlCommand _cmd; 

    const string ConnString = "Enter your connection string here"; 
    readonly string _insertQuery; 
    const string UsernameParm = "@username"; 

    public Form1() 
    { 
     InitializeComponent(); 
     _cn = new SqlConnection(ConnString); 

     _cmd = new SqlCommand(InsertQuery, _cn);   
     _cmd.Parameters.Add(UsernameParm, SqlDbType.VarChar); 

     _insertQuery = String.Format("INSERT INTO checkmultiuser(username) VALUES ({0})", 
            UsernameParm); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    {   
     _cmd.Parameters[UsernameParm].Value = textBox1.Text; 

     try 
     { 
      _cn.Open(); 
      _cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) // probably best to catch specific exceptions 
     { 
      // handle it 
     } 
     finally 
     { 
      _cn.Close(); 
     } 
    } 
} 

बस कनेक्शन और आदेश वस्तुओं के निपटान के लिए सुनिश्चित हो (जब प्रपत्र बंद कर देता है या जहां कभी बनाता है आपके आवेदन के लिए सबसे अधिक समझ)।

का उपयोग करते हुए ब्लॉक एक सुरक्षित विकल्प हैं, लेकिन वे वस्तु के प्रत्येक समय निपटाने होगा (हालांकि कनेक्शन डिफ़ॉल्ट रूप से कनेक्शन पूलिंग का उपयोग करें):

public partial class Form1 : Form 
{ 
    const string ConnString = "Enter your connection string here"; 
    readonly string _insertQuery; 
    const string UsernameParm = "@username"; 

    public Form1() 
    { 
     InitializeComponent();    

     _insertQuery = String.Format("INSERT INTO checkmultiuser(username) VALUES ({0})", 
            UsernameParm); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     using (var cn = new SqlConnection(ConnString)) 
     { 
      using (var cmd = new SqlCommand(InsertQuery, cn)) 
      { 
       cmd.Parameters.Add(UsernameParm, SqlDbType.VarChar); 
       cmd.Parameters[UsernameParm].Value = textBox1.Text; 

       cn.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 

कोई भी संयोजन के रूप में अच्छी तरह से काम करेगा। आप कनेक्शन को एक बार सेटअप कर सकते हैं और कमांड ऑब्जेक्ट को एक प्रयोग ब्लॉक में लपेट सकते हैं। मुझे पता है कि कुछ लोग ब्लॉक का उपयोग करके घोंसले के प्रशंसकों नहीं हैं (आखिरकार दृश्यों के पीछे (आखिरकार कोशिश करें))।

+3

इसके अलावा, उसे 'SqlCommand' को 'उपयोग' में डालकर बंद करना चाहिए। –

+0

कुछ कोड उदाहरणों के साथ अपडेट किया गया, जिनमें से एक उपयोग कथन दिखाता है। –

+0

@Jason डाउन: धन्यवाद अपने महान उत्तर के लिए एक बहुत महोदय, भी, पाठक हर बार यह एक मेज से एक पंक्ति को पुन: प्राप्त करने की जरूरत है कनेक्शन खोलने की कोशिश करता है करता है? – sqlchild

1

सबसे पहले, आपको ExecuteNonQuery का उपयोग INSERTS, UPDATES और DELETE को संभालने के लिए करना चाहिए। ExecuteNonQuery का उपयोग तब किया जाता है जब आप डेटाबेस से मूल्य की अपेक्षा नहीं कर रहे हैं।

लेकिन यदि आप वास्तव में किसी अन्य स्थिति में डेटा रीडर का उपयोग करना चाहते हैं, तो आपको इसका उपयोग नीचे दिखाए जाने जैसा करना चाहिए।

using (SqlDataReader reader= cmd.ExecuteReader()) 
{ 
     while (reader.Read()) 
     { 
      //Do the reading 
     } 
} 

यह सुनिश्चित करता है कि SqlDataReader बंद कर दिया जाता है, एक बार इरादा काम किया जाता है।

एक और संभावित यह आपकी कनेक्शन स्ट्रिंग में set MARS (Multiple Active Result Sets) to true पर ठीक करता है।

0

आप कोशिश कर सकते हैं:

cmd.ExecuteReader(CommandBehavior.CloseConnection); 
2

क्या जेसन ने कहा।

जबकि आप वहां हैं, यह शायद करने के लिए थोड़ा अपने कोड को बदलने के लायक हो सकता है:

private void button1_Click(object sender, EventArgs e) 

{ 
    string w = "insert into checkmultiuser(username) values (@username)"; 
    c.Open(); 
    using (SqlCommand cmd = new SqlCommand(w, c)) 
    { 
    cmd.Parameters.Add("@username", SqlDbType.VarChar); 
    cmd.Parameters["@username"].Value = textBox1.Text; 
    cmd.ExecuteNonQuery(); 
    } 

} 

वस्तुओं को सही ढंग से निपटाया जाता है सुनिश्चित करने के लिए।

शायद भी एक try{} ब्लॉक में रख सकता है, और अद्यतन कोड में finally{ c.Close();}

+0

महोदय, उस मामले में मैं अपने कोड में संशोधन किया है | बहुत जेसन, जो अब जवाब के रूप में चिह्नित किया गया है के समान होने के लिए मेरी पोस्ट – sqlchild

+0

@sqlchild का अद्यतन भाग देखें। खुशी है कि तुम मिल गया यह हल कर :) – SeeSharp

+0

साहब, अगर मैं एक का चयन करें आदेश यहाँ का उपयोग करें, तो मैं एक डेटासेट शो डेटा उपयोगकर्ता के लिए जब वह डेटाबेस से सीधे बटन क्लिक करता है का उपयोग होना चाहिए के रूप में यह कट माहौल है, या? जो तेज और बेहतर होगा? – sqlchild

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