necesito opiniones sobre este tema

28/09/2006 - 09:28 por Sonia | Informe spam
a ver si podeis solucionar mi duda.
cuando entre a trabajar en una empresa (editorial) habia u programa hecho en
vb6 q usaban 20 operadoras y la bd es acces97 y estaba en un pc servidor.
todos los ordenadores son xp menos el servidor q es win 2000.

cuando llegue querian hacer mejoras en esa aplicacion q basicamente consiste
en consultar colegios, hacer pedidos...en definitiva consultar y modificar
la bd acces y mostrar la informacion a traves de textbox, datagrids y
listview

en vez de seguir con esta aplicacion en vb6 , como no la habia hecho yo y
cada uno entiende lo q hace, empeze a hacerla de nuevo con el microsoft
visual studio .net 2003 y asi he hecho las mejoras incluso otra aplicacion q
consiste en ampliar la q tenia para tratar los temas de facturacion,
albaranes control de stock, etiquetas en crystal, control de acceso de las
operadoras etc

el problema llego cuando se ponen todas en la aplicacion ya q si la comparo
con la del vb6, esta del .net es bastante mas lenta. al hacer alguna
modificacion, se actueliza el listview o lo q sea y eso lleva unos segundos.
sobretodo el formulario principal q ponen un codigo de un colegio y se
tienen q llenar 4 datagrids y un registro(10 textbox)

entonces ahora me planteo como es posible si se supone q el .net tiene
bastantes mejoras y teoricamente va bastante mas rapido, como es en mi caso
totalmente contrario. ya se q lo ideal seria hacer la bd sql pero eso de
momento no es posible.

puede ser q no haya exprimido el .net y q no haya hecho la aplicacion de la
forma mas eficaz? (la verdad es q es mi primera aplicacion)

y otra cosa:
puede ser tb la forma de conexion a la bd? yo lo q hago es conectar a la bd
una vez entro en la aplicacion. eso lo he puesto en un modulo donde pongo
mas funciones como las vaiables globales, el llenar un datagrid...etc

no se si seria mejor y si se puede hacer la conexion en cada formulario y/o
solo conectar las tablas q te hicieran falta para ese form. no se si esto
sera posible.
esto ultimo me vendria bien para q las tablas referentes a la facturacion
solo se conectaran a la bd en la 2º aplicacion, ya q al generar la factura
tengo q ir guardando todas las lineas de un listview y cuesta bastante si
son muchas.

queria saber, aparte de opiniones sobre pq puede ir mas lento en vb .net q
envb6, si es posible q al hacer la conexion no influya en todas las tablas
para asi ir mas rapido o si para cada cambio q se haya de la bd solo se
active/conecte la tabla en cuestion en vez de toda la bd hago casi todas las
coenxiones usando estas funciones(os las pongo x si sabeis mejoras o si
se puede cambiar lo de la conexion), ya q casi todos los ejemplos q veo son
usando sql
Gracias!

Imports System.Data.OleDb
Sub main()
Path1 = System.IO.Path.GetFullPath("\\Equipo3\C\DYLR\")
ArchivoDatos = path1 & "dyla.mdb"
CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
ArchivoDatos & ";Persist Security Info=False"
Dim frm As New principal
frm.ShowDialog()
End Sub

'funciones
Public Sub Gestionar(ByVal sql As String)
Dim conexion As New OleDb.OleDbConnection
conexion.ConnectionString = CadenaConexion
conexion.Open()
Dim Comando As OleDbCommand = New OleDbCommand
Comando.Connection = conexion
Comando.Transaction = conexion.BeginTransaction
Try
Comando.CommandText = sql
Comando.ExecuteNonQuery()
Comando.Transaction.Commit()
Correcto = True
Catch Errorcito As Exception
Comando.Transaction.Rollback()
Correcto = False
MsgBox("Operación no realizada", MsgBoxStyle.Critical, "Error de
la aplicación")
Finally
conexion.Close()
conexion.Dispose()
End Try
End Sub

Public Sub CrearMiOleDbCommand(ByVal myExecuteQuery As String, ByVal
myConnectionString As String)
Try
Dim myConnection As New OleDbConnection(myConnectionString)
Dim myCommand As New OleDbCommand(myExecuteQuery, myConnection)

myCommand.Connection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
myConnection.Dispose()
Catch ee As Exception
MessageBox.Show(ee.Message)
End Try
End Sub

Preguntas similare

Leer las respuestas

#6 Sonia
29/09/2006 - 10:02 | Informe spam
Donde puedo ver algun ejemplo de cómo hacer lo de las consultas preparadas?
Yo en la mayoria de casos lo q hago es dado un codigo llenar varios
listview, y en otros datagrids, dimplemente poniendo la consulta y llamar a
la funcion q lo carga. (creo q las funciones q gasto si son eficaces, de
todas formas voy a poner las mas frecuentes)
Te pongo las 3 funciones q siempre uso para ver si hay algo grave q provoque
lentitud en el programa o para q me digas si desde estas funciones puedo
hacer lo de las consutlas rapidas.
Por ejemplo en el form principal donde se cargan todos los datos del colegio
lo q hago es esto

'*******PARA LOS LISTVIEW
Private Sub leer_registro2(ByVal colegio As String) 'cargo 4 listview

Dim nuevo As cargalist 'cargalist es un modulo


mysql = "select ID,NOMBRE , APELLIDOS,CARGO,HORARIO,VARIOS,EMAIL"
mysql = mysql & " FROM (Contactos) WHERE ID_COL='" & cole & "' "
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView1)

mysql = "select CLAVE, FECHAS , NOMBRX ,APELSX , XESCR1 ,XLECT1 , XMATE1,
XORTO1 , MATVAL , MATESO , OTROS, COMENTARIO from TELEMARKETING where
KLVCOL='" & cole & "'
ORDER BY TELEMARKETING.CLAVE DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView2)

mysql = "select ID, FECHA ,OPERADORA , COMENTARIO "
mysql = mysql & " FROM (TELEM_COMENTARIOS) where COLEGIO='" & cole & "'
ORDER BY TELEM_COMENTARIOS.ID DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView3)

mysql = "select
CLAVE,FECHAS,XESCR1,XLECT1,XMATE1,XORTO1,MATVAL,MATESO,NOMBRX,APELSX,OTROS,
COMENTARIO from MUESTRAS_PEDIDO where KLVCOL='" & cole & "'"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView4)

End Sub

'LA FUNCION MYSQLCARGARVISTA ES:
Public Overloads Shared Sub MySqlCargarVista(ByVal myConnectionString As
String, ByVal mySelectQuery As String, ByVal myControl As ListView)

Dim Ordenar As Boolean = True
Dim AnchoColumnas As String = Nothing
Dim Alineaciones() As HorizontalAlignment = Nothing
Dim ModoVista As View = View.Details
Dim Celdas As Boolean = True 'False
Dim MaxReg As Short = 500
Dim MostrarError As Boolean = True

Dim DataAdapter As OleDbDataAdapter = New
OleDbDataAdapter(myConnectionString, CadenaConexion)

Dim Tabla As DataTable
Dim TmpAnchoColumna() As String
Dim AnchoColumna() As Integer
Dim UnaVez As Boolean = False
Dim Alineacion As HorizontalAlignment
Dim I As Integer = 0
Dim J As Long
Dim ItemLista As New ListViewItem

Try
ReDim TmpAnchoColumna(0)
ReDim AnchoColumna(0)
If Not AnchoColumnas Is Nothing Then
Application.DoEvents()
TmpAnchoColumna = AnchoColumnas.Split(",",
AnchoColumnas.Length)
AnchoColumna = ConvertirEnArray(TmpAnchoColumna)
Application.DoEvents()
End If

DataAdapter = New OleDbDataAdapter(mySelectQuery,
myConnectionString)
Tabla = New DataTable
DataAdapter.Fill(Tabla)
Application.DoEvents()
If Tabla.Rows.Count < MaxReg Then
MaxReg = Tabla.Rows.Count - 1
End If
myControl.Items.Clear()
For J = 0 To MaxReg
If Not UnaVez Then
Application.DoEvents()
UnaVez = True
End If
For I = 0 To myControl.Columns.Count - 1
If I = 0 Then
ItemLista myControl.Items.Add(Tabla.Rows(J)(I).ToString)
Else
ItemLista.SubItems.Add(Tabla.Rows(J)(I).ToString)
End If
Application.DoEvents()
Next
Application.DoEvents()
Next
If Ordenar Then
myControl.Sorting = SortOrder.Ascending
myControl.Sort()
Application.DoEvents()
End If
myControl.Refresh()
myControl.Show()
Catch ex As Exception
myControl.Items.Clear()
myControl.Columns.Clear()
If MostrarError Then
MsgBox("Error. -Consulte con el administrador del sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End If
End Try
'****************

'********* PARA LOS DATAGRID USO:

Dim nuevo As cargadatagrid

mysql = "select * from LIBRERIAS where PROVINCIA='" & TextBox1.Text & "'
ORDER BY DISTRITO"
nuevo.Carga(mysql, "LIBRERIAS", DataGrid1)
DataGrid1.ReadOnly = True

'LA FUNCION CARGA ES:

Public Overloads Shared Sub Carga(ByVal sql As String, ByVal tabla As
String, ByVal dataG As DataGrid, Optional ByVal titulo As String = "")
Try
Dim DataAdapter As OleDbDataAdapter = New OleDbDataAdapter(sql,
CadenaConexion)
Dim MiData As DataSet = New DataSet
Dim datav As New DataView
DataAdapter.Fill(MiData, tabla)

datav.Table = MiData.Tables(tabla)
dataG.DataSource = datav

If titulo <> "" Then dataG.CaptionText = titulo
Catch Errores As Exception
MsgBox("Error -- Consulte con el administrador del sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End Try
End Sub

*************



'******POR ULTIMO PARA LLENAR UNA SERIE DE TEXTBOX HAGO ESTO:
Dim x As Int16
Dim tb As System.Windows.Forms.Control
ReDim registro(12)


mysql = "SELECT CENTROS1.NOMBR, CENTROS1.DIREC, CENTROS1.LOCALIDAD,
CENTROS1.PROVI, CENTROS1.DPOST, CENTROS1.TELEF, CENTROS1.EMAIL,
CENTROS1.NUFAX, CENTROS1.CLASE, CENTROS1.AULAS_CURSO, CENTROS1.PREFERENTE,
CENTROS1.CONGREGACION, CENTROS1.REEMBOLSO"
mysql = mysql & " FROM CENTROS1 where centros1.KLAVE = '" &
Clave.Text & "';"
Dim myReader As OleDbDataReader
Dim myConnection As New OleDbConnection(CadenaConexion)
Dim myCommand As New OleDbCommand(mysql, myConnection)
myCommand.Connection.Open()
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
While myReader.Read()
For x = 0 To 12
registro(x) = myReader.Item(x).ToString
Next
End While
myReader.Close() : myConnection.Close() : myCommand.Dispose() ':

For Each tb In Me.Controls
If TypeOf tb Is TextBox Then
If tb.TabIndex <= 12 Then
tb.Text = registro(tb.TabIndex)
End If
End If
Next


ESTAS 3 FUNCIONES SON LAS Q GASTO CASI SIEMPRE EN MI APLICACIÓN. LAS PONGO
POR SI VEIS MEJORAS PARA Q FUNCIONE MAS RAPIDO O SI CON ESTO SE PUEDEN HACER
LAS CONSULTAS PREPARADAS Q ME DECIAS.
GRACIAS!

escribió en el mensaje
news:
Hola!

Viendo tu codigo a mi solo se me ocurre una cosa. Tampoco estoy seguro
que te vaya a mejorar el rendimiento de la aplicacion pero no me
extrañaria nada que si que se mejorase.
A ver... en la primera funcion: Gestionar, no necesitas iniciar una
transaccion. Las sentencias SQL de por si solas ya estan incluidas en
una transaccion. No necesitas crear una especifica para UNA sola
sentencia SQL.
Otra cosa es que vayas a ejecutar dos sentencias SQL seguidas y quieras
asegurarte de que o se cumplen las dos o no se cumple ninguna, en cuya
caso esta justificadisimo meterlas en una transaccion.
Otra cosa que cambiaria es poner la conexion en un Singleton (digamos
una variable global a la aplicacion): se abre al arrancar el programa y
se cierra al finalizarlo, de tal manera que tu funcion seria algo asi:

Public Sub Gestionar(ByVal sql As String)
Dim Comando As OleDbCommand = New OleDbCommand
Comando.Connection = ConexionGlobal ' Objeto de conexion global
Try
Comando.CommandText = sql
Comando.ExecuteNonQuery()
Catch Errorcito As Exception
MsgBox("Operación no realizada", MsgBoxStyle.Critical,
"Error de
la aplicación")
End Try
End Sub

A ver, lo de las transacciones lo puedes probar enseguida, no te va a
tocar mucho codigo y lo mismo le ves una mejora.
Lo otro es quizas un poco mas complicado de realizar, aunque tampoco
mucho.

Por ultimo, si realizas constantemente las mismas consultas yo
consideraria crear consultas preparadas. Estas son unas consultas
precompiladas a las que solo le tienes que especificar los parametros
definidos antes de ejecutarlas. Son muy rapidas y seguramente mejoren
el rendimiento de la aplicacion, pero son mas costosas de implementar.

Espero que todo esto te ayude
Saludos
Roberto M. Oliva


Sonia ha escrito:

a ver si podeis solucionar mi duda.
cuando entre a trabajar en una empresa (editorial) habia u programa hecho


en
vb6 q usaban 20 operadoras y la bd es acces97 y estaba en un pc servidor.
todos los ordenadores son xp menos el servidor q es win 2000.

cuando llegue querian hacer mejoras en esa aplicacion q basicamente


consiste
en consultar colegios, hacer pedidos...en definitiva consultar y modificar
la bd acces y mostrar la informacion a traves de textbox, datagrids y
listview

en vez de seguir con esta aplicacion en vb6 , como no la habia hecho yo y
cada uno entiende lo q hace, empeze a hacerla de nuevo con el microsoft
visual studio .net 2003 y asi he hecho las mejoras incluso otra aplicacion


q
consiste en ampliar la q tenia para tratar los temas de facturacion,
albaranes control de stock, etiquetas en crystal, control de acceso de las
operadoras etc

el problema llego cuando se ponen todas en la aplicacion ya q si la


comparo
con la del vb6, esta del .net es bastante mas lenta. al hacer alguna
modificacion, se actueliza el listview o lo q sea y eso lleva unos


segundos.
sobretodo el formulario principal q ponen un codigo de un colegio y se
tienen q llenar 4 datagrids y un registro(10 textbox)

entonces ahora me planteo como es posible si se supone q el .net tiene
bastantes mejoras y teoricamente va bastante mas rapido, como es en mi


caso
totalmente contrario. ya se q lo ideal seria hacer la bd sql pero eso de
momento no es posible.

puede ser q no haya exprimido el .net y q no haya hecho la aplicacion de


la
forma mas eficaz? (la verdad es q es mi primera aplicacion)

y otra cosa:
puede ser tb la forma de conexion a la bd? yo lo q hago es conectar a la


bd
una vez entro en la aplicacion. eso lo he puesto en un modulo donde pongo
mas funciones como las vaiables globales, el llenar un datagrid...etc

no se si seria mejor y si se puede hacer la conexion en cada formulario


y/o
solo conectar las tablas q te hicieran falta para ese form. no se si esto
sera posible.
esto ultimo me vendria bien para q las tablas referentes a la facturacion
solo se conectaran a la bd en la 2º aplicacion, ya q al generar la factura
tengo q ir guardando todas las lineas de un listview y cuesta bastante si
son muchas.

queria saber, aparte de opiniones sobre pq puede ir mas lento en vb .net q
envb6, si es posible q al hacer la conexion no influya en todas las tablas
para asi ir mas rapido o si para cada cambio q se haya de la bd solo se
active/conecte la tabla en cuestion en vez de toda la bd hago casi todas


las
coenxiones usando estas funciones(os las pongo x si sabeis mejoras o si
se puede cambiar lo de la conexion), ya q casi todos los ejemplos q veo


son
usando sql
Gracias!

Imports System.Data.OleDb
Sub main()
Path1 = System.IO.Path.GetFullPath("\\Equipo3\C\DYLR\")
ArchivoDatos = path1 & "dyla.mdb"
CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
ArchivoDatos & ";Persist Security Info=False"
Dim frm As New principal
frm.ShowDialog()
End Sub

'funciones
Public Sub Gestionar(ByVal sql As String)
Dim conexion As New OleDb.OleDbConnection
conexion.ConnectionString = CadenaConexion
conexion.Open()
Dim Comando As OleDbCommand = New OleDbCommand
Comando.Connection = conexion
Comando.Transaction = conexion.BeginTransaction
Try
Comando.CommandText = sql
Comando.ExecuteNonQuery()
Comando.Transaction.Commit()
Correcto = True
Catch Errorcito As Exception
Comando.Transaction.Rollback()
Correcto = False
MsgBox("Operación no realizada", MsgBoxStyle.Critical, "Error


de
la aplicación")
Finally
conexion.Close()
conexion.Dispose()
End Try
End Sub

Public Sub CrearMiOleDbCommand(ByVal myExecuteQuery As String, ByVal
myConnectionString As String)
Try
Dim myConnection As New OleDbConnection(myConnectionString)
Dim myCommand As New OleDbCommand(myExecuteQuery,


myConnection)

myCommand.Connection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
myConnection.Dispose()
Catch ee As Exception
MessageBox.Show(ee.Message)
End Try
End Sub


Respuesta Responder a este mensaje
#7 floyd303
29/09/2006 - 11:49 | Informe spam
Hola Sonia!

Asi, a bote pronto, se me ocurre hacerte una pregunta:
Porque utilizas tantos DoEvents en la funcion MySqlCargarVista ?? . El
actualizar los controles es un proceso muy costoso.
Antes de seguir porque no pruebas a cronometrar cuanto tarda en
llenarte la vista con todos los DoEvents que has puesto y luego sin
ellos. A mi me da que te va a sorprender.
Si la diferencia es abismal (que mucho me temo que lo va a ser),
buscate otra manera de entretener al usuario mientras se le carga la
vista, porque la que estas utilizando no es nada eficaz.
Por ejemplo... una barra de pregreso encima de la lista, o algo asi.
Pero me da que estas sacrificando mucho tiempo por actualizarle la
vista al usuario y, bajo mi punto de vista, no merece la pena.

Si me das un poco mas de tiempo buscare lo de los comandos preparados
para mostrarte un ejemplo.

Un saludo
Roberto M. Oliva



Sonia ha escrito:

Donde puedo ver algun ejemplo de cómo hacer lo de las consultas preparadas?
Yo en la mayoria de casos lo q hago es dado un codigo llenar varios
listview, y en otros datagrids, dimplemente poniendo la consulta y llamar a
la funcion q lo carga. (creo q las funciones q gasto si son eficaces, de
todas formas voy a poner las mas frecuentes)
Te pongo las 3 funciones q siempre uso para ver si hay algo grave q provoque
lentitud en el programa o para q me digas si desde estas funciones puedo
hacer lo de las consutlas rapidas.
Por ejemplo en el form principal donde se cargan todos los datos del colegio
lo q hago es esto

'*******PARA LOS LISTVIEW
Private Sub leer_registro2(ByVal colegio As String) 'cargo 4 listview

Dim nuevo As cargalist 'cargalist es un modulo


mysql = "select ID,NOMBRE , APELLIDOS,CARGO,HORARIO,VARIOS,EMAIL"
mysql = mysql & " FROM (Contactos) WHERE ID_COL='" & cole & "' "
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView1)

mysql = "select CLAVE, FECHAS , NOMBRX ,APELSX , XESCR1 ,XLECT1 , XMATE1,
XORTO1 , MATVAL , MATESO , OTROS, COMENTARIO from TELEMARKETING where
KLVCOL='" & cole & "'
ORDER BY TELEMARKETING.CLAVE DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView2)

mysql = "select ID, FECHA ,OPERADORA , COMENTARIO "
mysql = mysql & " FROM (TELEM_COMENTARIOS) where COLEGIO='" & cole & "'
ORDER BY TELEM_COMENTARIOS.ID DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView3)

mysql = "select
CLAVE,FECHAS,XESCR1,XLECT1,XMATE1,XORTO1,MATVAL,MATESO,NOMBRX,APELSX,OTROS,
COMENTARIO from MUESTRAS_PEDIDO where KLVCOL='" & cole & "'"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView4)

End Sub

'LA FUNCION MYSQLCARGARVISTA ES:
Public Overloads Shared Sub MySqlCargarVista(ByVal myConnectionString As
String, ByVal mySelectQuery As String, ByVal myControl As ListView)

Dim Ordenar As Boolean = True
Dim AnchoColumnas As String = Nothing
Dim Alineaciones() As HorizontalAlignment = Nothing
Dim ModoVista As View = View.Details
Dim Celdas As Boolean = True 'False
Dim MaxReg As Short = 500
Dim MostrarError As Boolean = True

Dim DataAdapter As OleDbDataAdapter = New
OleDbDataAdapter(myConnectionString, CadenaConexion)

Dim Tabla As DataTable
Dim TmpAnchoColumna() As String
Dim AnchoColumna() As Integer
Dim UnaVez As Boolean = False
Dim Alineacion As HorizontalAlignment
Dim I As Integer = 0
Dim J As Long
Dim ItemLista As New ListViewItem

Try
ReDim TmpAnchoColumna(0)
ReDim AnchoColumna(0)
If Not AnchoColumnas Is Nothing Then
Application.DoEvents()
TmpAnchoColumna = AnchoColumnas.Split(",",
AnchoColumnas.Length)
AnchoColumna = ConvertirEnArray(TmpAnchoColumna)
Application.DoEvents()
End If

DataAdapter = New OleDbDataAdapter(mySelectQuery,
myConnectionString)
Tabla = New DataTable
DataAdapter.Fill(Tabla)
Application.DoEvents()
If Tabla.Rows.Count < MaxReg Then
MaxReg = Tabla.Rows.Count - 1
End If
myControl.Items.Clear()
For J = 0 To MaxReg
If Not UnaVez Then
Application.DoEvents()
UnaVez = True
End If
For I = 0 To myControl.Columns.Count - 1
If I = 0 Then
ItemLista > myControl.Items.Add(Tabla.Rows(J)(I).ToString)
Else
ItemLista.SubItems.Add(Tabla.Rows(J)(I).ToString)
End If
Application.DoEvents()
Next
Application.DoEvents()
Next
If Ordenar Then
myControl.Sorting = SortOrder.Ascending
myControl.Sort()
Application.DoEvents()
End If
myControl.Refresh()
myControl.Show()
Catch ex As Exception
myControl.Items.Clear()
myControl.Columns.Clear()
If MostrarError Then
MsgBox("Error. -Consulte con el administrador del sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End If
End Try
'****************

'********* PARA LOS DATAGRID USO:

Dim nuevo As cargadatagrid

mysql = "select * from LIBRERIAS where PROVINCIA='" & TextBox1.Text & "'
ORDER BY DISTRITO"
nuevo.Carga(mysql, "LIBRERIAS", DataGrid1)
DataGrid1.ReadOnly = True

'LA FUNCION CARGA ES:

Public Overloads Shared Sub Carga(ByVal sql As String, ByVal tabla As
String, ByVal dataG As DataGrid, Optional ByVal titulo As String = "")
Try
Dim DataAdapter As OleDbDataAdapter = New OleDbDataAdapter(sql,
CadenaConexion)
Dim MiData As DataSet = New DataSet
Dim datav As New DataView
DataAdapter.Fill(MiData, tabla)

datav.Table = MiData.Tables(tabla)
dataG.DataSource = datav

If titulo <> "" Then dataG.CaptionText = titulo
Catch Errores As Exception
MsgBox("Error -- Consulte con el administrador del sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End Try
End Sub

*************



'******POR ULTIMO PARA LLENAR UNA SERIE DE TEXTBOX HAGO ESTO:
Dim x As Int16
Dim tb As System.Windows.Forms.Control
ReDim registro(12)


mysql = "SELECT CENTROS1.NOMBR, CENTROS1.DIREC, CENTROS1.LOCALIDAD,
CENTROS1.PROVI, CENTROS1.DPOST, CENTROS1.TELEF, CENTROS1.EMAIL,
CENTROS1.NUFAX, CENTROS1.CLASE, CENTROS1.AULAS_CURSO, CENTROS1.PREFERENTE,
CENTROS1.CONGREGACION, CENTROS1.REEMBOLSO"
mysql = mysql & " FROM CENTROS1 where centros1.KLAVE = '" &
Clave.Text & "';"
Dim myReader As OleDbDataReader
Dim myConnection As New OleDbConnection(CadenaConexion)
Dim myCommand As New OleDbCommand(mysql, myConnection)
myCommand.Connection.Open()
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
While myReader.Read()
For x = 0 To 12
registro(x) = myReader.Item(x).ToString
Next
End While
myReader.Close() : myConnection.Close() : myCommand.Dispose() ':

For Each tb In Me.Controls
If TypeOf tb Is TextBox Then
If tb.TabIndex <= 12 Then
tb.Text = registro(tb.TabIndex)
End If
End If
Next


ESTAS 3 FUNCIONES SON LAS Q GASTO CASI SIEMPRE EN MI APLICACIÓN. LAS PONGO
POR SI VEIS MEJORAS PARA Q FUNCIONE MAS RAPIDO O SI CON ESTO SE PUEDEN HACER
LAS CONSULTAS PREPARADAS Q ME DECIAS.
GRACIAS!

escribió en el mensaje
news:
Hola!

Viendo tu codigo a mi solo se me ocurre una cosa. Tampoco estoy seguro
que te vaya a mejorar el rendimiento de la aplicacion pero no me
extrañaria nada que si que se mejorase.
A ver... en la primera funcion: Gestionar, no necesitas iniciar una
transaccion. Las sentencias SQL de por si solas ya estan incluidas en
una transaccion. No necesitas crear una especifica para UNA sola
sentencia SQL.
Otra cosa es que vayas a ejecutar dos sentencias SQL seguidas y quieras
asegurarte de que o se cumplen las dos o no se cumple ninguna, en cuya
caso esta justificadisimo meterlas en una transaccion.
Otra cosa que cambiaria es poner la conexion en un Singleton (digamos
una variable global a la aplicacion): se abre al arrancar el programa y
se cierra al finalizarlo, de tal manera que tu funcion seria algo asi:

Public Sub Gestionar(ByVal sql As String)
Dim Comando As OleDbCommand = New OleDbCommand
Comando.Connection = ConexionGlobal ' Objeto de conexion global
Try
Comando.CommandText = sql
Comando.ExecuteNonQuery()
Catch Errorcito As Exception
MsgBox("Operación no realizada", MsgBoxStyle.Critical,
"Error de
la aplicación")
End Try
End Sub

A ver, lo de las transacciones lo puedes probar enseguida, no te va a
tocar mucho codigo y lo mismo le ves una mejora.
Lo otro es quizas un poco mas complicado de realizar, aunque tampoco
mucho.

Por ultimo, si realizas constantemente las mismas consultas yo
consideraria crear consultas preparadas. Estas son unas consultas
precompiladas a las que solo le tienes que especificar los parametros
definidos antes de ejecutarlas. Son muy rapidas y seguramente mejoren
el rendimiento de la aplicacion, pero son mas costosas de implementar.

Espero que todo esto te ayude
Saludos
Roberto M. Oliva


Sonia ha escrito:

> a ver si podeis solucionar mi duda.
> cuando entre a trabajar en una empresa (editorial) habia u programa hecho
en
> vb6 q usaban 20 operadoras y la bd es acces97 y estaba en un pc servidor.
> todos los ordenadores son xp menos el servidor q es win 2000.
>
> cuando llegue querian hacer mejoras en esa aplicacion q basicamente
consiste
> en consultar colegios, hacer pedidos...en definitiva consultar y modificar
> la bd acces y mostrar la informacion a traves de textbox, datagrids y
> listview
>
> en vez de seguir con esta aplicacion en vb6 , como no la habia hecho yo y
> cada uno entiende lo q hace, empeze a hacerla de nuevo con el microsoft
> visual studio .net 2003 y asi he hecho las mejoras incluso otra aplicacion
q
> consiste en ampliar la q tenia para tratar los temas de facturacion,
> albaranes control de stock, etiquetas en crystal, control de acceso de las
> operadoras etc
>
> el problema llego cuando se ponen todas en la aplicacion ya q si la
comparo
> con la del vb6, esta del .net es bastante mas lenta. al hacer alguna
> modificacion, se actueliza el listview o lo q sea y eso lleva unos
segundos.
> sobretodo el formulario principal q ponen un codigo de un colegio y se
> tienen q llenar 4 datagrids y un registro(10 textbox)
>
> entonces ahora me planteo como es posible si se supone q el .net tiene
> bastantes mejoras y teoricamente va bastante mas rapido, como es en mi
caso
> totalmente contrario. ya se q lo ideal seria hacer la bd sql pero eso de
> momento no es posible.
>
> puede ser q no haya exprimido el .net y q no haya hecho la aplicacion de
la
> forma mas eficaz? (la verdad es q es mi primera aplicacion)
>
> y otra cosa:
> puede ser tb la forma de conexion a la bd? yo lo q hago es conectar a la
bd
> una vez entro en la aplicacion. eso lo he puesto en un modulo donde pongo
> mas funciones como las vaiables globales, el llenar un datagrid...etc
>
> no se si seria mejor y si se puede hacer la conexion en cada formulario
y/o
> solo conectar las tablas q te hicieran falta para ese form. no se si esto
> sera posible.
> esto ultimo me vendria bien para q las tablas referentes a la facturacion
> solo se conectaran a la bd en la 2º aplicacion, ya q al generar la factura
> tengo q ir guardando todas las lineas de un listview y cuesta bastante si
> son muchas.
>
> queria saber, aparte de opiniones sobre pq puede ir mas lento en vb .net q
> envb6, si es posible q al hacer la conexion no influya en todas las tablas
> para asi ir mas rapido o si para cada cambio q se haya de la bd solo se
> active/conecte la tabla en cuestion en vez de toda la bd hago casi todas
las
> coenxiones usando estas funciones(os las pongo x si sabeis mejoras o si
> se puede cambiar lo de la conexion), ya q casi todos los ejemplos q veo
son
> usando sql
> Gracias!
>
> Imports System.Data.OleDb
> Sub main()
> Path1 = System.IO.Path.GetFullPath("\\Equipo3\C\DYLR\")
> ArchivoDatos = path1 & "dyla.mdb"
> CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
> ArchivoDatos & ";Persist Security Info=False"
> Dim frm As New principal
> frm.ShowDialog()
> End Sub
>
> 'funciones
> Public Sub Gestionar(ByVal sql As String)
> Dim conexion As New OleDb.OleDbConnection
> conexion.ConnectionString = CadenaConexion
> conexion.Open()
> Dim Comando As OleDbCommand = New OleDbCommand
> Comando.Connection = conexion
> Comando.Transaction = conexion.BeginTransaction
> Try
> Comando.CommandText = sql
> Comando.ExecuteNonQuery()
> Comando.Transaction.Commit()
> Correcto = True
> Catch Errorcito As Exception
> Comando.Transaction.Rollback()
> Correcto = False
> MsgBox("Operación no realizada", MsgBoxStyle.Critical, "Error
de
> la aplicación")
> Finally
> conexion.Close()
> conexion.Dispose()
> End Try
> End Sub
>
> Public Sub CrearMiOleDbCommand(ByVal myExecuteQuery As String, ByVal
> myConnectionString As String)
> Try
> Dim myConnection As New OleDbConnection(myConnectionString)
> Dim myCommand As New OleDbCommand(myExecuteQuery,
myConnection)
>
> myCommand.Connection.Open()
> myCommand.ExecuteNonQuery()
> myConnection.Close()
> myConnection.Dispose()
> Catch ee As Exception
> MessageBox.Show(ee.Message)
> End Try
> End Sub
>
>
Respuesta Responder a este mensaje
#8 Sonia
29/09/2006 - 12:16 | Informe spam
ok. gracias
ahora lo pruebo
de todas formas agradeceria el ejemplo

escribió en el mensaje
news:

Hola Sonia!

Asi, a bote pronto, se me ocurre hacerte una pregunta:
Porque utilizas tantos DoEvents en la funcion MySqlCargarVista ?? . El
actualizar los controles es un proceso muy costoso.
Antes de seguir porque no pruebas a cronometrar cuanto tarda en
llenarte la vista con todos los DoEvents que has puesto y luego sin
ellos. A mi me da que te va a sorprender.
Si la diferencia es abismal (que mucho me temo que lo va a ser),
buscate otra manera de entretener al usuario mientras se le carga la
vista, porque la que estas utilizando no es nada eficaz.
Por ejemplo... una barra de pregreso encima de la lista, o algo asi.
Pero me da que estas sacrificando mucho tiempo por actualizarle la
vista al usuario y, bajo mi punto de vista, no merece la pena.

Si me das un poco mas de tiempo buscare lo de los comandos preparados
para mostrarte un ejemplo.

Un saludo
Roberto M. Oliva



Sonia ha escrito:

Donde puedo ver algun ejemplo de cómo hacer lo de las consultas


preparadas?
Yo en la mayoria de casos lo q hago es dado un codigo llenar varios
listview, y en otros datagrids, dimplemente poniendo la consulta y llamar


a
la funcion q lo carga. (creo q las funciones q gasto si son eficaces, de
todas formas voy a poner las mas frecuentes)
Te pongo las 3 funciones q siempre uso para ver si hay algo grave q


provoque
lentitud en el programa o para q me digas si desde estas funciones puedo
hacer lo de las consutlas rapidas.
Por ejemplo en el form principal donde se cargan todos los datos del


colegio
lo q hago es esto

'*******PARA LOS LISTVIEW
Private Sub leer_registro2(ByVal colegio As String) 'cargo 4 listview

Dim nuevo As cargalist 'cargalist es un modulo


mysql = "select ID,NOMBRE , APELLIDOS,CARGO,HORARIO,VARIOS,EMAIL"
mysql = mysql & " FROM (Contactos) WHERE ID_COL='" & cole & "' "
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView1)

mysql = "select CLAVE, FECHAS , NOMBRX ,APELSX , XESCR1 ,XLECT1 ,


XMATE1,
XORTO1 , MATVAL , MATESO , OTROS, COMENTARIO from TELEMARKETING where
KLVCOL='" & cole & "'
ORDER BY TELEMARKETING.CLAVE DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView2)

mysql = "select ID, FECHA ,OPERADORA , COMENTARIO "
mysql = mysql & " FROM (TELEM_COMENTARIOS) where COLEGIO='" & cole & "'
ORDER BY TELEM_COMENTARIOS.ID DESC"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView3)

mysql = "select



CLAVE,FECHAS,XESCR1,XLECT1,XMATE1,XORTO1,MATVAL,MATESO,NOMBRX,APELSX,OTROS,
COMENTARIO from MUESTRAS_PEDIDO where KLVCOL='" & cole & "'"
nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView4)

End Sub

'LA FUNCION MYSQLCARGARVISTA ES:
Public Overloads Shared Sub MySqlCargarVista(ByVal myConnectionString As
String, ByVal mySelectQuery As String, ByVal myControl As ListView)

Dim Ordenar As Boolean = True
Dim AnchoColumnas As String = Nothing
Dim Alineaciones() As HorizontalAlignment = Nothing
Dim ModoVista As View = View.Details
Dim Celdas As Boolean = True 'False
Dim MaxReg As Short = 500
Dim MostrarError As Boolean = True

Dim DataAdapter As OleDbDataAdapter = New
OleDbDataAdapter(myConnectionString, CadenaConexion)

Dim Tabla As DataTable
Dim TmpAnchoColumna() As String
Dim AnchoColumna() As Integer
Dim UnaVez As Boolean = False
Dim Alineacion As HorizontalAlignment
Dim I As Integer = 0
Dim J As Long
Dim ItemLista As New ListViewItem

Try
ReDim TmpAnchoColumna(0)
ReDim AnchoColumna(0)
If Not AnchoColumnas Is Nothing Then
Application.DoEvents()
TmpAnchoColumna = AnchoColumnas.Split(",",
AnchoColumnas.Length)
AnchoColumna = ConvertirEnArray(TmpAnchoColumna)
Application.DoEvents()
End If

DataAdapter = New OleDbDataAdapter(mySelectQuery,
myConnectionString)
Tabla = New DataTable
DataAdapter.Fill(Tabla)
Application.DoEvents()
If Tabla.Rows.Count < MaxReg Then
MaxReg = Tabla.Rows.Count - 1
End If
myControl.Items.Clear()
For J = 0 To MaxReg
If Not UnaVez Then
Application.DoEvents()
UnaVez = True
End If
For I = 0 To myControl.Columns.Count - 1
If I = 0 Then
ItemLista > myControl.Items.Add(Tabla.Rows(J)(I).ToString)
Else
ItemLista.SubItems.Add(Tabla.Rows(J)(I).ToString)
End If
Application.DoEvents()
Next
Application.DoEvents()
Next
If Ordenar Then
myControl.Sorting = SortOrder.Ascending
myControl.Sort()
Application.DoEvents()
End If
myControl.Refresh()
myControl.Show()
Catch ex As Exception
myControl.Items.Clear()
myControl.Columns.Clear()
If MostrarError Then
MsgBox("Error. -Consulte con el administrador del


sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End If
End Try
'****************

'********* PARA LOS DATAGRID USO:

Dim nuevo As cargadatagrid

mysql = "select * from LIBRERIAS where PROVINCIA='" & TextBox1.Text & "'
ORDER BY DISTRITO"
nuevo.Carga(mysql, "LIBRERIAS", DataGrid1)
DataGrid1.ReadOnly = True

'LA FUNCION CARGA ES:

Public Overloads Shared Sub Carga(ByVal sql As String, ByVal tabla As
String, ByVal dataG As DataGrid, Optional ByVal titulo As String = "")
Try
Dim DataAdapter As OleDbDataAdapter = New


OleDbDataAdapter(sql,
CadenaConexion)
Dim MiData As DataSet = New DataSet
Dim datav As New DataView
DataAdapter.Fill(MiData, tabla)

datav.Table = MiData.Tables(tabla)
dataG.DataSource = datav

If titulo <> "" Then dataG.CaptionText = titulo
Catch Errores As Exception
MsgBox("Error -- Consulte con el administrador del sistema",
MsgBoxStyle.Information.OKOnly, "Error")
End Try
End Sub

*************



'******POR ULTIMO PARA LLENAR UNA SERIE DE TEXTBOX HAGO ESTO:
Dim x As Int16
Dim tb As System.Windows.Forms.Control
ReDim registro(12)


mysql = "SELECT CENTROS1.NOMBR, CENTROS1.DIREC,


CENTROS1.LOCALIDAD,
CENTROS1.PROVI, CENTROS1.DPOST, CENTROS1.TELEF, CENTROS1.EMAIL,
CENTROS1.NUFAX, CENTROS1.CLASE, CENTROS1.AULAS_CURSO, CENTROS1.PREFERENTE,
CENTROS1.CONGREGACION, CENTROS1.REEMBOLSO"
mysql = mysql & " FROM CENTROS1 where centros1.KLAVE = '" &
Clave.Text & "';"
Dim myReader As OleDbDataReader
Dim myConnection As New OleDbConnection(CadenaConexion)
Dim myCommand As New OleDbCommand(mysql, myConnection)
myCommand.Connection.Open()
myReader myCommand.ExecuteReader(CommandBehavior.CloseConnection)
While myReader.Read()
For x = 0 To 12
registro(x) = myReader.Item(x).ToString
Next
End While
myReader.Close() : myConnection.Close() : myCommand.Dispose() ':

For Each tb In Me.Controls
If TypeOf tb Is TextBox Then
If tb.TabIndex <= 12 Then
tb.Text = registro(tb.TabIndex)
End If
End If
Next


ESTAS 3 FUNCIONES SON LAS Q GASTO CASI SIEMPRE EN MI APLICACIÓN. LAS PONGO
POR SI VEIS MEJORAS PARA Q FUNCIONE MAS RAPIDO O SI CON ESTO SE PUEDEN


HACER
LAS CONSULTAS PREPARADAS Q ME DECIAS.
GRACIAS!

escribió en el mensaje
news:
Hola!

Viendo tu codigo a mi solo se me ocurre una cosa. Tampoco estoy seguro
que te vaya a mejorar el rendimiento de la aplicacion pero no me
extrañaria nada que si que se mejorase.
A ver... en la primera funcion: Gestionar, no necesitas iniciar una
transaccion. Las sentencias SQL de por si solas ya estan incluidas en
una transaccion. No necesitas crear una especifica para UNA sola
sentencia SQL.
Otra cosa es que vayas a ejecutar dos sentencias SQL seguidas y quieras
asegurarte de que o se cumplen las dos o no se cumple ninguna, en cuya
caso esta justificadisimo meterlas en una transaccion.
Otra cosa que cambiaria es poner la conexion en un Singleton (digamos
una variable global a la aplicacion): se abre al arrancar el programa y
se cierra al finalizarlo, de tal manera que tu funcion seria algo asi:

Public Sub Gestionar(ByVal sql As String)
Dim Comando As OleDbCommand = New OleDbCommand
Comando.Connection = ConexionGlobal ' Objeto de conexion global
Try
Comando.CommandText = sql
Comando.ExecuteNonQuery()
Catch Errorcito As Exception
MsgBox("Operación no realizada", MsgBoxStyle.Critical,
"Error de
la aplicación")
End Try
End Sub

A ver, lo de las transacciones lo puedes probar enseguida, no te va a
tocar mucho codigo y lo mismo le ves una mejora.
Lo otro es quizas un poco mas complicado de realizar, aunque tampoco
mucho.

Por ultimo, si realizas constantemente las mismas consultas yo
consideraria crear consultas preparadas. Estas son unas consultas
precompiladas a las que solo le tienes que especificar los parametros
definidos antes de ejecutarlas. Son muy rapidas y seguramente mejoren
el rendimiento de la aplicacion, pero son mas costosas de implementar.

Espero que todo esto te ayude
Saludos
Roberto M. Oliva


Sonia ha escrito:

> a ver si podeis solucionar mi duda.
> cuando entre a trabajar en una empresa (editorial) habia u programa


hecho
en
> vb6 q usaban 20 operadoras y la bd es acces97 y estaba en un pc


servidor.
> todos los ordenadores son xp menos el servidor q es win 2000.
>
> cuando llegue querian hacer mejoras en esa aplicacion q basicamente
consiste
> en consultar colegios, hacer pedidos...en definitiva consultar y


modificar
> la bd acces y mostrar la informacion a traves de textbox, datagrids y
> listview
>
> en vez de seguir con esta aplicacion en vb6 , como no la habia hecho yo


y
> cada uno entiende lo q hace, empeze a hacerla de nuevo con el microsoft
> visual studio .net 2003 y asi he hecho las mejoras incluso otra


aplicacion
q
> consiste en ampliar la q tenia para tratar los temas de facturacion,
> albaranes control de stock, etiquetas en crystal, control de acceso de


las
> operadoras etc
>
> el problema llego cuando se ponen todas en la aplicacion ya q si la
comparo
> con la del vb6, esta del .net es bastante mas lenta. al hacer alguna
> modificacion, se actueliza el listview o lo q sea y eso lleva unos
segundos.
> sobretodo el formulario principal q ponen un codigo de un colegio y se
> tienen q llenar 4 datagrids y un registro(10 textbox)
>
> entonces ahora me planteo como es posible si se supone q el .net tiene
> bastantes mejoras y teoricamente va bastante mas rapido, como es en mi
caso
> totalmente contrario. ya se q lo ideal seria hacer la bd sql pero eso de
> momento no es posible.
>
> puede ser q no haya exprimido el .net y q no haya hecho la aplicacion de
la
> forma mas eficaz? (la verdad es q es mi primera aplicacion)
>
> y otra cosa:
> puede ser tb la forma de conexion a la bd? yo lo q hago es conectar a la
bd
> una vez entro en la aplicacion. eso lo he puesto en un modulo donde


pongo
> mas funciones como las vaiables globales, el llenar un datagrid...etc
>
> no se si seria mejor y si se puede hacer la conexion en cada formulario
y/o
> solo conectar las tablas q te hicieran falta para ese form. no se si


esto
> sera posible.
> esto ultimo me vendria bien para q las tablas referentes a la


facturacion
> solo se conectaran a la bd en la 2º aplicacion, ya q al generar la


factura
> tengo q ir guardando todas las lineas de un listview y cuesta bastante


si
> son muchas.
>
> queria saber, aparte de opiniones sobre pq puede ir mas lento en vb .net


q
> envb6, si es posible q al hacer la conexion no influya en todas las


tablas
> para asi ir mas rapido o si para cada cambio q se haya de la bd solo se
> active/conecte la tabla en cuestion en vez de toda la bd hago casi todas
las
> coenxiones usando estas funciones(os las pongo x si sabeis mejoras o si
> se puede cambiar lo de la conexion), ya q casi todos los ejemplos q veo
son
> usando sql
> Gracias!
>
> Imports System.Data.OleDb
> Sub main()
> Path1 = System.IO.Path.GetFullPath("\\Equipo3\C\DYLR\")
> ArchivoDatos = path1 & "dyla.mdb"
> CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
> ArchivoDatos & ";Persist Security Info=False"
> Dim frm As New principal
> frm.ShowDialog()
> End Sub
>
> 'funciones
> Public Sub Gestionar(ByVal sql As String)
> Dim conexion As New OleDb.OleDbConnection
> conexion.ConnectionString = CadenaConexion
> conexion.Open()
> Dim Comando As OleDbCommand = New OleDbCommand
> Comando.Connection = conexion
> Comando.Transaction = conexion.BeginTransaction
> Try
> Comando.CommandText = sql
> Comando.ExecuteNonQuery()
> Comando.Transaction.Commit()
> Correcto = True
> Catch Errorcito As Exception
> Comando.Transaction.Rollback()
> Correcto = False
> MsgBox("Operación no realizada", MsgBoxStyle.Critical,


"Error
de
> la aplicación")
> Finally
> conexion.Close()
> conexion.Dispose()
> End Try
> End Sub
>
> Public Sub CrearMiOleDbCommand(ByVal myExecuteQuery As String, ByVal
> myConnectionString As String)
> Try
> Dim myConnection As New OleDbConnection(myConnectionString)
> Dim myCommand As New OleDbCommand(myExecuteQuery,
myConnection)
>
> myCommand.Connection.Open()
> myCommand.ExecuteNonQuery()
> myConnection.Close()
> myConnection.Dispose()
> Catch ee As Exception
> MessageBox.Show(ee.Message)
> End Try
> End Sub
>
>
Respuesta Responder a este mensaje
#9 floyd303
29/09/2006 - 13:33 | Informe spam
Hola Sonia!

He puesto y explicado el ejemplo en mi blog:

http://www.robertooliva.com/?pU

Esta en C#, pero no creo que te sea dificil portarlo a VB.NET

Espero que te ayude
Un saludo
Roberto M. Oliva

Sonia ha escrito:

ok. gracias
ahora lo pruebo
de todas formas agradeceria el ejemplo

escribió en el mensaje
news:

Hola Sonia!

Asi, a bote pronto, se me ocurre hacerte una pregunta:
Porque utilizas tantos DoEvents en la funcion MySqlCargarVista ?? . El
actualizar los controles es un proceso muy costoso.
Antes de seguir porque no pruebas a cronometrar cuanto tarda en
llenarte la vista con todos los DoEvents que has puesto y luego sin
ellos. A mi me da que te va a sorprender.
Si la diferencia es abismal (que mucho me temo que lo va a ser),
buscate otra manera de entretener al usuario mientras se le carga la
vista, porque la que estas utilizando no es nada eficaz.
Por ejemplo... una barra de pregreso encima de la lista, o algo asi.
Pero me da que estas sacrificando mucho tiempo por actualizarle la
vista al usuario y, bajo mi punto de vista, no merece la pena.

Si me das un poco mas de tiempo buscare lo de los comandos preparados
para mostrarte un ejemplo.

Un saludo
Roberto M. Oliva



Sonia ha escrito:

> Donde puedo ver algun ejemplo de cómo hacer lo de las consultas
preparadas?
> Yo en la mayoria de casos lo q hago es dado un codigo llenar varios
> listview, y en otros datagrids, dimplemente poniendo la consulta y llamar
a
> la funcion q lo carga. (creo q las funciones q gasto si son eficaces, de
> todas formas voy a poner las mas frecuentes)
> Te pongo las 3 funciones q siempre uso para ver si hay algo grave q
provoque
> lentitud en el programa o para q me digas si desde estas funciones puedo
> hacer lo de las consutlas rapidas.
> Por ejemplo en el form principal donde se cargan todos los datos del
colegio
> lo q hago es esto
>
> '*******PARA LOS LISTVIEW
> Private Sub leer_registro2(ByVal colegio As String) 'cargo 4 listview
>
> Dim nuevo As cargalist 'cargalist es un modulo
>
>
> mysql = "select ID,NOMBRE , APELLIDOS,CARGO,HORARIO,VARIOS,EMAIL"
> mysql = mysql & " FROM (Contactos) WHERE ID_COL='" & cole & "' "
> nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView1)
>
> mysql = "select CLAVE, FECHAS , NOMBRX ,APELSX , XESCR1 ,XLECT1 ,
XMATE1,
> XORTO1 , MATVAL , MATESO , OTROS, COMENTARIO from TELEMARKETING where
> KLVCOL='" & cole & "'
> ORDER BY TELEMARKETING.CLAVE DESC"
> nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView2)
>
> mysql = "select ID, FECHA ,OPERADORA , COMENTARIO "
> mysql = mysql & " FROM (TELEM_COMENTARIOS) where COLEGIO='" & cole & "'
> ORDER BY TELEM_COMENTARIOS.ID DESC"
> nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView3)
>
> mysql = "select
>
CLAVE,FECHAS,XESCR1,XLECT1,XMATE1,XORTO1,MATVAL,MATESO,NOMBRX,APELSX,OTROS,
> COMENTARIO from MUESTRAS_PEDIDO where KLVCOL='" & cole & "'"
> nuevo.MySqlCargarVista(CadenaConexion, mysql, ListView4)
>
> End Sub
>
> 'LA FUNCION MYSQLCARGARVISTA ES:
> Public Overloads Shared Sub MySqlCargarVista(ByVal myConnectionString As
> String, ByVal mySelectQuery As String, ByVal myControl As ListView)
>
> Dim Ordenar As Boolean = True
> Dim AnchoColumnas As String = Nothing
> Dim Alineaciones() As HorizontalAlignment = Nothing
> Dim ModoVista As View = View.Details
> Dim Celdas As Boolean = True 'False
> Dim MaxReg As Short = 500
> Dim MostrarError As Boolean = True
>
> Dim DataAdapter As OleDbDataAdapter = New
> OleDbDataAdapter(myConnectionString, CadenaConexion)
>
> Dim Tabla As DataTable
> Dim TmpAnchoColumna() As String
> Dim AnchoColumna() As Integer
> Dim UnaVez As Boolean = False
> Dim Alineacion As HorizontalAlignment
> Dim I As Integer = 0
> Dim J As Long
> Dim ItemLista As New ListViewItem
>
> Try
> ReDim TmpAnchoColumna(0)
> ReDim AnchoColumna(0)
> If Not AnchoColumnas Is Nothing Then
> Application.DoEvents()
> TmpAnchoColumna = AnchoColumnas.Split(",",
> AnchoColumnas.Length)
> AnchoColumna = ConvertirEnArray(TmpAnchoColumna)
> Application.DoEvents()
> End If
>
> DataAdapter = New OleDbDataAdapter(mySelectQuery,
> myConnectionString)
> Tabla = New DataTable
> DataAdapter.Fill(Tabla)
> Application.DoEvents()
> If Tabla.Rows.Count < MaxReg Then
> MaxReg = Tabla.Rows.Count - 1
> End If
> myControl.Items.Clear()
> For J = 0 To MaxReg
> If Not UnaVez Then
> Application.DoEvents()
> UnaVez = True
> End If
> For I = 0 To myControl.Columns.Count - 1
> If I = 0 Then
> ItemLista > > myControl.Items.Add(Tabla.Rows(J)(I).ToString)
> Else
> ItemLista.SubItems.Add(Tabla.Rows(J)(I).ToString)
> End If
> Application.DoEvents()
> Next
> Application.DoEvents()
> Next
> If Ordenar Then
> myControl.Sorting = SortOrder.Ascending
> myControl.Sort()
> Application.DoEvents()
> End If
> myControl.Refresh()
> myControl.Show()
> Catch ex As Exception
> myControl.Items.Clear()
> myControl.Columns.Clear()
> If MostrarError Then
> MsgBox("Error. -Consulte con el administrador del
sistema",
> MsgBoxStyle.Information.OKOnly, "Error")
> End If
> End Try
> '****************
>
> '********* PARA LOS DATAGRID USO:
>
> Dim nuevo As cargadatagrid
>
> mysql = "select * from LIBRERIAS where PROVINCIA='" & TextBox1.Text & "'
> ORDER BY DISTRITO"
> nuevo.Carga(mysql, "LIBRERIAS", DataGrid1)
> DataGrid1.ReadOnly = True
>
> 'LA FUNCION CARGA ES:
>
> Public Overloads Shared Sub Carga(ByVal sql As String, ByVal tabla As
> String, ByVal dataG As DataGrid, Optional ByVal titulo As String = "")
> Try
> Dim DataAdapter As OleDbDataAdapter = New
OleDbDataAdapter(sql,
> CadenaConexion)
> Dim MiData As DataSet = New DataSet
> Dim datav As New DataView
> DataAdapter.Fill(MiData, tabla)
>
> datav.Table = MiData.Tables(tabla)
> dataG.DataSource = datav
>
> If titulo <> "" Then dataG.CaptionText = titulo
> Catch Errores As Exception
> MsgBox("Error -- Consulte con el administrador del sistema",
> MsgBoxStyle.Information.OKOnly, "Error")
> End Try
> End Sub
>
> *************
>
>
>
> '******POR ULTIMO PARA LLENAR UNA SERIE DE TEXTBOX HAGO ESTO:
> Dim x As Int16
> Dim tb As System.Windows.Forms.Control
> ReDim registro(12)
>
>
> mysql = "SELECT CENTROS1.NOMBR, CENTROS1.DIREC,
CENTROS1.LOCALIDAD,
> CENTROS1.PROVI, CENTROS1.DPOST, CENTROS1.TELEF, CENTROS1.EMAIL,
> CENTROS1.NUFAX, CENTROS1.CLASE, CENTROS1.AULAS_CURSO, CENTROS1.PREFERENTE,
> CENTROS1.CONGREGACION, CENTROS1.REEMBOLSO"
> mysql = mysql & " FROM CENTROS1 where centros1.KLAVE = '" &
> Clave.Text & "';"
> Dim myReader As OleDbDataReader
> Dim myConnection As New OleDbConnection(CadenaConexion)
> Dim myCommand As New OleDbCommand(mysql, myConnection)
> myCommand.Connection.Open()
> myReader > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> While myReader.Read()
> For x = 0 To 12
> registro(x) = myReader.Item(x).ToString
> Next
> End While
> myReader.Close() : myConnection.Close() : myCommand.Dispose() ':
>
> For Each tb In Me.Controls
> If TypeOf tb Is TextBox Then
> If tb.TabIndex <= 12 Then
> tb.Text = registro(tb.TabIndex)
> End If
> End If
> Next
>
>
> ESTAS 3 FUNCIONES SON LAS Q GASTO CASI SIEMPRE EN MI APLICACIÓN. LAS PONGO
> POR SI VEIS MEJORAS PARA Q FUNCIONE MAS RAPIDO O SI CON ESTO SE PUEDEN
HACER
> LAS CONSULTAS PREPARADAS Q ME DECIAS.
> GRACIAS!
>
> escribió en el mensaje
> news:
> Hola!
>
> Viendo tu codigo a mi solo se me ocurre una cosa. Tampoco estoy seguro
> que te vaya a mejorar el rendimiento de la aplicacion pero no me
> extrañaria nada que si que se mejorase.
> A ver... en la primera funcion: Gestionar, no necesitas iniciar una
> transaccion. Las sentencias SQL de por si solas ya estan incluidas en
> una transaccion. No necesitas crear una especifica para UNA sola
> sentencia SQL.
> Otra cosa es que vayas a ejecutar dos sentencias SQL seguidas y quieras
> asegurarte de que o se cumplen las dos o no se cumple ninguna, en cuya
> caso esta justificadisimo meterlas en una transaccion.
> Otra cosa que cambiaria es poner la conexion en un Singleton (digamos
> una variable global a la aplicacion): se abre al arrancar el programa y
> se cierra al finalizarlo, de tal manera que tu funcion seria algo asi:
>
> Public Sub Gestionar(ByVal sql As String)
> Dim Comando As OleDbCommand = New OleDbCommand
> Comando.Connection = ConexionGlobal ' Objeto de conexion global
> Try
> Comando.CommandText = sql
> Comando.ExecuteNonQuery()
> Catch Errorcito As Exception
> MsgBox("Operación no realizada", MsgBoxStyle.Critical,
> "Error de
> la aplicación")
> End Try
> End Sub
>
> A ver, lo de las transacciones lo puedes probar enseguida, no te va a
> tocar mucho codigo y lo mismo le ves una mejora.
> Lo otro es quizas un poco mas complicado de realizar, aunque tampoco
> mucho.
>
> Por ultimo, si realizas constantemente las mismas consultas yo
> consideraria crear consultas preparadas. Estas son unas consultas
> precompiladas a las que solo le tienes que especificar los parametros
> definidos antes de ejecutarlas. Son muy rapidas y seguramente mejoren
> el rendimiento de la aplicacion, pero son mas costosas de implementar.
>
> Espero que todo esto te ayude
> Saludos
> Roberto M. Oliva
>
>
> Sonia ha escrito:
>
> > a ver si podeis solucionar mi duda.
> > cuando entre a trabajar en una empresa (editorial) habia u programa
hecho
> en
> > vb6 q usaban 20 operadoras y la bd es acces97 y estaba en un pc
servidor.
> > todos los ordenadores son xp menos el servidor q es win 2000.
> >
> > cuando llegue querian hacer mejoras en esa aplicacion q basicamente
> consiste
> > en consultar colegios, hacer pedidos...en definitiva consultar y
modificar
> > la bd acces y mostrar la informacion a traves de textbox, datagrids y
> > listview
> >
> > en vez de seguir con esta aplicacion en vb6 , como no la habia hecho yo
y
> > cada uno entiende lo q hace, empeze a hacerla de nuevo con el microsoft
> > visual studio .net 2003 y asi he hecho las mejoras incluso otra
aplicacion
> q
> > consiste en ampliar la q tenia para tratar los temas de facturacion,
> > albaranes control de stock, etiquetas en crystal, control de acceso de
las
> > operadoras etc
> >
> > el problema llego cuando se ponen todas en la aplicacion ya q si la
> comparo
> > con la del vb6, esta del .net es bastante mas lenta. al hacer alguna
> > modificacion, se actueliza el listview o lo q sea y eso lleva unos
> segundos.
> > sobretodo el formulario principal q ponen un codigo de un colegio y se
> > tienen q llenar 4 datagrids y un registro(10 textbox)
> >
> > entonces ahora me planteo como es posible si se supone q el .net tiene
> > bastantes mejoras y teoricamente va bastante mas rapido, como es en mi
> caso
> > totalmente contrario. ya se q lo ideal seria hacer la bd sql pero eso de
> > momento no es posible.
> >
> > puede ser q no haya exprimido el .net y q no haya hecho la aplicacion de
> la
> > forma mas eficaz? (la verdad es q es mi primera aplicacion)
> >
> > y otra cosa:
> > puede ser tb la forma de conexion a la bd? yo lo q hago es conectar a la
> bd
> > una vez entro en la aplicacion. eso lo he puesto en un modulo donde
pongo
> > mas funciones como las vaiables globales, el llenar un datagrid...etc
> >
> > no se si seria mejor y si se puede hacer la conexion en cada formulario
> y/o
> > solo conectar las tablas q te hicieran falta para ese form. no se si
esto
> > sera posible.
> > esto ultimo me vendria bien para q las tablas referentes a la
facturacion
> > solo se conectaran a la bd en la 2º aplicacion, ya q al generar la
factura
> > tengo q ir guardando todas las lineas de un listview y cuesta bastante
si
> > son muchas.
> >
> > queria saber, aparte de opiniones sobre pq puede ir mas lento en vb .net
q
> > envb6, si es posible q al hacer la conexion no influya en todas las
tablas
> > para asi ir mas rapido o si para cada cambio q se haya de la bd solo se
> > active/conecte la tabla en cuestion en vez de toda la bd hago casi todas
> las
> > coenxiones usando estas funciones(os las pongo x si sabeis mejoras o si
> > se puede cambiar lo de la conexion), ya q casi todos los ejemplos q veo
> son
> > usando sql
> > Gracias!
> >
> > Imports System.Data.OleDb
> > Sub main()
> > Path1 = System.IO.Path.GetFullPath("\\Equipo3\C\DYLR\")
> > ArchivoDatos = path1 & "dyla.mdb"
> > CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
> > ArchivoDatos & ";Persist Security Info=False"
> > Dim frm As New principal
> > frm.ShowDialog()
> > End Sub
> >
> > 'funciones
> > Public Sub Gestionar(ByVal sql As String)
> > Dim conexion As New OleDb.OleDbConnection
> > conexion.ConnectionString = CadenaConexion
> > conexion.Open()
> > Dim Comando As OleDbCommand = New OleDbCommand
> > Comando.Connection = conexion
> > Comando.Transaction = conexion.BeginTransaction
> > Try
> > Comando.CommandText = sql
> > Comando.ExecuteNonQuery()
> > Comando.Transaction.Commit()
> > Correcto = True
> > Catch Errorcito As Exception
> > Comando.Transaction.Rollback()
> > Correcto = False
> > MsgBox("Operación no realizada", MsgBoxStyle.Critical,
"Error
> de
> > la aplicación")
> > Finally
> > conexion.Close()
> > conexion.Dispose()
> > End Try
> > End Sub
> >
> > Public Sub CrearMiOleDbCommand(ByVal myExecuteQuery As String, ByVal
> > myConnectionString As String)
> > Try
> > Dim myConnection As New OleDbConnection(myConnectionString)
> > Dim myCommand As New OleDbCommand(myExecuteQuery,
> myConnection)
> >
> > myCommand.Connection.Open()
> > myCommand.ExecuteNonQuery()
> > myConnection.Close()
> > myConnection.Dispose()
> > Catch ee As Exception
> > MessageBox.Show(ee.Message)
> > End Try
> > End Sub
> >
> >
Respuesta Responder a este mensaje
#10 Eduardo Alvarado Meza
29/09/2006 - 17:27 | Informe spam
Sonia, si quieres ver un amento de velocidad en el llenado de velocidad
quita todos los doevents y antes de llenar el listview escribes:
Milistview.BeginUpdate

y cuando lo llenes todo completamente escribe:
Milistview.EndUpdate
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida