从MS Access数据库获取数据并将其显示在列表框中

时间:2013-02-28 05:47:53

标签: c# ms-access listbox

如何读取ms访问数据库中的数据并将其显示在列表框中。我这里有代码但是我有错误。

 private void button3_Click(object sender, EventArgs e)
    {
        using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\Sisc-stronghold\mis!\wilbert.beltran\DataBase\DataStructure.accdb"))
        using(OleDbCommand cmd = new OleDbCommand(" SELECT * from TableAcct", conn))
        {
            conn.Open();
            OleDbDataReader Reader = cmd.ExecuteReader();
            //if (Reader.HasRows)
            if (Reader.HasRows)
            {
                Reader.Read();
                listBox1.Text = Reader.GetString("FirstName");
            }
        } 

错误在这里: 1.错误1'System.Data.Common.DbDataReader.GetString(int)'的最佳重载方法匹配具有一些无效参数。 2.错误2参数'1':无法从'string'转换为'int'

7 个答案:

答案 0 :(得分:5)

尝试这个,

       List<String> firstName = new List<String>();
       List<String> lastName = new List<String>();

       private void loadButton_Click(object sender, EventArgs e)
       {
                cn.Open();
                OleDbDataReader reader = null;
                cmd = new OleDbCommand("select* from Records", cn);
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    firstName.Add(reader["FirstName"].ToString());
                    lastName.Add(reader["LastName"].ToString());
                }
                cn.Close();
       }

然后在搜索按钮中插入,

private void searchButton_Click(object sender, EventArgs e)
        {
            clearSearchResult();
            try
            {
                int totalItems = FirstName.Count;
                int count = 0;
                while (count < totalItems)
                {
                    if (textBox6.Text == FirstName[count].ToString())
                    {
                        listBox1.Items.Add(FirstName[count].ToString());
                        count = 100;
                    }
                    else
                    {
                        count++;
                    }

如果您想要在"FirstName"中显示listBox1_SelectedIndexChanged的信息,可以使用它。这是一个例子,

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
                int totalItems = lastName.Count;
                int count = 0;
                while (count < totalItems)
                {
                    if ((listBox1.SelectedItem.ToString()) == firstName[count].ToString()))
                    {
                        textBox1.Text = firstName[count].ToString();
                        textBox2.Text = lastName[count].ToString();
                        count = 100;
                    }
                    else
                    {
                        count++;
                    }
               }

希望这有帮助,

答案 1 :(得分:1)

GetString()将int作为参数而不是字符串。这意味着您必须使用列的索引。

在您的特定情况下,“FirstName”是第二列,索引将为1:

listBox1.Text = Reader.GetString(1);

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdatareader.getstring.aspx

答案 2 :(得分:1)

更改

listBox1.Text = Reader.GetString("FirstName");

listBox1.Text = Reader.GetString(0); // zero base ordinal of column

答案 3 :(得分:1)

你使用While循环

while(reader.Read())
{
   listbox1.Items.Add(reader["FirstName"]);
}

这会移动您选择的所有行。如果没有更多行,reader.Read()会返回false

另外:如果您想要从列中检索valmue,我建议您使用索引ónreader实例来执行此操作。就像我的例子。

var value = reader["ColumnName"];

相比,这增加了可读性
var value = reader.GetString(0);

更新

如果你只想显示第一个值 - 我建议你使用cmd.ExecuteScalar()并调整你的sql只返回你需要的值:

using(OleDbCommand cmd = new OleDbCommand("SELECT firstname from TableAcct", conn))
{
   conn.Open();
   var firstName = cmd.ExecuteScalar();
}

请注意,这会在表格中为您提供 first “FirstName”。由于没有"order by firstname""where someKey = 1" - 这可能不会达到预期效果。

答案 4 :(得分:1)

如果您想创建MS Access数据库并访问它,并在某个组件中显示数据,就像这里我将向您展示如何连接MS Access数据库并显示Label中数据库的数据。 首先创建任何Access数据库,例如“PirFahimDataBase”。 现在在Visual Studio中转到菜单并执行此操作

  1. 点击数据
  2. 添加新数据库
  3. 点击下一步
  4. 点击新建连接
  5. 现在通过单击“更改”并选择“Microsoft Access数据库文件”
  6. 来更改数据源
  7. 单击“浏览”以选择已创建的数据库
  8. 现在在Button ClickEvent中粘贴这些代码,这些代码将从数据库中获取数据并将其显示在标签中

    using System.Windows.Forms; //these two lines should be written before namespace at top of the program
    using System.Data.OleDb;
    
    private void button1_Click(object sender, EventArgs e)
        {        
          System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
         conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" +
        @"Data source= C:\Users\pir fahim shah\Documents\PirFahimDataBase.accdb";
    
        try
         {
         conn.Open();
         MessageBox.Show("connected successfuly");
         OleDbDataReader reader  = null;  // This is OleDb Reader
       OleDbCommand cmd = new OleDbCommand("select TicketNo from Table1 where Sellprice='6000' ", conn);
        reader = cmd.ExecuteReader();
        while (reader.Read())
        {
         label1.Text= reader["TicketNo"].ToString();           
    
        }
    
    }
        catch (Exception ex)
    {
        MessageBox.Show("Failed to connect to data source");
    }
    finally
    {
        conn.Close();
    }    
     }//end of button click event
    

答案 5 :(得分:0)

您的错误就在这一行:

listBox1.Text = Reader.GetString("FirstName");

您必须在GetString()函数中传递一个数字。

答案 6 :(得分:0)

DataColumn[] PrimaryKeyColumn = new DataColumn[1]; //Define Primary coloumn
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable();
ReadAndUpdateExcel.ReadExcel(strPath, sheetName, out dataSet);
dataSet.Tables.Add(dataTable);
PrimaryKeyColumn[0] = dataSet.Tables[0].Columns[0];
dataSet.Tables[0].PrimaryKey = PrimaryKeyColumn;
string num = dataSet.Tables[0].Rows[dataSet.Tables[0].Rows.IndexOf(dataSet.Tables[0].Rows.Find(strTCName))]["ACNO"].ToString();
//string country