2012-02-08 16 views
5

मैंने एक बहुत छोटा सी # प्रोग्राम लिखा है, जो कुछ सीखने के लिए पूरी तरह से एक छोटे से छोटे SQL सर्वर डेटाबेस का उपयोग करता है, & परीक्षण उद्देश्यों के लिए। डेटाबेस का उपयोग इस एक नई परियोजना में और कहीं और नहीं किया जाता है। हालांकि, मुझे डीबग चलाने के दौरान समस्याएं आ रही हैं जहां प्रोग्राम नहीं चलेगा, क्योंकि डेटाबेस "किसी अन्य प्रक्रिया द्वारा उपयोग किया जा रहा है"।डाटाबेस का उपयोग दूसरी प्रक्रिया द्वारा किया जा रहा है ... लेकिन क्या प्रक्रिया है?

अगर मैं अपनी मशीन रीबूट करता हूं, तो यह फिर से काम करेगा, और उसके बाद कुछ टेस्ट रनों के बाद मुझे एक ही समस्या मिल जाएगी।

मुझे इंटरनेट पर कई समान समस्याएं मिली हैं, लेकिन इस समस्या को हल करने के तरीके के बारे में कोई निश्चित उत्तर नहीं मिल सकता है। सबसे पहले, मैं कैसे पता लगा सकता हूं कि "अन्य प्रक्रिया" मेरे .mdf & .ldf फ़ाइलों का उपयोग कर रही है? फिर, मैं इन फ़ाइलों को & जारी करने के लिए समय के बाद समय के बाद इस समय को रोकने के लिए कैसे प्राप्त करूं?!

मैं वीएस -2010, एसक्यूएल सर्वर & सी # के लिए नया हूं, इसलिए कृपया मुझे दिए गए किसी भी जवाब में काफी वर्णनात्मक रहें !!!

यह मेरा कोड है, जैसा कि आप देख सकते हैं, आपको कुछ और बुनियादी नहीं मिल सका, मुझे निश्चित रूप से इतनी सारी समस्याओं में भाग नहीं लेना चाहिए !!!

namespace MySqlTest 
{ 
    public partial class Form1 : Form 
    { 
     SqlConnection myDB = new SqlConnection(@"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\SqlTestDB.mdf;Initial Catalog=MySqlDB;Integrated Security=True"); 
     SqlDataAdapter myDA = new SqlDataAdapter(); 
     SqlCommand mySqlCmd = new SqlCommand(); 

     string mySQLcmd; 
     int myCount; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
      //Open SQL File 
      myDB.Open(); 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      myCount++; 
      MessageBox.Show("myCount = " + myCount.ToString()); 
      //Insert Record Into SQL File 
      mySqlCmd.Connection = myDB; 
      mySqlCmd.CommandText = "INSERT INTO Parent(ParentName) Values(myCount)"; 
      myDA = new SqlDataAdapter(mySqlCmd); 
      mySqlCmd.ExecuteNonQuery(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      //Read Record From SQL File 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      //Read All Records From SQL File 
     } 

     private void button5_Click(object sender, EventArgs e) 
     { 
      //Delete Record From DQL File 
     } 

     private void button6_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
      //Close SQL File 
      myDB.Close(); 
      MessageBox.Show("myDB state = " + myDB.State.ToString()); 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      //Quit 
      this.Close(); 
     } 
    } 
} 
+0

क्या आपको पहली बार अपना एप्लिकेशन चलाने पर एक ही त्रुटि संदेश मिला? अगर आपको दूसरी बार यह त्रुटि मिलती है, तो मुझे लगता है कि आपका एप्लिकेशन डीबी कनेक्शन को ठीक से बंद नहीं करता है। –

+1

जब मैं पहली बार प्रोग्राम चलाता हूं, यह ठीक काम करता है, और काम जारी रहता है, लेकिन मैं कभी-कभी इसे बिना किसी तर्क के प्रोग्राम को डीबगिंग और रोक रहा हूं। ऐसा लगता है कि यह एक नियमित बिंदु नहीं है, जिस पर यह शुरू होता है, लेकिन हो सकता है कि यह डीबी बंद किए बिना डीबग को रोकने से जुड़ा हुआ हो। क्या वीएस -2010 उस संभाल नहीं करेगा?! –

उत्तर

6

सबसे अधिक संभावना विकल्प:

  1. पिछले (दुर्घटनाग्रस्त हो गया) अपने कार्यक्रम
  2. दृश्य स्टूडियो के कहने

आप कर सकते हैं (एक टेबल डिजाइनर खुला या कुछ इसी तरह के साथ) चेक 1) टास्कमेनर के साथ और 2) सर्वर एक्सप्लोरर में देखकर। आपके डीबी को 'बंद' अर्थात् एक छोटा लाल क्रॉस दिखाना चाहिए।

और आपको कनेक्शन को बंद करने के लिए अपने कोड को फिर से लिखना चाहिए। कोशिश करें/अंत में या using(){ } ब्लॉक का उपयोग करें।

+0

ठीक है, मेरे कोड को फिर से लिखने के संबंध में, यही कारण है कि इस छोटे कार्यक्रम के लिए, ताकि मैं अपने वास्तविक कार्यक्रम में उपयोग के लिए अपने SQL-Server प्रसंस्करण को कोड करने के लिए सबसे अच्छा तरीका जान सकूं !! सेवर एक्सप्लोरर में मेरे डीबी में लाल क्रॉस है, लेकिन मुझे अभी भी त्रुटि संदेश मिल रहे हैं। –

0

प्रक्रिया की सूची देखने के लिए sp_who2 चलाने का प्रयास करें।

FYI करें: यदि आप अपने मशीन, सबसे खराब स्थिति, पुनः आरंभ एसक्यूएल सर्वर सेवा

+0

मैं इसे थोड़ी देर में कोशिश करूंगा, बच्चों को स्कूल से अभी इकट्ठा करना होगा ... यदि आप सही हैं तो मुझे बहुत समय बचाएगा !!! –

+0

ठीक है, हमें बताएं :) – Diego

+0

ठीक है, वीएस -2010 मुझे एक नई क्वेरी नहीं खोलने देगा, "भौतिक फाइल खोलने में असमर्थ ..... ऑपरेटिंग सिस्टम त्रुटि 32:" 32 (इसके लिए टेक्स्ट पुनर्प्राप्त करने में विफल त्रुटि। कारण: 15105)। फाइल के लिए स्वत: नामित डेटाबेस संलग्न करने का प्रयास ..... असफल रहा।एक ही नाम वाला डेटाबेस मौजूद है, या निर्दिष्ट फ़ाइल खोला नहीं जा सकता है, या यह यूएनसी शेयर पर स्थित है। ", इसलिए मैंने SQL सर्वर प्रबंधन स्टूडियो में sp_who2 चलाया और 31 परिणाम प्राप्त हुए, जिनमें से केवल नीचे 2 डेटाबेस इस डेटाबेस के लिए प्रासंगिक प्रतीत होता है , यानी उनके पास डीबीएनएएम कॉलम में MySqlDB है। –

0

IIRC AttachDbFilename अप spins एक SqlServr.exe प्रक्रिया उपयोगकर्ता के तहत चल खाते को अपने प्रक्रिया का उपयोग कर रहा है का उपयोग कर, SqlServer उदाहरण से अलग रिबूट की जरूरत नहीं है एक सेवा के रूप में चल रहा है (इसलिए MsSqlServer सेवा को रोकना इस समस्या को रोकता नहीं है)। एक गंदे निकास के मामले में, कभी-कभी यह प्रक्रिया साफ़ नहीं होती है। मुझे संदेह है कि इस प्रक्रिया को मारने से डीबी फाइलें मुक्त हो जाएंगी।

+0

नीचे दिए गए मेरे उत्तरों के अनुसार, हत्याओं की प्रक्रियाओं ने अब तक मदद नहीं की है ... –

+0

मुझे सेवाओं में जाना और MSSQLSERVER ढूंढना था, स्टार्ट विकल्प को बदलना मैन्युअल, फिर भौतिक रूप से इसे रोकें ... केवल तब से, क्या मैं bin \ debug फ़ोल्डर में फ़ाइलों को हटाने में सक्षम था !!! मैंने स्टार्ट विकल्प को स्वचालित रूप से स्वचालित रूप से बदल दिया और सेवा शुरू की, और अंत में, यह सब फिर से काम कर रहा है !!! अब मुझे यह पता लगाना है कि यह क्यों हो रहा है और इसे फिर से होने से रोकने के लिए ... –

0

माइक्रोसॉफ्ट में एक तकनीकी फेलो मार्क रसेलिनोविच द्वारा लिखित Process Explorer का उपयोग करने का प्रयास करें। यह विंडोज एडमिन्स/डेवलपर्स की जेब में एक मानक स्विस-आर्मी टूल है। यह आपको दिखा सकता है कि सिस्टम में संसाधनों पर कौन सी प्रक्रियाएं हैंडल रखती हैं।

एक बार जब आप प्रोसेस एक्सप्लोरर स्थापित मिल गया है, निम्न प्रयास करें:

  1. एक असफल-राज्य में अपने सिस्टम जाओ (जैसे कि अपने कार्यक्रम चलाने से काम नहीं करता)।
  2. प्रक्रिया एक्सप्लोरर शुरू करें (आपको इसकी सुविधाओं का पूर्ण उपयोग करने के लिए एक व्यवस्थापक होना होगा)।
  3. शीर्ष पर मेनू बार में "ढूंढें" पर क्लिक करें और अपने .mdf या .ldf फ़ाइलों के नाम पर टाइप करें।

खोज परिणामों को अभी भी गलत तरीके से समाप्त प्रक्रिया द्वारा आयोजित संसाधनों में से एक पर एक हैंडल के साथ एक प्रक्रिया/सेवा प्रदर्शित करना चाहिए।

+0

यह एलडीएफ फ़ाइल पाता है, लेकिन डिएगो (उपरोक्त) को मारने के मेरे जवाब के अनुसार प्रक्रिया को जारी नहीं किया जा रहा है :-(!!! –

+0

मुझे सेवाओं में जाना और MSSQLSERVER ढूंढना था, मैन्युअल में स्टार्ट विकल्प बदलें, फिर भौतिक रूप से इसे रोकें ... केवल तब से, क्या मैं bin \ debug फ़ोल्डर में फ़ाइलों को हटाने में सक्षम था !!! मैंने स्टार्ट बदल दिया स्वचालित रूप से वापस विकल्प और सेवा शुरू की, और अंत में, यह सब फिर से काम कर रहा है !!! अब मुझे यह पता लगाना है कि यह क्यों हो रहा है और इसे फिर से होने से रोकने के लिए ... –

1

यह "कथन का उपयोग करके पुनः लिखा गया कोड है। जब मैं प्रोग्राम निष्पादित करता हूं और SQL फ़ाइल में सम्मिलित रिकॉर्ड पर क्लिक करता हूं, तो यह बंद हो जाता है, प्रक्रिया को myCount = 1 के साथ पूरा करता है (हालांकि मुझे 100% यकीन नहीं है कि यह वास्तव में एक भौतिक लिख रहा है, क्या मुझे वास्तव में एक कमांड याद आ रहा है अद्यतन "करता है"??) और फॉर्म फिर से प्रदर्शित करता है।

मैं तो एसक्यूएल फ़ाइल में सम्मिलित रिकार्ड पर क्लिक करते हैं फिर से, मैं एक त्रुटि के रूप में निम्नानुसार है:

SqlException was unhandled

Cannot open user default database. Login failed. Login failed for user 'MEDESKTOP\Gary'.

इस कार्यक्रम है (मैं इस पीसी पर केवल उपयोगकर्ता हूँ और पूर्ण व्यवस्थापक अधिकार हों इस बिंदु पर डेटाबेस के "राज्य", गुण, बंद के अनुसार, है तो यह कोड के माध्यम से पहली पास था के रूप में की उम्मीद थी की तरह लग रहा ...

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace MySqlTest 
{ 
public partial class Form1 : Form 
{ 
    int myCount; 
    string myDBlocation = @"Data Source=MEDESKTOP;AttachDbFilename=|DataDirectory|\mySQLtest.mdf;Integrated Security=True;User Instance=False"; 

    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     myCount++; 
     MessageBox.Show("myCount = " + myCount.ToString()); 
     //Insert Record Into SQL File 
     myDB_Insert(); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     //Read Record From SQL File 

    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     //Read All Records From SQL File 

    } 

    private void button5_Click(object sender, EventArgs e) 
    { 
     //Delete Record From SQL File 
    } 

    private void button7_Click(object sender, EventArgs e) 
    { 
     //Quit 
     myDB_Close(); 
     this.Close(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void Form1_Close(object sender, EventArgs e) 
    { 

    } 

    void myDB_Insert() 
    { 
     using (SqlConnection myDB = new SqlConnection(myDBlocation)) 
     using (SqlCommand mySqlCmd = myDB.CreateCommand()) 
     { 
      myDB.Open(); **<<< Program fails here, 2nd time through** 
      mySqlCmd.CommandText = "INSERT INTO Parent (ParentName) VALUES(@ParentNameValue)"; 
      mySqlCmd.Parameters.AddWithValue("@ParentNameValue", myCount); 
      mySqlCmd.ExecuteNonQuery(); 
      myDB.Close(); 
     } 
     return; 
    } 

    void myDB_Close() 
    { 
     using (SqlConnection myDB = new SqlConnection(myDBlocation)) 
     using (SqlCommand mySqlCmd = new SqlCommand()) 
     { 
      myDB.Close(); 
     } 
     return; 
    } 

} 
} 

मुझे समझ नहीं आता क्यों मैं अचानक हूँ अपनी खुद की फाइल तक पहुंच खोना जो मैं पहले से ही उपयोग कर रहा हूं?!?

0

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

वीएस -2010 स्रोत डेटाबेस (.MDF और .LDF फ़ाइल) की प्रतिलिपि बनाता है कि आप प्रोजेक्ट डीबग फ़ोल्डर में सर्वर एक्सप्लोरर में काम करते हैं। यह वह प्रतिलिपि है जिसे आप रनटाइम पर काम कर रहे हैं। जब इस फ़ाइल की प्रतिलिपि बनाई जाती है तो डिफ़ॉल्ट रूप से एमडीएफ प्रॉपर्टी Copy to Output Directory द्वारा नियंत्रित किया जाता है, यह Copy always पर सेट होता है। इसका अर्थ है कि यह फ़ाइल को नए निर्माण या चलाने पर कॉपी और कॉपी करेगा और यदि आपने इसे कहीं और खोल दिया है तो यह विफल हो जाता है और फिर यह लटका हो जाता है।

कनेक्शन देखने का तरीका SQL सर्वर प्रबंधन कंसोल खोलना है। डिफ़ॉल्ट रूप से VS2010 कनेक्शन स्ट्रिंग में निर्दिष्ट SQL सर्वर के उपयोगकर्ता उदाहरण का उपयोग कर रहा है। इकाई फ्रेमवर्क के मामले में यह App.Config XML में है।

उपयोगकर्ता उदाहरण SQL सर्वर की स्मृति प्रतिलिपि में एक अलग है जिसमें लॉग इन उपयोगकर्ता को सौंपा गया सभी उपयोगकर्ता अधिकार हैं। इसे पाने के लिए आपको उचित कनेक्शन ढूंढना होगा।

एसक्यूएल के मुख्य उदाहरण से इस क्वेरी को चलाने से सभी उपयोगकर्ता इंस्टेंस कनेक्शन दिखाए जाएंगे।

SELECT owning_principal_name, instance_pipe_name, heart_beat FROM sys.dm_os_child_instances 

यह कुछ ऐसा है इस तरह दिखता है वापस आ जाएगी:

|owning_principle_name | instance_pipe_name      | heart_beat 
-------------------------------------------------------------------------------- 
1 | MyServer\Admin  | \\.\pipe\91B3063E-CD0F-4B\tsql\query\ | dead 
-------------------------------------------------------------------------------- 
2 | MyServer\Rich  | \\.\pipe\B04A1D3B-6268-49\tsql\query\ | alive 

आप उदाहरण के नाम की प्रतिलिपि बनाकर नई सिलसिले में सर्वर नाम के रूप में उपयोग, के रूप में उपयोगकर्ता के साथ जुड़े आप चल रहे हैं डीबग फ़ोल्डर से अपना डेटा देखें।

अब आप डेटाबेस पर क्लिक करें और Tasks >Detach... आप डेटाबेस फ़ाइल नाम के आगे एक Detach Database संवाद जांच Drop Connections चेकबॉक्स खोलने के लिए और OK क्लिक करेगा।

डेटाबेस को सूची से निकाल दिया जाएगा और आपको एप्लिकेशन बनाने और चलाने में सक्षम होना चाहिए।

0

मैं इस समाधान पाया: http://oreilly.com/catalog/errata.csp?isbn=0636920022220

राइट-क्लिक करें वी.एस. के डेटाबेस एक्सप्लोरर में डेटाबेस और डिबगिंग सत्र के बीच घनिष्ठ संबंध क्लिक करें और यह मेरे लिए काम किया।

0

सबसे सरल बात सर्वर एक्सप्लोरर है। समस्या डेटाबेस चुनें। राइट-क्लिक करें और "कनेक्शन बंद करें" चुनें।

यदि यह पहले से बंद है, कनेक्ट और डिस्कनेक्ट हो।

0

मुझे लगता है कि पहले से ही SqlTestDB.mdf संलग्न है। मुझे पहले इस समस्या का सामना करना पड़ा है, बस एमएस एसक्यूएल सर्वर पर जाएं और डेटाबेस को अलग करें और फिर विजुअल स्टूडियो में सर्वर एक्सप्लोरर पर अपने कनेक्शन का पुनर्निर्माण करें।

0

आप शुरुआत में डीबेस शुरू कर रहे हैं और कोई निश्चितता नहीं है कि इसे समाप्त होने पर जारी किया जा रहा है। वास्तव में आप मेमोरी मैनेजर को इसे हल करने की प्रतीक्षा कर रहे हैं, यह इस बात पर निर्भर करता है कि सिस्टम कितनी व्यस्त है जब फ़ाइल को रिलीज़ किया जा सकता है।

मुझे लगता है कि आपको इसे "आवश्यकता होने पर खोलने" में बदलने की आवश्यकता है।

उदाहरण के लिए मैं कोड को पूरा कर लेने के बाद कोड को अपनी कक्षा में किसी भी डेटाबेस तक पहुंचने के लिए डालता हूं, मैं इसे छोड़ देता हूं।

उद्घाटन और समापन भूमि के ऊपर है, लेकिन मैं मैं, निम्नलिखित करके इसके साथ रह सकते हैं

अपनी कक्षा में एक से अधिक प्रवेश बिंदु, एकल लेन-देन के लिए, और अनेक लेन-देन के लिए एक और है मिल गया है। उदाहरण

S_UpdateSingleRecord(...) 
M_UpdateManyRecords(...) 

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

मैं S_SingleTransaction() में 'उपयोग' का उपयोग करता हूं क्योंकि यह मेरे लिए इसे साफ़ करता है। लेकिन जब मैं अपना कॉलिंग फ़ंक्शन समाप्त करता हूं तो एकाधिक प्रविष्टि बिंदु को खोलता हूं और इसे बंद करता हूं। मुझे इस लॉक समस्या को एक एमडीएफ और एक एप्लीकेशन के साथ कभी नहीं मिला है। यह एक एमडीएफ और एकाधिक अनुप्रयोगों के साथ खेलने में वापस आ जाएगा, इन मामलों में आपको MSSQL का उपयोग सेवा डीबेस के रूप में करने की आवश्यकता है, आपको अपने विजुअल स्टूडियो में सेटअप करना उतना आसान लगेगा, और फिर अन्य एप्लिकेशन में आपके टूलबार में सूची में पहले से ही डेटाबेस है।

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

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