2012-01-17 14 views
11

(transferTable करने के लिए) एक एक्सेल शीट में पढ़ने, मैं एक नया तालिका (destinationTable) SqlBulkCopy का उपयोग कर उस डेटा जोड़ना चाहते हैं के बाद तालिका का उपयोग नहीं कर सकते हैं, लेकिन मैं त्रुटि हो रही है:SqlBulkCopy

Cannot access destination table 'test' 

मैंने डिफ़ॉल्ट टैबलेटनाम का उपयोग करने और स्क्वायर ब्रैकेट का उपयोग करने का प्रयास किया है, लेकिन यह काम नहीं करता है।

कोई सुझाव?

private void writeToDBButton_Click(object sender, EventArgs e) { 
    MakeTable(); 
    destinationTable.TableName = "test"; 
    testDBDataSet.Tables.Add("test"); 

    // Connects to the sql-server using Connection.cs 
    SqlConnection connection = Connection.GetConnection(); 

    using (connection) { 
     connection.Open(); 

     // Uses SqlBulkCopy to copy the data from our transferTable to the destinationTable 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { 
      bulkCopy.DestinationTableName = destinationTable.TableName; 

      try { 
       // Write from the source to the destination. 
       bulkCopy.WriteToServer(transferTable); 
       this.dataGridView2.DataSource = destinationTable; 
      } 
      catch (Exception ex) { 
       MessageBox.Show(ex.Message); 
      } 

      connection.Close(); 
     } 
    } 
} 

private void saveDBButton_Click(object sender, EventArgs e) { 
    this.Validate(); 
    this.usersBindingSource.EndEdit(); 
    this.tableAdapterManager.UpdateAll(this.testDBDataSet); 
} 


private void MakeTable() { 
    for (int counter = 0; counter < columns; counter++) { 
     DataColumn dummy = new DataColumn(); 
     dummy.DataType = System.Type.GetType("System.Double"); 
     destinationTable.Columns.Add(dummy); 
    } 
} 
+0

आप इस तरह के रूप में 'ग #' और एक डेटाबेस, जैसे 'एसक्यूएल-server',' एमएस-access' अधिक प्रासंगिक टैग, जोड़ना चाहिए से - 'वर्ग एल 'एक सामान्य टैग है और' पहुंच 'लगभग अर्थहीन है। – Fionnuala

उत्तर

5

चेक कि उपयोगकर्ता db से कनेक्ट होता है

GRANT ALTER ON [dbo].[TABLE_XXX] TO [appuser] 

MSDN forum पर Jhilden द्वारा जवाब में सुझाव के रूप में है।

+0

यह मेरी समस्या का समाधान नहीं किया। मैं अभी भी टेबल तक नहीं पहुंच सकता, भले ही उपयोगकर्ता डेटाबेस स्वामी – user3183411

2

ऐसा लगता है कि इस कोड को निष्पादित करने वाले उपयोगकर्ता के पास डेटाबेस तक उचित पहुंच नहीं है। * जांचें ताकि उपयोगकर्ता को पहुंच प्राप्त हो सके। * डेटाबेस से कनेक्ट करने के लिए अपने कनेक्शन का उपयोग करके कनेक्शनस्ट्रिंग की जांच करें।

+0

मेरा कनेक्शनस्ट्रिंग है: स्ट्रिंग कनेक्शनस्ट्रिंग = @ "डेटा स्रोत =। \ SQLEXPRESS; AttachDbFilename = | डेटा डायरेक्टरी | \ TestDB.mdf; उपयोगकर्ता इंस्टेंस = ट्रू; एकीकृत सुरक्षा = सही;"; – SND

2

मैंने हाल ही में इसी त्रुटि में भाग लिया और उत्तर के लिए googling जबकि इस पोस्ट में आया। मैं उस उपयोगकर्ता को देकर समस्या को हल करने में सक्षम था जो थोक प्रति कमांड सम्मिलन निष्पादित कर रहा है और गंतव्य तालिका पर अनुमतियां चुनता है। मूल रूप से मैंने केवल उपयोगकर्ता को सम्मिलित अनुमति दी थी और 'गंतव्य तालिका तक नहीं पहुंच पाई' त्रुटि मिली।

0

मेरे मामले में, यह अनुमति समस्या नहीं है, लेकिन तालिका नाम की समस्या में एक विशेष char (कोष्ठक और &)।

आशा इस

0

Bulkcopy उम्मीद तालिका डेटाबेस में मौजूद है में मदद करता है। इसके अलावा आपको इस डेटाबेस या टेबल तक पहुंच प्राप्त करनी चाहिए।

1

दिलचस्प बात यह है कि यदि आपके पास एक टेबल नाम है जो पूरी तरह से संख्यात्मक है तो यह भी होता है। एक या अधिक अल्फा वर्णों के साथ तालिका का नाम प्रारंभ करें और यह ठीक काम करता है।

4

मेरे मुद्दा थोड़ा अलग था, पता चला है मेरी तालिका नाम एसक्यूएल में एक आरक्षित कीवर्ड तो मैं निम्नलिखित करना पड़ा था:

bulkCopy.DestinationTableName = $"{schema}.[{tableName}]"; 

कहाँ schema लक्ष्य स्कीमा और tableName लक्ष्य तालिका नाम

है

documentation

DestinationTableName is a three-part name [database].[owningschema].[name]. You can qualify the table name with its database and owning schema if you choose. However, if the table name uses an underscore ("_") or any other special characters, you must escape the name using surrounding brackets as in ([database].[owningschema].[name_01])

+0

हाँ है, यह मेरे लिए भी समस्या थी। MSDN से: DestinationTableName तीन भागों में नाम है (।।)। यदि आप चुनते हैं तो आप तालिका के नाम को अपने डेटाबेस के साथ अर्हता प्राप्त कर सकते हैं और स्कीमा का मालिक बन सकते हैं।** हालांकि, यदि तालिका का नाम अंडरस्कोर ("_") या किसी अन्य विशेष वर्ण का उपयोग करता है, तो आपको आसपास के ब्रैकेट्स ** ([] में नाम से बच जाना चाहिए। – bluedot

+0

धन्यवाद @bluedot मैंने आपके उत्तर के साथ आपके उत्तर को अपडेट किया है –

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