2016-10-16 149 views
1

我使用此代码尝试使应用程序筛选文本框中的文本,但它拒绝这么做,并且错误消息不断弹出。这里是代码:从Microsoft Access数据库筛选搜索数据并在datagridview中筛选c#

using System.Windows.Forms; 
using System.Configuration; 
using System.Data.OleDb; 

namespace TestBarcode 
{ 
    public partial class StaffHome : Form 
    { 
     private OleDbConnection connection = new OleDbConnection(); 
     public StaffHome() 
     { 
      InitializeComponent(); 
      connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\Projects\POS\Database\MainDatabase_POS.accdb;Persist Security Info=False;"; 
     } 

     private void StaffHome_Load(object sender, EventArgs e) 
     { 

      try 
      { 
       connection.Open(); 
       OleDbCommand command = new OleDbCommand(); 
       command.Connection = connection; 
       string query = "select * from InventoryManagement"; 
       command.CommandText = query; 

       OleDbDataAdapter da = new OleDbDataAdapter(command); 
       DataTable dt = new DataTable(); 
       da.Fill(dt); 
       dataGridView1.DataSource = dt; 

       connection.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error" + ex); 
      } 
     } 
     try 
     { 
      connection = new OleDbConnection(); 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand("Select * from InventoryManagement where ID like '" + textBox1.Text + "%'", connection); 

      OleDbDataAdapter adp = new OleDbDataAdapter(command); 
      DataTable dt = new DataTable(); 
      adp.Fill(dt); 
      dataGridView1.DataSource = dt; 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("Error" + ex); 
     } 

有没有办法让这种情况发生?如果是这样,请帮助。谢谢。

编辑:这是错误消息的图像。 Error msg Box

+0

首先:上面的代码似乎不可编译。 (这两种不同的方法?如果是这样请添加相关代码)二。数据表InventoryManagement上的列ID的类型是什么?第三,错误信息究竟是什么?我很抱歉,但如果你不添加这些重要的信息,你的问题属于类别“不清楚你在问什么” – Steve

+0

谢谢你指出这一点。 首先,它是相同的代码,我认为这是因为该程序工作正常,直到我在文本框中插入文本。 其次,还有其他一些栏目,包括: ID,BarcodeID,Price,Quantity。 第三,我编辑了上面的文字并添加了我的错误图像。 再次。感谢您指出了这一点。 –

回答

0

第二个命令在OleDbConnection变量上调用NEW。结果是,这会重新创建OleDbConnection,但会丢失所需连接字符串的初始化。在此上下文中,仍应使用全局对象,并且不要创建新连接。但是我不喜欢使用一个连接的全局对象很多 所以只要删除此行

// This creates a new OleDbConnection without the connection string 
connection = new OleDbConnection(); 

。连接内部使用非托管资源,在异常情况下可能难以正确处理,并且始终最好创建本地连接并仅保留全局连接字符串。此模式允许引入正确销毁连接的使用语句,并释放由连接保留的非托管资源。

+0

它工作正常,但如果我有更多的2次搜索,它给了我一个错误消息: –

+0

这里是消息框错误。 [链接](http://i.imgur.com/vcZJxlo.png) –

+0

消息很明确。您尝试在某处调用_connection.Open()_,但您之前没有调用_connection.Close()_。如果这些命令都是一个接一个地执行的,那么在开始时打开并在结束时关闭一个try/catch,以便在发生错误时关闭。 – Steve