Lentitud con base de datos access

Iniciado por K1ll1ng M4ch1n3, 13 Junio 2010, 19:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

K1ll1ng M4ch1n3

Estoy haciendo un programa que tiene que leer una base de datos local hecha en access. La base de datos tiene en unos momentos unos 5000 registros. EL problema es la lentitud. Tienen que verse a la vez todos los registros de la base de datos y al ejecutar el programa se ve cómo se va cargando la base de datos, y al hacer scroll hacia abajo se ve cómo se van dibujando los registros, como si el refresco de pantalla fuera demasiado lento. La misma base de datos la abro desde access y puedo bajar rápidamente el scroll y se ve bien. Estoy usando el dataGridView enlazándole la base de datos.

Creo que no hay tantos registros como para justificar esta lentitud, ¿hay algún otro tipo de base de datos que se pueda usar de forma local y que vaya más rápido?¿Sería mejor programar una función propia en vez de usar el dataGridView sin más? La base de datos seguirá creciendo y probablemente dentro de poco se dupliquen los registros. He pensado en usar un archivo csv en vez de una base de datos, ¿sería esto más efectivo y permitiría seguir aumentando la cantidad de datos?

Un saludo y muchas gracias.

[D4N93R]

Hola, Access siempre será lento , no tienes mucho poder ahí. Pero dime, en el datagridview que tienes, tienes que meter todos los registros al mismo tiempo? o sea, cual es la finalidad de meter 5000 registros de una vez? ningún usuario va a buscar ahí, ni  mucho menos a encontrar algo. Si colocas filtros seguramente se va a hacer todo más rápido.

Saludos

raul338

Ademas tambien depende de como lo vas cargando.

No tiene la misma velocidad un Reader que un DataApadater  ;)

.mokk.

#3
Yo prefiero el DataAdapter ^^

Aunque si como dice D4N93R para qe meter tantos mejor solo que ponga un TOP 40 o 50, y aparte pones un boton de busqueda(Filtro) asi le sera mas facil.

Yo por ejemplo lo uso pero no con Acess, sino con MSSQL con una Base de Datos que est en un Host, y me va bien no es lento ni nada ademas de que son mas de 10 DataGrids los que uso en el programa y no me va nada lento ademas de un Timer para que los DataGrids se actualicen cada cierto tiempo por si hay cambios en la DB o Tablas correspondientes =P

Y como dijo tambien nadie va a ir buscando uno por uno xD, mejor es colocar un filtro ahi ^^

y ademas un diseño ahi de las celdas


DataGridview1.RowsDefaultCellStyle.BackColor = Color.White  
 
DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray 


Talves ya lo tengas pero sino pues puedes hacerlo asi le da una mejor visualizacion ^^

[D4N93R]

También puede ser que tenga muchas columnas, entonces estés manejando un gran volumen de dátos, sumado a los 5000 Registros, y no se capaz si es una PC un poco viejita.. podrás imaginarte el colapso...

- En los select solo traete las columnas necesarias.
- Y siempre Trata de filtrar lo más posible, o hasta mostrar un mensaje de que no se mostrarán todos los registros, sino los primero 50 o algo así cuando sean muchos.

K1ll1ng M4ch1n3

Perdón, cuando he dicho 5000 registros quería decir 5000 datos, registros son 150 ahora mismo, pero irá en aumento hasta los 300 dentro de poco.
También he puesto un filtro para hacerlo más cómodo, por supuesto, pero me interesaba poner una vista de todos los datos de forma simultánea más que nada para tener una vista de todo a la vez. Aunque es probable que acabe quitando esa vista.

Lo del dataadapter o reader... simplemente he creado el dataGridView y le he dado a añadir origen de datos y he puesto ahí la base de datos, sin escribir más código, o sea que funcionará de la manera más cutre posible y por ello se verá lento. De todas formas, access debería servir para lo que yo necesito.

Podéis pasarme algún enlace a ejemplos del dataadapter o al MSDN? Sé que suena un poco vago, pero es que estoy mirando por Google y como no lo he usado nunca, entre los ejemplos que veo no sé si lo que leo es realmente lo que estoy buscando.


Un saludo y muchas gracias por la atención

[D4N93R]

Este ejemplo lo saqué del MSDN

Código (csharp) [Seleccionar]
private static DataSet SelectRows(DataSet dataset,
    string connectionString,string queryString)
{
    using (SqlConnection connection =
        new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(
            queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

raul338

Código (csharp) [Seleccionar]

//..........
DataGrid1.DataSource = SelectRows(new Dataset(), cnnString, "SELECT * FROM loque sea");
Datagrid1.Databind();
//..........

(o algo asi si la memoria no me falla :P) mas el codigo de D4N93R deberia funcar  ;-)

[D4N93R]

Cita de: raul338 en 14 Junio 2010, 01:50 AM
Código (csharp) [Seleccionar]

//..........
DataGrid1.DataSource = SelectRows(new Dataset(), cnnString, "SELECT * FROM loque sea");
Datagrid1.Databind();
//..........

(o algo asi si la memoria no me falla :P) mas el codigo de D4N93R deberia funcar  ;-)

+1

K1ll1ng M4ch1n3

Muchas gracias. He estado mirándolo y he encontrado un ejemplo por Internet, que adaptándolo a lo mío ha acabado siendo esto:

Imports System.Data
Imports System.Data.OleDb
Public Class Form1
    Private CnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Guillermo\Desktop\updateApp2\bin\Debug\basedatos2.mdb;Persist Security Info=True"
    'Function that returns a DataTable
    Public Function GetTable(ByVal query As String) As DataTable
        Dim Cn As New OleDbConnection(CnStr)
        Dim Adp As New OleDbDataAdapter(query, Cn)
        Dim Cmb As New OleDbCommandBuilder(Adp)

        Dim dt As New DataTable
        Adp.Fill(dt)
        Return dt
    End Function

    Dim bsEmp As BindingSource
    Dim Ds As New DataSet


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Populate datatables and add them to dataset
        Dim t1 As DataTable = GetTable("select * from listaEjercicios")
        t1.TableName = "listaEjercicios"

        Ds.Tables.Add(t1)

        'Create Binding source

        bsEmp = New BindingSource(Ds, "listaEjercicios")

        DataGridView1.DataSource = bsEmp

    End Sub
End Class


Creo que no es exactamente lo que me decíais. La cosa es que sigue yendo igual de lento. Es cosa de la base de la base de datos o es que el código que he usado sigue siendo una *****? Si hay alguna alternativa más rápida de base de datos sin servidor, estaría encantado de probarlo.

Muchas gracias.

Un saludo