2012-07-06 26 views
-4

這是我的片段,請幫我爲什麼騙子。開不函數tabledel內部功能的連接不叫

我想刪除表一次,我按下按鈕容器內工作,連接被打開第一次,但想不出打開它的功能tabledel內第二次

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.OleDb; 

namespace WFA_CREATE_DELETE 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     OleDbConnection con = new OleDbConnection(@"PROVIDER=Microsoft.ACE.OLEDB.12.0; Data Source=C:/Users/Dinesh/Documents/Database3.accdb"); 
     OleDbDataAdapter ea = new OleDbDataAdapter(); 
     DataSet dsl; 
     DataSet esl; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      OleDbDataAdapter da = new OleDbDataAdapter(); 
      dsl = new DataSet(); 
      con.Open(); 

      DataTable table2 = con.GetSchema("tables"); 

      MessageBox.Show("Database Open"); 

      dataGridView1.DataSource = table2; 

      con.Close(); 
      con.Dispose(); 
     } 

     public void Tabledel() 
     { 
      int a = 0, d = 0, count, itr; 

      count = dataGridView1.RowCount; 
      itr = dataGridView1.ColumnCount; 

      while (a < count) 
      { 
       for (d = 0; d < itr; d++) 
       { 
        if (dataGridView1.Rows[a].Cells[d].Value.ToString() == textBox1.Text) 
        { 

         MessageBox.Show("table exists"); 
         esl = new DataSet(); 
         string vsql = "drop table '" + textBox1.Text + "'"; 
         ea = new System.Data.OleDb.OleDbDataAdapter(vsql, con); 
         OleDbCommand cmdea = new OleDbCommand(vsql, con); 
         //cmdea.Connection = con; 

         con.Open(); 
         cmdea.ExecuteNonQuery(); 
         MessageBox.Show("table dropped"); 
         con.Close(); 
         con.Dispose(); 
        } 
       } 

       a++; 
      } 
     } 

     private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
     { 

     } 

     public void button1_Click(object sender, EventArgs e) 
     { 
      Tabledel(); 


     } 

    } 
} 

link

+0

請在問題本身提供樣本。 – 2012-07-06 07:54:36

+0

你有什麼嘗試?您是否將事件處理程序分配給按鈕單擊事件? – 2012-07-06 07:55:31

+0

加載表單時處理連接。除此之外,你的代碼還有很多問題。請在這裏粘貼代碼 – Steve 2012-07-06 07:56:55

回答

2

當我看到你得到這個錯誤:

The ConnectionString property has not been initialized. 

可能是你將創建(處理)在別的地方你的連接(除了在表單類全局變量),所以我建議要明確設置連接字符串(隨着重建連接):

con = new OleDbConnection(
     @"PROVIDER=Microsoft.ACE.OLEDB.12.0; Data Source=C:/Users/Dinesh/Documents/Database3.accdb"); 

con.Open(); 

反正它並不難將你的代碼的主要部分包含在SO中。

+0

是的,所以你想讓我重新定義函數裏面的con嗎?/ – kavinhuh 2012-07-06 08:04:49

+0

@ user1386579,是的,我猜在某些地方這個屬性將設置爲null或空。代碼大小很大,我沒有仔細閱讀。 – 2012-07-06 08:05:50

0

連接對象是在創建窗體時創建的。您可以在Form_Load方法中打開,使用,關閉和處理連接對象。因此,當你的按鈕點擊處理程序開始執行時,連接對象就消失了。

你必須要麼創建按鈕單擊處理程序創建新的連接對象,或不會出售它在Form_Load方法。

0

真的很難解碼你的實際問題是什麼,是什麼原因引起的等等,但也有許多問題與您的代碼。

首先你不應該初始化con對象你的方式。每次你使用它並且打電話給Dispose,你都會毀掉它。在任何情況下,它都不會在您的Form1類下次初始化之前重建。這可能是你得到錯誤的原因。

建議將有一個單身人士處理您的連接。這引出了我的下一個觀點:在循環中打開新的連接是一個非常糟糕的主意。如果您已正確建立了連接管理器,則只需打開每個呼叫的一個連接。我會給你更好的表現,如果你有很多元素可以迭代,你會注意到。

接下來,您的刪除語句需要SQL注入。你應該強有力地考慮使用一種最小化用戶輸入的方式來從列表中選擇,以便他們不能在你的輸入奇怪的查詢textBox1.Text

這只是其中的一部分..我希望你可以使用它。

哦,請寫出更好的問題。不要只說「呃,有些東西不行,鏈接」。凝結你的代碼並思考你要求的內容,以確保它被廣泛理解。

+0

謝謝,我道歉,下次再發帖提問,我有點急 – kavinhuh 2012-07-06 08:41:51