Novedades de .NET 9

El nuevo .NET 9, está enfocado en el rendimiento tal como lo dicen en su documentación. Mas información en este enlace.

Procedimientos Almacenados en Access y Vb2005

Bien, sé que el título no es el mas adecuado para este artículo, porque como todos sabemos MS Access, no soporta los Procedimientos Almacenados como SQL Server, pero podemos hacer algunas "cositas parecidas", claro que bastante limitadas, como puede ser el caso de agregar, actualizar, eliminar y consultar registros en las tablas. Sé que muchos dirán que en estos tiempos podemos usar SQL Express, pero hay quienes aún prefieren usar MS Access y sus motivos deben tener.

Ahora, si estamos haciendo una aplicación en capas, pues verán que si lo hacemos como les mostraré, no encontrarán mucha diferencia ni demasiado trabajo al momento de pasarse a un motor como SQL Server, pues trataremos en lo posible que la codificación sea casi idéntica como si estuviéramos usando SQL Server, y de esta manera, al cambiar de motor, solamente cambiaríamos en nuestra capa de acceso a datos la cadena de conexión y un par de líneas mas y no soplarnos toda la codificación como normalmente sería usando access.

Bueno para no aburrirlos mas acá va un par de pantallazos de la "aplicación" de ejemplo, debo aclarles que no soy un experto en estas materia, así que espero encuentre de su agrado lo que voy a compartir con todos ustedes y espero sus críticas constructivas que siempre son bienvenidas y bueno, las destructivas también. jejejeje.

Clie1

Este el formulario bastante sencillo solamente para efectos de prueba de inserción y consultar datos por motivos de tiempo, la idea es ver los procedimientos y no el formulario.

El código del Botón Aceptar que es donde inserto los registros

Private Sub BtnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAceptar.Click
       If MessageBox.Show("¿Seguro de Grabar los Datos ?", "Responda", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            Try
               

Dim Cone As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")

                Dim Comando As New OleDbCommand
               With Comando
                    Cone.Open()
                    .CommandText = "PA_Agrega_Clientes"
                    .CommandType = CommandType.StoredProcedure
                    .Connection = Cone
                    .Parameters.Add("@Codigo", OleDbType.Char, 10).Value = Me.TxtCodigo.Text
                    .Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
                    .Parameters.Add("@Direccion", OleDbType.VarChar, 50).Value = Me.TxtDireccion.Text
               End With
                Dim Bien As Integer = Comando.ExecuteNonQuery
               If Bien = 0 Then
                    Throw New Exception("Falló la operacion de inserción")
               End If
                Comando.Dispose()
                Cone.Close()
                Cone.Dispose()
                MessageBox.Show("Datos Ingresados con éxito", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error)
           End Try
       Else
            MessageBox.Show("Operacion cancelada por el usuario", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
       End If
    End Sub

Alli está el código bastante sencillo con eso estamos insertando los registros (3) de lo cual solo quería comentarles este par de lineas:

.CommandText = "PA_Agrega_Clientes"
.CommandType = CommandType.StoredProcedure

el "PA_Agrega_Cliente", como se podrán dar cuenta vendría a ser el nombre de nuestro procedimiento almacenado, y el CommandType=CommandType.StoreProcedure, lo estoy dejando como si realmente se tratara de un procedimiento almacenado y no como CommandText que es lo normal que hacemos en access, y después los parámetros lo pasamos tan igual que como si fuera en SQL Server.

Ahora en la Base de datos (Access) tengo estos 4 Procedimientos, que no son otra cosa que consultas de accion, de las cuales tambien les haré ver el código que contiene.

Clie2

Estos son mis "Procedimientos" con los cuales estoy trabajando, ahora el código no es nada extraño como verán en la siguiente imagen.

Clie3 

Eso es todo, solo falta el código de como devuelvo los datos al Datagridview (Botón buscar)

Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBuscar.Click
       Try
           Dim Cone As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")
            Dim DBComando As New OleDbCommand
            Cone.Open()
            If Me.TxtCodigo.Text <> "" Then
                With DBComando
                    .CommandText = "PA_BuscarCliente_X_Codigo"
                    .CommandType = CommandType.StoredProcedure
                    .Parameters.Add("@Codigo", OleDbType.VarChar, 10).Value = Me.TxtCodigo.Text
                    .Connection = Cone
                End With
           ElseIf Me.TxtNombre.Text <> "" Then
                With DBComando
                    .CommandText = "PA_BuscarCliente_X_Nombre"
                    .CommandType = CommandType.StoredProcedure
                    .Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
                    .Connection = Cone
               End With
           End If
           Dim Adaptador As New OleDbDataAdapter(DBComando)
            Dim oCliente As New Cliente.ClientesDataTable
            Adaptador.Fill(oCliente)
            Cone.Dispose()
            Me.DtgLista.DataSource = oCliente
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
     End Sub

Clie4

Ese es el resultado de ejecutar el botón buscar, si se fijan estoy usando un esquema (XSD) de la tabla clientes que usé para el ejemplo y con eso es súper fácil como dije al principio si están haciendo su aplicación en capas no tendrán casi nada de trabajo al cambiar a un motor como SQL Server.

Espero les sirva de algo y las disculpas del caso por si encuentran algo de malo, mi excusa será el tiempo, jajajajaja.

Saludos

Comentarios

  1. genial doctor!
    voy a usarlo ahora... saludos!!!

    ResponderEliminar
  2. Hola Richard Karl

    Espero te sirva de algo en tus tareas cotidianas y gracias por visitar el blog

    Saludos cordiales

    ResponderEliminar
  3. Muchas gracias, excelente este articulo, ya que las herramientas caser te mapean la base de datos en access y te generan todos estos procedimientos almacenados, lo importante era aprender a llamarlos de VB.NET 2005.
    Muy agradecido nuevamente.

    ResponderEliminar
  4. Gracias a tí pipevilla2 por visitar el blog y espero que te haya servido

    ResponderEliminar
  5. estimado wilfredo se que tu eres master para esto y quizas te paresca demasiado sencillo pero yo estoy apenas aprendiendo y aveces no entiendo, mira las consultas las hago en la base de datos(Acces) o en el vs, te agradecere mucho si me respondes a este comentario.
    Daniel Palacios
    dpalacios_22@yahoo.es

    ResponderEliminar
  6. Hola Daniel Palacios

    Primero gracias por visitar el blog y me alegra que te ayude en tu proceso de aprendizaje.

    Bueno primero decirte que las consultas las construyas en la base de datos (access) tienes un asistente que te puede ayudar a construir tus consultas básicas o tambien puedes usar la ventana de código SQL en la cual puedes hacerlo directamente usando codigo.

    Cualquier consulta al respecto no dudes en escribirme.

    Saludos cordiales

    ResponderEliminar
  7. estimado wilfredo gracias por tu ayuda, pero el codigo me produce un error que no entiendo ni papa te lo escribo a continuacion:
    format of the initialization string does not conform to specification starting at index 0,esto despues de que me pregunta si desea guardar los datos, te ruego tu ayuda, gtracias
    Daniel Palacios
    dpalacios_22@yahoo.es

    ResponderEliminar
  8. Hola Daniel Palacios

    Solo asegúrate que antes de tu clase de acceso a datos, deberías estar usando el siguiente namespace System.Data.OleDB, de esta manera:

    Imports System.Data.OleDB

    Eso debe estar como primera linea en tu capa de acceso a datos.

    Cualquier otra duda solo consultas, espero te ayude, luego me cuentas como te fue.

    Un saludo

    ResponderEliminar
  9. estimado wilfredo,con el programa que tengo en proceso nunca pude hacer funcionar tu cadigo, pero hise un nuevo proyecto y ahi si me funciono de maravilla, gracias esta bien bonito como funciona.
    es una gran colaboracion de tu parte.
    Daniel Palacios

    ResponderEliminar
  10. Hola Daniel Palacios.

    Que bueno que te haya servido y hayas podido hacer funcionar el código. Espero seguir aportando algo mas en unos dias, de momento no hay mucho tiempo, pero ya pronto estaré libre. Saludos cordiales y suerte.

    ResponderEliminar
  11. estimado wilfredo, quiero hacerte la siguiente consulta, tengo un form inicial, donde le apreto un boton y me lleva al form que se conecta a la base de datos pero es solo para lectura en ete form no se puede modificar ni agregar nada, tengo otro form para eso, mi problema es que cuando abro el form para agregar un dato la operacion se realiza bien, lo cierro, luego abro el form para ver todos los registros y el data adapter no se ha actualizado , no se como forzarlo a leer nuevamente la base de dtos para actualizar los registros.
    gracias por tu ayuda
    Daniel Palacios

    ResponderEliminar
  12. Hola Daniel Palacios

    Pues me imagino que tienes un procedimiento Listar que te devuelve todos los registros que al cargar el form lo invocas y te devuelve todos los registros, aunque no es lo recomendable, pero en fin, y si solamente lo estás ocultando el formulario, significa que al volverlo a llamar solo se muestra con lo cual no está cargando el load del form, porque ya está cargado en memoria. Tendrías que ver si al momento de cerrar ese formulario lo estás descargando con Me.close y me.dispose, si estás haciendo eso se descargará de memoria y al volverlo a invocar tendra que volver a cargarse y por consiguiente pasará por el evento Load del form que te hará ese trabajo de cargar nuevamente la data.

    Espero soluciones pronto y nos cuentes como te fue.

    Saludos cordiales

    ResponderEliminar
  13. Estimado wilfredo nuevamente gracias por tu ayuda, aun no he podido resolver el asunto de recargar el form, te pongo el codigo por si te que da tiempo le echas un vistaso:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Valor_mantenimientoTableAdapter.Fill(Me.Ejemplo2DataSet.valor_mantenimiento)
    Me.ReparacionesTableAdapter.Fill(Me.Ejemplo2DataSet.reparaciones)

    Me.SerieTableAdapter.Fill(Me.Ejemplo2DataSet.serie)
    End Sub

    Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click

    Me.Dispose()
    Me.Close()

    agregarserie.Show()
    End Sub

    al cerrar el form agregarserie tengo una sentencia:
    formhistorial.show
    y me muestra nuevamente el formulario pero no esta actualizado.

    tu comentario de esto seria de mucha ayuda.
    Daniel Palacios

    ResponderEliminar
  14. Como estás Daniel Palacios

    Pues a simple vista no te podría decir cual es el problema alli al momento de recargar el form de historial creo que es donde tienes el problema, si tienes los formularios separados (si no es un proyecto muy grande) talvez puedas enviarme zipeado el proyecto incluyendo tu base y le doy una mirada con calma al asunto este que te está dando problemas. Hay algunas cosas que así nomás no se podría detectar, talvez una transaccion no confirmada o cualquier otra cosa podría ser, si puedes enviarmelo encantado de revisarlo y te lo devuelvo de inmediato para que puedas solucionar tu problema.

    Saludos cordiales

    ResponderEliminar
  15. muchas gracias por tu interes, ahorita te lo envio
    saludos
    Daniel Palacios

    ResponderEliminar
  16. Hola Wilfredo Patricio Castillo
    Mi nombres es Raul Capcha Anco, tambien soy un aprendiz de visual basic, ya casi manejo muy bien los formularios, per aun no he entrando en conecciones a base de datos.. quisiera pedirte, si esk tienes una aplicacion sencilla para conectar a base d edatos


    estraria muy agradecimo .. pues este articulo esta de la patada ....hasta la proxcima

    ResponderEliminar
  17. Hola Raul J. Capcha

    Gracias por leer el blog, bueno para acceso a datos es justamente ese artículo que está alli, es la misma idea solamente que alli está separado por capas, hice un pequeño ejemplo para poder consultar una tabla en un solo formulario, talvez te sirva como guia, enviame tu correo y te lo paso. Saludos cordiales

    ResponderEliminar
  18. HOLA WILFREDO CASTILLO
    SOY UN APRENDIZ EN VB. MI NOMBRE ES MIGUEL JIMENEZ Y MI PROBLEMA ES QUE NO SE CUAL ES EL CODIGO DE COMO GUARDAR Y CONSULTAR LOS DATOS CON EL SQL QUE TIENE INCORPORADO EL VB.NET 2008 Y COMO ACTIVAR EL CRYSTAL REPORT POR EL VISUAL SI ME PUEDES AYUDAR TE LO AGRADECERIA ES PARA MI TRABAJO FINAL DE CARRERA. QUE TENGAS UN BUEN DIA. MI CORREO ES JMMJ_87@HOTMAIL.COM

    ResponderEliminar
  19. .CommandText = "PA_Agrega_Clientes"

    Asi se llama la consulta .. hecha en acces no es cierto ?

    Como hago la consulta en acces con las condiciones que hiciste en el codigo?

    Puesto que me tira el ERROR : Falló la operacion de inserción.

    Mauricio Briceño M.

    ResponderEliminar
  20. Pues si ese es el nombre de la consulta de accion que está en la base de datos access y que hace las veces de un store procedure, la consulta esa se hace con el editor de consultas que tiene access, espero que sepas como manejarlo es muy sencillo. Luego nos cuentas como te fue.

    Saludos cordiales

    ResponderEliminar
  21. hola. Tengo una duda, cuando creo un setup en .net 2005 y i base es en access. puedo agregar esa base al setup?. Es decir al momento de que una persona active el instalador, el setup agregue la base tambien, en una direccion especifica que el ejecutable alla creado en el momento de la instalacion. Si me podrias instruirme con esa duda, ya sea en access como en slq 2005 express.
    De antemano te quedo muy agradecido por la atencion.

    ResponderEliminar
  22. Hola, disculpa la demora en responder, pero estuve fuera mucho tiempo, asi que espero que aún te sirva. Bueno el asunto es que si haces un proyecto de instalacion de aplicación, puedes agregar cualquier archivo que tu creas conveniente y la base de datos de access claro que se puede agregar tu base al, instalador, en cuanto a la base de sql express, pues el asunto cambia porque tienes que instalar primero el sql express y luego adjuntar la base de datos a tu servbidor local o de producción, son 2 cosas diferentes.

    Saludos cordiales y gracias por visitar el blog

    ResponderEliminar
  23. Hola Wilfrido, disculpa por no haberme presentado soy carlos cumbe, gracias por tu respuesta, me a servido de mucho lo que me has dicho. aunque te confiezo que con la respuesta de sql express hubiese preferido escuchar que se puede agregar como en access, pero bueno... igual me ha servido de mucho esta informacion, y hace tiempo que queria salir de la duda.
    De antemano te doy muchas gracias.

    ResponderEliminar
  24. wilfredo me sirve de ayuda por una tarea que me dejo mi profesor
    que teniamos que crear proc en access para un pequeño sistema en c#
    tomare en cuenta

    ResponderEliminar
  25. Pues gracias por visitar el blog y una alegría que les sirva a muchos.

    Saludos cordiales

    ResponderEliminar
  26. Buen dia.
    Espero que me ayuden, no encuentro la forma de que en sql server no deseo ingresar por medio de autentificacion de windows, ya se como crear un login , user , y a ese asignarle la base, pero no deseo que al ingresar por autentificacion de wwindows se vea la base o se pueda acceder a ella, es decir deseo restringirlo, bueno paraece todo un travalengua lo que escribi espero haberme echo explicar, si tiene alguna idea que me pueda servir estaria muy agradecido

    ResponderEliminar
  27. ola ke tal amigo oie muy buena tu ayuda solo que ahoa tengo una duda puedo introducir una fecha desde un objeto datapicker1 a la base de datos usando este mismo tipo de estructura por favor si pudieras ayudarme por ke tengo kmo 1 mes batallando kn eso y no puedo hacer ke funcione sale de antemano muchas gracias

    ResponderEliminar
  28. Hola, si lo que quieres es ingresar datos de tipo fecha a una determinada tabla desde un datapicker, pues no es nada dificil, solo es cuestion que sigas todo el procedimiento que ves alli y que en los parámetros definas el tipo de dato como fecha o date, y de igual manera debe estar en la tabla y a la hora de enviar el parámetro solamente tendrias que decirle por ejemplo si tienes un objeto cliente y recibe un parametro fecha en un metodo grabar por decir tendrias que pasarle asi: oCliente.Grabar(datapicket1.value,otrodato)
    o asi:
    oCliente.Grabar(CDate(datapicker1.value),otrodato)

    y eso te debe funcionar como relojito.

    Cualquier otra duda solo me escribes y nos cuentas como te fue.

    Gracias por visitar el blog y espero que te ayude en tu trabajo.

    Saludos cordiales

    ResponderEliminar
  29. bueno, espero haber comprendido tu inquietud, pero para ingresar un tipo fecha a la base:debes de hacer lo siguiente:
    declara un objeto
    dim fecha as object
    fecha=datapicker1.values
    rs!ca_fecha=cdate(fecha)
    creo que seria asi. Y en una funcion o procedimiento puedes crear esa variable tipo de dato object para que te facilite las cosas

    ResponderEliminar
  30. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  31. Hola José

    Que pasó?, solucionaste tu problema?, veo que eliminaste la entrada, pero me llegó la notificación con tu pregunta.

    Espero que hayas solucionado tu problema.

    Saludos cordiales

    ResponderEliminar
  32. Hola wilfredo, quetal?

    Es que estoy programando con vb.net 2005; segui todos los pasos que pedias y aun asi no me funciona.

    Cuando dejo la linea=

    .CommandType = CommandType.StoredProcedure

    me sale el error "Falló la operacion de inserción."

    Pero si cambio el StoredProcedure por Tabledirect; ahi si me muestra que la insercion fue correcta, pero reviso mi base de datos, y no hay nada. No hubo cambios. Porque será que pasa esto?

    ResponderEliminar
  33. Hola, necesito ayuda con esto tengo una tabla donde guardo los registros de una fecha en la misma tabla un campo llamado totaldias, lo que he logrado hasta ahora.... estoy trabajando con access y vb.net 2005. me muestra los registros agrupados por el id y el nombre y me cuenta o me da el total de los dias pero a su vez necesito que me diga cuales fueron esos dias, agrupados como dije anteriormente... Ej.
    Id Nombre Dias Total Dias
    66 pedro perez 12,3,5 3

    como puedo hacer todo esto esta dentro de una misma tabla, comento lo pude hacer pero solo me muestra los dias totales y no me agrupa nada y cuando trato de agruparlo me da error!!!!!!!!!!! i dont understand quien pueda ayudarme gracias mil gracias de antemano

    ResponderEliminar
  34. Hola, para obtener el nombre del dia de una determinada fecha es tan sencillo, como hacer lo siguiente:
    Dim StrFecha as date
    StrFecha=Cdate("04/05/2010")
    Messagebox.show("El dia es :" & StrFecha.TosTring("dddd"))

    Pero no dices, donde es que quieres mostrarlo ni donde es que quieres agruparlos, si es una consulta, o en un reporte.

    Espero te ayude en algo o en todo caso dar mas informacion para poderte ayudar mejor.

    Saludos cordiales y gracias por visitar el blog

    ResponderEliminar
  35. Gracias a ti por la ayuda, tengo una consulta donde muestro los datos de mi tabla en un datagridview, mi tabla tiene los siguientes campos: id,nombre, dia,totaldias... necesito que me muestre los dias no mas sin mes ni año, en el campo dias...lo necesito para mi consulta y para el reporte tambien,... :>

    ResponderEliminar
  36. Hola

    para obtener el nombre del dia en sql server es tan sencillo como esto:
    select DATENAME(weekday,(fecha_Trabajo)) from TuTabla Where Condicion.

    o tambien:

    select DATENAME(weekday,'06/04/2010')
    que te dará Martes, cambiando el weekday por month, tambien obtienes el nombre del mes.

    Espero haberte ayudado, cualquier duda, solo escribe y cuéntanos como te fue, si lograste solucionar tu problema.

    Saludos cordiales

    ResponderEliminar
  37. Hola interesante la informacion, solo tengo una duda, como uso el editor de consultas en access 2007?

    ResponderEliminar
  38. Hola, eso es muy sencillo, al hacer clic en el menú crear, se desplegarán unas fichas en la parte superior derecha y escoges la que dice diseño de consultas, alli podrás escoger las tablas para realizar las consultas, seleccionando los campos con el diseñador, pero tambien puedes darle cancelar y se abrirá al lado superior izquierdo una ficha que dice SQL, al hacer clic alli, se abre la ventana para escribir directamente la consulta.

    Espero haberte ayudado y gracias por visitar el blog

    ResponderEliminar
  39. Gracias por decirme como hacer el diseño de la consulta, tengo otra duda, en un tabla tengo un campo numerico el cual usa una mascara que es la siguiente &&&-&&&& Pero no sé como declararlo en la consulta PARAMETERS [@Sentencia] Number( ), que pongo en el parentesis?....Gracias por contestar!!!

    ResponderEliminar
  40. Hola

    Si el campo tiene esa máscara, no tienes que declararlo en los parámetros de la consulta, eso lo puedes hacer en el grid o donde lo vayas a mostrar, o simplemente en el select puedes hacer algo asi:

    Select Campo1,Format(camponumerico,"000-000") As Tu_Campo From Tabla Where=Algo

    o tambien asi:

    Select Campo1,Format(CampoNumerico,"###-###") As Tu_Campo From Tabla Where=Algo

    Y por último, dentro del Number(), no necesitas poner nada.

    Espero haberte ayudado.

    Saludos cordiales.

    ResponderEliminar
  41. gracias ya solucione el problema de la consulta, ahora solo tengo que arreglar un error en el codigo...Muchas gracias me ha servido de mucho esta informacion :D

    ResponderEliminar
  42. Hola, me ha servido mucho esta información, quisiera saber si me puedes mostrar el codigo para actualizar y eliminar por favor. Muchas gracias!.

    ResponderEliminar
  43. si no es mucha molestia el codigo de la sentencia SQL tambien :|

    ResponderEliminar
  44. Hola

    Me alegra que te haya servido el ejemplo, pero no es dificil la eliminacion y la actualizacion de datos, solo tienes que hacer otro "Procedimiento" como el que ves alli que se llama PA_Inserta, pero con nombre PA_Actualiza_Clientes por ejemplo

    y la manera de llamarlo en el codigo es igual al que se ve alli para insertar, con 2 DIFERENCIAS a tener en cuenta, primero que no deberia ser insert sino Update mas o menos asi:
    Update Clientes Set nombre=@Nombre Where IdCliente=@IdCliente

    pero el parámetro @IdCliente se debe pasar como último parámetro y no primero, sino no funcionará correctamente.

    Para la parte de eliminar tambien se hará un procedimiento similar pero debería ser asi:

    Delete From Clientes Where IdCliente=@IdCliente, todo lo demás es identico a lo que ya está alli.

    Espero haberte ayudado

    Saludos cordiales

    ResponderEliminar
  45. Bueno a mi me ha servido mucho tu informacion, pero tengo problemas en actualizar, mi codigo esta asi:

    .CommandText = "SP_UPDATE"
    .CommandType = CommandType.StoredProcedure
    .Connection = cnn
    .Parameters.Add("@IdCliente", OleDbType.Integer)
    .Parameters.Add("@Sentencia", OleDbType.Char, 255).Value = Me.txt_sentencia.Text
    .Parameters.Add("@Fecha", OleDbType.Char).Value = Me.dtp_fecha.Text
    .Parameters.Add("@Demandado", OleDbType.Char, 255).Value = Me.txt_demandado.Text
    .Parameters.Add("@Demandante", OleDbType.Char, 255).Value = Me.txt_demandante.Text
    .Parameters.Add("@Fallo", OleDbType.Char, 255).Value = Me.txt_fallo.Text
    .Parameters.Add("@Temas", OleDbType.Char, 255).Value = Me.txt_temas.Text

    El error que me da es el siguiente: "El parametro [@IdCliente] no tiene un valor predeterminado."

    Si pongo el @IdCliente al final como tu sugieres en un mensaje anterior: "pero el parámetro @IdCliente se debe pasar como último parámetro y no primero, sino no funcionará correctamente." me sale el siguiente error: "El parametro [@Temas] no tiene un valor predeterminado."

    Te pongo mi codigo de la sentencia SQL talves sirve de algo: PARAMETERS [@IdCliente] Long, [@Sentencia] IEEEDouble, [@Fecha] DateTime, [@Demandado] Text ( 255 ), [@Demandante] Text ( 255 ), [@Fallo] Text ( 255 ), [@Temas] Text ( 255 );
    UPDATE tabla_formulario SET Sentencia = [@Sentencia]
    WHERE Id = @IdCliente;

    Espero me puedas ayudar! Gracias.

    ResponderEliminar
  46. Hola

    Que bueno que te haya servido la información.

    El error que te da, es porque no estás pasando un valor pues para el parámetro @IdCliente, segun veo en la propiedad .value, no estas pasando nada, pero si en los demás.

    Corrige eso y nos cuentas como te fue.

    Saludos cordiales

    ResponderEliminar
  47. pues el problema es que el Id Cliente se tiene que incrementar automaticamente y no debe ser asignado por el usuario, por esa razon no le he asigne ningun textbox.

    ResponderEliminar
  48. Hola cheguillen

    Mira el tema es que en un procedimiento UPDATE, tiene que ir el parametro IdCliente como condicion de la actualizacion.

    Donde no debe ir y ni siquiera se le debe nombrar es en el procedimiento INSERT siempre y cuando el IdCliente sea autonumérico.

    Por ejemplo en un procedimiento UPDATE tiene que ir porque al actualizar tendrias que hacer algo asi: UPDATE Clientes Set nombre=@Nombre Where IdCliente=@IdCliente
    entonces como ves en esos casos tienes que pasar el nombre y el IdCliente, de manera obligatoria, sino no podrías especificar a que registro vas a actualizar.

    Espero haberte despejado la duda, haz las pruebas y nos cuentas como te fue.

    Saludos cordiales

    ResponderEliminar
  49. Muchas gracias por el ejemplo... esta muy bueno..... el problema es que lo estoy pasando a vb.net 2008 y tengo un error en el boton buscar...

    aqui esta el codigo y donde me muestra el error esta en parentesis...

    Dim Adaptador As New OleDb.OleDbDataAdapter(DBComando)
    Dim oCliente As New (((Cliente.ClientesDataTable)))
    Adaptador.Fill(oCliente)
    Cone.Dispose()
    Me.DtgLista.DataSource = oCliente
    Catch ex As Exception
    Throw New ((((Exception(ex.Message)
    End Try)))))))

    me aparece este error

    Pocos parámetros. Se esperaba 3.

    ............

    me gustaria mucho que me pudiera ayudar.....

    pues estoy buscando la forma de que mi programa busque un numero de 6 digitos en la base de datos....


    y pues su ejemplo me ha ayudado mucho....


    espero que me pueda ayudar....

    mi correo es andresblackky@hotmail.com...

    espero un correo con su ayuda muchas gracias

    ResponderEliminar
  50. Hola

    Pues no deberias tener ningun problema, si es que lo has hecho como lo indico alli, todo eso lo he probado ya inclusive con VB 2010 y no hay ningun problema, es asunto es que aqui Dim oCliente As New Cliente.ClientesDataTable, esta linea si te fijas se refiere a un datatable y como indiqué está en capas, entonces en la capa de entidades, solo son esquemas de las tablas, si has puesto un archivo .xsd o esquema con las tablas de tu sistema, no deberias tener ningun problema, como ya dije, lo he probado hasta con el VB 2010, y no me da ningun error.

    Saludos cordiales y gracias por visitar el blog

    ResponderEliminar
  51. hola buenas tardes soy nuevo en esto y mi consulta es obtener un id autoincremental de una tabla por ejemplo Unidad la cual es la clave primaria y despues hacer como clave compuesta en la tabla unimar por ejemplo hice este codigo pero me funciona
    ALTER PROCEDURE [dbo].[Insert_Unidad]
    (@par_IdUnidad INT OUTPUT,@par_NombreUnidad[varchar](20),@par_EstadoUnidad[int])

    AS BEGIN

    INSERT INTO Unidad
    ([NombreUnidad],[EstadoUnidad])
    VALUES (@par_NombreUnidad,@par_EstadoUnidad)

    SELECT IDUNIDAD=@@IDENTITY

    INSERT INTO Unimar
    ([idUnidad])
    VALUES(@par_IdUnidad)
    Declare @IdUnidad int
    set @IdUnidad =Scope_Identity()

    END

    ResponderEliminar
  52. Hola

    Por favor consultalo tu tema en un foro de SQL SERVER, esto es solo referente a MS Access y lo que tu estás preguntando es un procedimiento almacenado de SQL SERVER, y no te puedo responder aqui sino confundiremos a los lectores.

    Saludos cordiales

    ResponderEliminar
  53. hola este explicacion me sirvio en mucho ojala que hubiera mas blogs como este es genial, con esto me entraron mas ganas de aprender . net.......

    ResponderEliminar
  54. Estimado. Una consulta, se puede optimizar el ingreso o actualización a la base de datos access. Tengo una aplicación donde la actualización al dato es lento... un dato es que tengo el SQL en la aplicación, quizas al tenerla en la base de mdb como función trabaje mejor ?.
    saludos

    ResponderEliminar
  55. Hola

    Claro que puede mejorar estando en la base, si te fijas en las consultas de accion que tengo en el ejemplo este, que le llamo malamente procedimientos, puedes mejorarlo bastante, pero tambien la actualizacion si es lento mucho depende de cuantos datos tengas y si hay muchos índices que actualizar. Tambien influye la forma en que insertas los datos, si es que abres toda la tabla y luego haces un add, o usas diretamente un Insert Into Table VALUES ..., hay muchas cosas a tener en cuenta, pero es cuestion que hagas las pruebas metiendo tu Funcion de Insercion en la base de datos y le pases los parámetros y evalúes cual te conviene.

    Espero haberte dato una luz.

    Saludos cordiales

    ResponderEliminar
  56. Hola wilfredo, saludos desde Nicaragua.

    Esta muy interesante tu ejemplo, yo no sabia que se podia hacer esto mismo en access, similar a server.

    tengo 2 preguntas que hacerte tal vez me podes ayudar:
    1. Como es que creas a las que llamas consultas de accion? porque yo escribo las consultas en access pero en SQL sin asistente, "a pie" pero no s'e como haces para crearlas...

    2. Fijate que estoy tratando desde hace semanas de hacer un reporte en vb.net2008 con crystal y access, un reporte entre rango de fechas, es decir fecha1, fecha2 pero siempre me genera errores... pens'e hacer algo similar con access pero no podia pasar parametros... no s'e si tenes algun ejemplo con respecto a lo anterior.

    De antemano, gracias por tu ayuda y tu ejemplo que esta muy bueno.

    Carlos.

    ResponderEliminar
  57. se me olvido wilfredo, mi correo es no_soy_racista@hotmail.com o cgmontenegro@gmail.com

    saludos,

    ResponderEliminar
  58. Hola Carlos

    Tu primera pregunta ya está respondida mas arriba, pero lo vuelvo a citar aquí:
    ----------------------------
    Hola, eso es muy sencillo, al hacer clic en el menú crear, se desplegarán unas fichas en la parte superior derecha y escoges la que dice diseño de consultas, alli podrás escoger las tablas para realizar las consultas, seleccionando los campos con el diseñador, pero tambien puedes darle cancelar y se abrirá al lado superior izquierdo una ficha que dice SQL, al hacer clic alli, se abre la ventana para escribir directamente la consulta.

    Espero haberte ayudado y gracias por visitar el blog.
    ----------------------------
    Luego de eso solamente grabas la consulta y ya lo tendrás dentro de tu base de datos en la vista Consultas o Vistas.

    Respecto a tu segunda pregunta la cosa no es dificil:

    Primero para crear un reporte en Crystal Reports no es nada dificil, solamente necesitas agregar un archivo .XSD en el cual creas un datatable con la estructura de los campos que llevará tu reporte. Para agregar el datatable es facil, simplemente le das clic derecho-->Agregar-->Datatable y alli empiezas a crear los campos.

    Teniendo hecho eso, ya puedes empezar a crear tu reporte.

    Estando en el diseñador del reporte en la parte izquierda donde dice Campos de la base de datos, haces clic derecho en asistente de base de datos, y alli seleccionas tu datatable y ya casi todo estará listo solo debes poner los campos en el detalle.

    Para llamarlo al reporte y pasarle los parámetros hay varias maneras, aqui te indicaré la forma sencilla que es como lo hago:

    Un form para poner los textbox que necesites pasar como parámetros y un boton que será el que ejecute el reporte, aqui lo que hago es llamar a otro form, en el cual tengo insertado un crystalReport Viewer que en el cual declaras dim oRepo as New TuReporte.
    En el load lleva lo siguiente:

    Dim oTxtDesde As TextObject
    Dim oTxtHasta As TextObject

    oRepo.Load(System.AppDomain.CurrentDomain.BaseDirectory & "\Tureporte.Rpt")
    oTxtDesde = oRepo.Section2.ReportObjects("TxtFecha1")
    oTxtDesde.Text = FrmPrimerForm.TxtDesde.Text
    '..Esto haces para el Campo hasta tambien...

    oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(FrmPrimerForm.TxtDesde.Text), CDate(FrmPrimerForm.TxtHasta.Text)), DataTable))

    Con eso no deberías tener problemas.

    Espero te haya servidor y no te haya terminado por confundir.

    Cualquier duda hazlo saber, y disculpas por la demora.

    Saludos cordiales

    ResponderEliminar
  59. Saludos Will.
    Gracias por responder.

    1.La primera consulta que te hice ya la resolvi y esta muy bien en access creo a como lo enseñas en tu ejemplo, un storeprocedure con par de parametros de entrada, lo clasico vos sabes: mostrar informacion por ej, del 02 de agosto de 2010 al 30 de agosto de 2010:

    PARAMETERS [@fecha1] Text ( 255 ), [@fecha2] Text ( 255 );
    SELECT empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha

    FROM visita, visitante_visita, visitante, empleado_visitante, empleado

    WHERE visita.cod_visita=visitante_visita.cod_visita
    And visitante_visita.cod_visitante=visitante.cod_visitante
    And visitante.cod_visitante=empleado_visitante.cod_visitante
    And empleado_visitante.cod_empleado=empleado.cod_empleado
    And visita.fecha Between [@fecha1] And [@fecha2]

    GROUP BY empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha;

    En access no hay problemas. Me pide el par de fechas y me muestra el resultado, pero desde vb.net2008...

    2. Con tu ejemplo, no entiendo que es oObjeto.Listar_X_Fechas cuando al reporte le pasas el setdatasource.

    La idea es tener un formulario que me pida introducir los rangos de fechas con el control dtpicker y al hacer click en un boton, que me mande a llamar al reporte con la informacion entre ambas fechas, pero no establecer directamente al reporte ambas fechas, porque me parece que en tu ejemplo lo que haces es 'asignar' txtdesde y txthasta directamente a la setion2 del reporte. Me entendes?

    No crees que con la consulta anterior le puedo pasar los parametros desde vb.net? a como se activa un storeprocedure desde server?

    De antemano, gracias por tu valioso aporte, agradezco tu tiempo y dedicacion.

    Saludos desde Nicaragua.

    Carlos,
    PD: De que país sos vos?

    ResponderEliminar
  60. saludos will, gracias por responder.

    Con respecto a la primera pregunta, ya resolvi, escribi una consulta en access que recibe par de parametros de entrada fecha y genera un conjunto de informacion entre las fechas:

    PARAMETERS [@fecha1] Text ( 255 ), [@fecha2] Text ( 255 );
    SELECT empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha
    FROM visita, visitante_visita, visitante, empleado_visitante, empleado
    WHERE visita.cod_visita=visitante_visita.cod_visita And visitante_visita.cod_visitante=visitante.cod_visitante And visitante.cod_visitante=empleado_visitante.cod_visitante And empleado_visitante.cod_empleado=empleado.cod_empleado And visita.fecha Between [@fecha1] And [@fecha2]
    GROUP BY empleado.nombre_empleado, visitante.nombre_visitante, visita.fecha;

    ResponderEliminar
  61. con respecto a la 2da consulta tengo problemas.

    Con la consulta anterior, la idea es pasar desde un formulario con dos dtpicker la fechainicial y la fechafinal y con un boton mandar a llamar al formulario que contiene el visorreport con la informacion entre las fechas.

    En tu ejemplo, no entiendo la linea: oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(fecha1), CDate(fecha2)), DataTable))

    Al parecer lo que haces es agregar directamente al reporte txtdesde y txthasta a la section2?

    Me entendes?

    ResponderEliminar
  62. De antemano, gracias por tu ayuda y por el tiempo que dedicas.

    Saludos desde Nicaragua
    Carlos.
    PD: de que país sos?

    ResponderEliminar
  63. Con lo de la consulta, es como trabajar con storeprocedures en server, lo que quiero es pasar ambas fechas como parametros a access y que se ejecute la consulta definida.

    Si ejecuto la consulta estando en access, me pide ambas fechas, inicial y final y no hay problemas , me presenta el resultado pero no asi desde vb.net2008.

    tu ejemplo es bastante mas sencillo y mas rapido al ejecutar por lo que veo pero no se si estoy en lo correcto al decirte que me parece que asignas directamente txtdesde y txthasta a la section2 del oreporte.

    ResponderEliminar
  64. Hola Carlos

    Haber vamos por partes.

    En primer lugar, el ejemplo que muestro en este artículo que dio origen a estos comentarios, dice que está hecho en n-capas.

    Ahora con respecto a tu primera consulta de enviarle los parámetros desde el vb.net 2008, si te fijas bien en el ejemplo, donde muestra la imagen de un Form Clientes que está mostrando datos, sobre esa imagen está el codigo dice del Boton Buscar (Buscar_click)

    Si te fijas en este fragmento del codigo:

    .Parameters.Add("@Codigo", OleDbType.VarChar, 10).Value = Me.TxtCodigo.Text
    .Connection = Cone
    End With

    .....

    Entonces es lo mismo para lo que tu necesitas, solo que tendrías que pasarle 2 parámetros en vez de uno, para tu caso sería algo como esto:

    .Parameters.Add("@Fecha1", OleDbType.DateTime, 10).Value = CDate(Me.Datapicker1.value)
    .Parameters.Add("@Fecha2",OleDbType.DateTime,10).Value=CDate(Me.DataPicker2.Value)
    .Connection = Cone
    End With
    ...............
    Lo demas es igual al ejemplo, con eso tu consulta te devolverá los datos desde vb.net 2008, lo puedes probar poniendo un datagridview como en el ejemplo.

    Respecto a tu pregunta 2, la cosa es asi:

    Como dije que el ejemplo está en n-capas, entonces tengo una clase en la capa de acceso a datos que es la encargada de ejecutar la consulta y me devuelve un datatable con los datos, que lo envia a la capa de negocios que es la que es instanciada desde la capa cliente, entonces como verás siendo una clase que en este caso sería por decir clsDatos, en la cual tiene una funcion Listar_X_Fecha(Fecha1,Fecha2) as Datatable
    , al ser instanciada en el cliente sería algo asi:
    Dim oReporte as new clsDatos

    Entonces alli es donde uno hace uso del objeto oReporte.Listar_X_Fechas.

    Asi que no es nada extraño.

    Para probarlo puedes hacerte una clase similar y que te devuelva los datos y será todo igual al ejemplo que te envié en la respuesta anterior.

    En cuanto a lo que dices que le asigno los txtdesde y txthasta a la seccion 2 del reporte, pues si es verdad pero para que?, pues porque muchas veces el cliente necesita ver en el reporte que es Desde tal fecha hasta tal fecha verdad?, entonces solo para eso le asigno eso, pero tambien puedo no hacerlo y en el reporte no se sabria desde que fecha hasta que fecha.

    Aca cito lo que me dices:
    ---------------------------------
    En tu ejemplo, no entiendo la linea: oRepo.SetDataSource(CType(oObjeto.Listar_X_Fechas(CDate(fecha1), CDate(fecha2)), DataTable))
    ----------------------------------
    Bien, esta linea lo que hace es pasar los parámetros de fecha1 y fecha2 a la consulta para que te devuelva los datos en ese rango, y a la vez aprovecho esos parametros para mostrarlos en el reporte, pero tambien solo puedo pasar los parametros para que me devuelva los datos en el reporte y no mostrarlos en el reporte, asi que no tiene nada que ver con lo que estás pensando, sino que esa linea es la que invoca a la funcion de la clase que recibe 2 parametros y te devuelve los datos en ese rango como ya dije, pero yo aprovecho eso mismo para mostrar tambien entre que rango está el reporte, pero no es que le asigne eso al reporte directamente sin los parámetros o que eso sea lo que filtre los datos dentro del reporte, sino que los datos llegan al reporte ya filtrados, y es la manera en que le envio los parametros para que me devuelva los datos en el reporte.

    Espero no haber sino muy extenso en la explicación.

    Cualquier cosa no dudes en escribir.

    A y por cierto soy de Perú, un abrazo desde "Trujillo" Capital Internacional de la Primavera y de la Marinera

    ResponderEliminar
  65. Dios le bendiga Wilfredo, muchas gracias por su apoyo.

    Pues claro, tenía usted razón porque el código para consultar y mostrar en datagridview es sencillo:

    fecha1 = Trim(Me.TextBox1.Text)
    fecha2 = Trim(Me.TextBox2.Text)

    Dim f1, f2 As New DateTime

    f1 = Me.DateTimePicker1.Value.ToShortDateString
    f2 = Me.DateTimePicker2.Value.ToShortDateString

    Try
    Dim DBComando As New OleDbCommand
    obj_conexion_mdf.Open()

    With DBComando
    .CommandText = "prueba"
    .CommandType = CommandType.StoredProcedure
    .Parameters.Add("@fecha1", OleDbType.Date, 10).Value = f1 'Me.TextBox1.Text
    .Parameters.Add("@fecha2", OleDbType.Date, 10).Value = f2 'Me.TextBox2.Text
    .Connection = obj_conexion_mdf

    End With

    Dim Adaptador As New OleDbDataAdapter(DBComando)
    Adaptador.Fill(oCliente)
    obj_conexion_mdf.Dispose()

    Me.DataGridView1.DataSource = oCliente
    Form2.Show()

    Catch ex As Exception
    Throw New Exception(ex.Message)
    End Try

    ResponderEliminar
  66. pero se me presenta un problema que creo que es más sencillo pero no doy...

    en la instruccion form2.show
    este formulario tiene el crystalviewer y en el evento load lo que hago es:

    Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
    ' Asigno el reporte
    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
    CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
    CrReport.SetDataSource(dtDatos)

    Me.CrystalReportViewer1.ReportSource = CrReport

    pero en la instruccion CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")

    me manda un error de "load report failed"

    Que cree que puede ser,? utilicé CrReport.Load(System.AppDomain.CurrentDomain.BaseDirectory & "\CrystalReport1.Rpt")

    pero genera el mismo error.

    Saludos y gracias...Carlos

    ResponderEliminar
  67. Application.StartupPath me retorna:

    C:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\bin\Debug...

    que es donde se encuentra el .exe de la aplicacion, pero si deseo cargar el .rpt deberia de llegar hasta

    C:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\Crystalreport1.rpt

    pero el caso es staruppath busca el .rpt en \bin\debug no en \nuevafecha\.Crystalreport1.rpt

    ResponderEliminar
  68. Dios le bendiga don wilfredo.
    Gracias por su apoyo.

    Ya resolví el problema y tenía razón, era simple lo del llamado al reporte.

    Sólo un problema, cuando cargo el reporte entre rangos de fecha, lo cierro y vuelvo a realizar una nueva búsqueda por fechas o entre el rango anterior, los registros aparecen duplicados en el reporte.

    He probado con objformulario.Dispose() 'el que form que contiene el reporte

    objreporte.Dispose()'el objeto reporte

    objformulario = Nothing
    objreporte = Nothing

    Pero el problema persiste

    Saludos, Carlos

    ResponderEliminar
  69. Muy bien Carlos

    Me alegra que haya podido solucionar su problema.

    Y bueno creo que el primero problema que tenia del error que no encontraba el reporte era porque estaba declarando el namespace "CrystalDecisions.CrystalReports.Engine.ReportDocument"

    Pero deberia hacerlo así:

    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.Shared

    Nada mas y con eso funcionaría sin problemas la llamada con App.Domain. como lo indiqué inicialmente.

    Lo de los registros duplicados, creo que es problema de la consulta, seguramente está devolviendo datos duplicados, y si no es así, talvez exista una propiedad .DiscardesaveData, que debe estar activada para que no se guarden los datos en el reporte y tener el problema de la supuesta duplicidad.

    Espero que todo siga bien y muchos éxitos.

    Hasta pronto

    ResponderEliminar
  70. Saludos nuevamente don Wilfredo.
    Espero esté bien.

    Reiterando mi agradecimiento por su apoyo.

    Fijese que, aunque no tiene que ver directamente con el ejemplo, no sé si le ha pasado que cada vez que abro el reporte en tiempo de ejecución, aparece la consulta anterior, no es duplicación de información porque las pruebo antes en el queryB de access, pero he destruido los objetos asociados con el reporte con dispose() en el evento disposed y deactivate del form que contiene el crystalviewer pero sigue apareciendo el resultado de la consulta anterior...
    Gracias nuevamente, desde Nicaragua ,Carlos

    ResponderEliminar
  71. Hola Carlos

    Para solucionar este inconveniente antes de esta línea:

    CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
    CrReport.SetDataSource(dtDatos)


    Debe poner la siguiente línea:

    CrReport.Refresh

    Y con eso ya no tendrá el problema de los datos anteriores.

    Espero que todo esté bien y solucionado.

    Saludos cordiales

    ResponderEliminar
  72. Wilfredo Excelenete tu comentario de procedimientos almacenados en access lo necesitaba, me queda una duda y es la siguiente:

    haber ubiquemonos en un maestro detalle osea una tabla para el javascript:void(0)encabezado y el otro para el detalle, yo por lo general trabajo mucho begintran y el comitram en Visual Studio 6.0 osea gurado todo de una, no lo hago uno por uno no me gusta, la cuestion es como controlo o como hago para enviarle todo (encabezado y detalle) a un procedimiento

    Te agradezco la informacion

    Marcos Suarez

    ResponderEliminar
  73. Hola

    Haber si esto te da una idea de como grabar un maestro y detalle

    Public Function Grabar(ByVal Fecha As DateTime, ByVal Serie As String, ByVal Numero As String, ByVal Valor_Venta As Decimal, ByVal IGV As Decimal, ByVal Total As Decimal, ByVal Cliente As Integer, ByVal TipoDoc As String, ByVal Detalle As Detalle_VentasDataTable) As Boolean
    Dim Cone As SqlConnection
    Cone = New SqlConnection
    Dim DBComando As New SqlCommand
    Dim T As SqlTransaction
    Try
    Cone.ConnectionString = Conexion.GetConnectionStrings
    Cone.Open()
    T = Cone.BeginTransaction
    With DBComando
    .CommandText = "PA_Inserta_Venta"
    .CommandType = CommandType.StoredProcedure
    .Connection = Cone
    .Transaction = T
    .Parameters.Add("@IdVenta", SqlDbType.Int, 10).Direction = ParameterDirection.Output
    .Parameters.Add("@Fecha", SqlDbType.DateTime, 10).Value = Fecha
    .Parameters.Add("@Serie", SqlDbType.VarChar, 4).Value = Serie
    .Parameters.Add("@Numero", SqlDbType.VarChar, 10).Value = Numero
    .Parameters.Add("@ValorVenta", SqlDbType.Decimal, 14).Value = Valor_Venta
    .Parameters.Add("@Igv", SqlDbType.Decimal, 14).Value = IGV
    .Parameters.Add("@Total", SqlDbType.Decimal, 14).Value = Total
    .Parameters.Add("@IdCliente", SqlDbType.Int, 10).Value = Cliente
    .Parameters.Add("@IdTipoDoc", SqlDbType.VarChar, 4).Value = TipoDoc
    End With

    Dim HuboExito As Integer = DBComando.ExecuteNonQuery
    If HuboExito = 0 Then
    Throw New Exception("Error en la operacion de Inserción")
    T.Rollback()
    End If
    Dim IdVenta As Object
    IdVenta = DBComando.Parameters(0).Value
    Dim Fila As Detalle_VentasRow
    For Each Fila In Detalle.Rows
    Dim DBComandoDet As New SqlCommand
    With DBComandoDet
    .CommandText = "PA_Inserta_Detalle_Venta"
    .CommandType = CommandType.StoredProcedure
    .Connection = Cone
    .Transaction = T
    .Parameters.Add("@IdVenta", SqlDbType.Int, 10).Value = IdVenta
    .Parameters.Add("@IdProducto", SqlDbType.Int, 10).Value = Fila.IdProducto
    .Parameters.Add("@Precio", SqlDbType.Decimal, 14).Value = Fila.Precio
    .Parameters.Add("@Cantidad", SqlDbType.Int, 4).Value = Fila.Cantidad

    Dim TodoBien = DBComandoDet.ExecuteNonQuery
    If TodoBien = 0 Then
    Throw New Exception("Error en la operación de Inserción")
    T.Rollback()
    End If
    End With
    Next
    T.Commit()
    Cone.Close()
    Cone.Dispose()
    Detalle.Rows.Clear()
    Return True
    Catch ex As Exception
    Throw New Exception(ex.Message)
    T.Rollback()
    Return False
    End Try
    End Function

    ResponderEliminar
  74. Hola buenas tardes, estoy trabajando en un proyecto de visual 2005, pero integrado con access, revise en su blog y los aportes son muy buenos para una persona que como yo estoy iniciando mis pinos en este tema de la programacion. Tengo una duda cuando realizao la busqueda no me funciona el procedimiento que tiene en su ejemplo..me podria indicar como debe ir ese procedimiento porque no me permite encontrar el codigo que busco dentro de la base de datos. Muchas gracias por la ayuda que me pueda brindar...

    ResponderEliminar
  75. ah perdon olvide mi nombre es Mario Perez estudiante de programacion aqui en mi pais....

    ResponderEliminar
  76. disculpa no habia notado que los comentarios de este blog fueron ya hace tiempo, pero si es posible obtener su ayuda, de lo que escribi como anonimo me seria de mucha ayuda. te agradezco Wilfredo la colaboracion, es mas en tu blog es la unica ayuda que he visto asi sencilla y practica para poner a prueba..Ya realice la de guardar y funciona bien..sigo en la de buscar..claro que me gustaria saber algo mas, espero no molestar, si yo quiero que la persona al da enter en el cuadro de texto al momento de capturar el codigo puedo hacer que realice la busqueda ahi mismo y le diga que ya existe..espero ser claro en la pregunta...

    ResponderEliminar
  77. Hola Mario Perez

    Pues el procedimientos es muy sencillo para hacer la búsqueda, quedaría mas o menos así:

    PARAMETERS[@Codigo]Text (10);
    Select Codigo,Nombre From Clientes Where Codigo=@Codigo

    Eso es todo y como verás solo recibe el parámetro Código desde la aplicacion y con eso te devuelve los datos.

    Espero tengas claro este tema.

    Y por cierto no se cual es tu país, pero que bueno que te sirva lo que escribo.

    Saludos cordiales

    ResponderEliminar
  78. Hola

    Para hacer lo que quieres, se puede hacer de varias maneras:

    1. Puedes crear una función mas o menos así:

    Public Function Buscar_X_Codigo(ByVal Codigo As String) As Boolean
    Try
    Dim Fila As DataRow
    Dim oCliente As New Dal.Clientes
    If oCliente.Buscar_X_Codigo(Codigo).Rows.Count > 0 Then
    For Each Fila In oCliente.Buscar_X_Codigo(Codigo).Rows
    Me.Codigo = Fila("IdCliente").ToString
    Me.Apellido_Paterno = Fila("ApePaterno").ToString
    Me.Apellido_Materno = Fila("ApeMaterno").ToString
    Me.Nombres = Fila("Nombres").ToString
    Next

    Return True
    Else
    Return False
    End If
    Catch ex As Exception
    Throw New Exception(ex.Message)
    End Try
    End Function

    ----------------

    2.- En el evento keypress del textbox

    puedes poner algo como esto:

    If e.KeyChar = Convert.ToChar(Keys.Return) Then
    If Me.TxtCodigo.Text <> "" Then
    If oCliente.Buscar_X_Codigo(me.txtcodigo.text) then
    messagebox.show"Codigo ya existe"

    Else
    'Aqui pones tu codigo para lo que necesites hacer si no existe el codigo....

    End If

    ResponderEliminar
  79. Hola buen dia..

    Primero que todo soy de Colombia, y el programar es una de mis aficiones que he podido empezar a realizar, pero bueno no en la forma que he esperado. Su blog me ha parecido muy practico y facil de entender frente a otros que son buenos pero no para personas como yo que estamos empezando en este mundo tan grande.

    Igualmeente gracias por la atencion prestada y la ayuda que me ha dado ya realice los cambios que me sugirio y si esta muy bien, solo tengo una duda en la linea que aparece asi :

    Dim Adaptador As New OleDbDataAdapter(DBComando)
    Dim oCliente As New Cliente.ClientesDataTable

    Coloco la base de datos mia y el campo (espero no estarme equivocando) pero no me sale el Datatable..mi visual no me lo sugiere...que puede ser.

    La Base de datos mia se llama Cecan.mdb y la tabla se llama especia y dentro el campo es codigo y nombre.

    Se que el error es mio y probablemente de ubicacion de los datos.

    Quedo a la espera de su orientacion y de antemano por la paciencia que pueda tener frente a mis preguntas.

    Gracias

    Mario

    ResponderEliminar
  80. Hola Mario Perez.

    Pues no es nada de lo que te imaginas, ni ubicación de tus datos o de tu base, sino que debiste leer el artículo y alli dice que está hecho en n-capas el ejemplo ese, pero porque no puedes ver el datatable, es porque no agregaste la capa de Entidades de la que alli hablo ni tampoco el .XSD en el mismo proyecto, eso lo puedes hacer viendo un paso a paso que he preparado y publicado, ya que como verás tengo muchas consultas y comentarios al respecto, este es el enlace para que revises el paso a paso y no tengas dudas.

    Haciendo remember de post antiguo Procedimientos Almacenados en Microsoft Access y Visual Basic 2005

    Espero te sirva y cualquier cosa, no dudes en escribir y contarnos como te fue.

    Saludos cordiales

    ResponderEliminar
  81. Hola Buenas Tardes

    lei el articulo que contiene lo de ncapaz y si claro estaba mirando hacia el punto que no era, esta parte de access no la conocia y me parecio muy interesante, me gustaria saber si contiene o sabee de un articulo que me de mas informacion a fondo sobre el tema.

    Bueno gracias a su ayuda ya puedo grabar un registro, buscarlo igualmente y la base de datos esta como se me sugirio que deberia estar y que no habia entendido.

    Tengo una duda que se que debe ser algo asi como lo de access que no entendi, yo tengo un formulario que tiene dos label y dos textbox, se me pide que al dar enter en el primero me diga si el codigo esta, ya realize los cambios con la ayuda que usted me brindo pero nuevamente quedo en esta linea,

    Dim oCliente As New Dal.Clientes

    debo tener un problema en cuanto al enlace de las bases de datos...De antemano agradezco la paciencia que ha tenido conmigo y un saludo de colombia...

    Gracias

    Mario

    ResponderEliminar
  82. Hola Mario

    Haber

    El problema con enlace a la base de datos como tal, según tú, no existe, lo que pasa es que como ya dije, el proyecto de ejemplo funciona en n-capas, entonces, el asunto es mas o menos asi:

    1.-Capa Cliente=Creas un proyecto de VB .exe que será la capa cliente, donde tendrás los formularios y solamente interactúa hacia atrás con la capa de negocio y nadie mas.

    2.-Capa Negocio=Agregas un proyecto DLL, en el cual será puro codigo y como bien lo dice el nombre, es donde van las reglas de negocio y todas las validaciones y restricciones que necesite la aplicación, y esta capa debe interactuar hacia adelante con la CAPA CLIENTE, y hacia atrás solo debe interactuar con la CAPA DE ACCESO A DATOS (DAL).

    3.- Agregas un proyecto DLL,que será la capa de acceso a datos, la cual interactúa con la Base de Datos en este caso con access, y hacia adelante solo con la CAPA de NEGOCIO, ejemplo de la capa de Acceso a datos es lo que está después del primer formulario en el artículo, donde dice esto:
    Dim Cone as new OLEDB.OLEDBConnection

    Al ser un proyecto independiente, lo podrías llamar como hice yo:El proyecto de acceso a datos se llama DAL (Data Access Layer)

    Y dentro de ese proyecto tendría una clase llamada Cliente

    Y en esa clase iría todo lo que está despues del primer formulario como ya dije.
    Ejemplo

    Public Class Cliente
    Public Function Grabar(Nombre as String,Direccion As String, etc)As Boolean
    ....Aqui todo el codigo que está despues del primer formulario
    ...
    Return Tru

    End Function
    --------------

    Ahora para que funcione todo como relojito, estando en la capa de negocio debes hacer referencia en Referencias del proyecto, seleccionar la referencia al proyecto DAL, y tambien al proyecto de la capa Cliente.

    Entonces con eso cuando estés en tu capa de negocio y quieres registrar un cliente harías uso de la linea que tienes problemas asi:


    Dim oCliente as new Dal.Cliente

    if oCliente(Nombre,Direccion,etc) then
    Return True
    Else
    Return False
    endif

    Ahora eso te serviría para pasar los datos de la capa negocio hacia la capa de datos y por consiguiente hacia la base de datos.

    En cuanto a pasar los datos desde la capa cliente hacia la capa de negocio, el asunto es casi igual, por ejemplo en el boton guardar podrías tener algo como esto:

    dim oClie as CAPANEGOCIO.Cliente
    if oClie.Grabar(Nombre,Direccion,Etc) then
    MEssagebox.Show("Datos grabados","Aviso")
    else
    messagebox.show("No se grabaron los datos","Error")
    endif

    El asunto no es tan dificil de entender, pero tampoco tan sencillo, porque hay que tener algunos temas muy claros.

    Espero con esto te haya despejado la duda, haz las pruebas y luego nos cuentas como te fue.

    Saludos cordiales.

    ResponderEliminar
  83. Buenas noches Wilfredo

    Estuve analizando lo que me dijo y realice un proyecto nuevo con las instrucciones que me dio, pero en algo me estoy quedando y no logro realizar que funcione lo que necesito que salga. hable con mi maestro de programacion y trate de mostrarle la forma en que lo estoy realizando y bueno parece que no le dio mucho interes al tema. A mi me gusta el metodo que usted me sugiere es muy diferente a lo que estamos realizando aqui en clase, pero aun sigo un poco perdido con el tema de las n-capas. Sr. wilfredo me tomo el atyrevimiento de enviarle el codigo que he realizado para que usted me pueda indicar la forma mas acertada de realizarlo, quiero y deseo entender su metodo y no por cumplir aqui en el estudio si no porque me parece que su estilo es sencillo y muy aplicable a cualquier proyecto a realizar. espero no abusar de su confianza al enviarle lo que he realizado.

    Como siempre Gracias y un saludo desde colombia.

    Mario Perez

    ResponderEliminar
  84. Hola Mario Perez

    No hay problema, enviame tu proyecto incluyendo tu Base, para poderlo ver completo y ayudarte, envialo en un archivo .zip para echarle una mirada y poder ayudarte mejor.

    Mi correo es: wpatricio70@hotmail.com, por el cual me puedes contactar y puedes agregarme a tu lista de msn, que con gusto te ayudaré.

    Saludos cordiales

    ResponderEliminar
  85. Men yo tengo una pregunta de casualidad no sabes si en ACCESS es posible reemplazar los procedimientos almacenados que uno crea en SQL ¿?

    ResponderEliminar
  86. Hola

    No es posible, ya que todas las modificaciones se deben hacer desde el mismo SQL Server con el Management Studio.

    Saludos cordiales

    ResponderEliminar
  87. Hola Wilfredo, por favor podrias decirme como sería el asunto con un reporte de Report Services y claro una consulta de access que recibe 2 parámetros y que el resultado se vea en un report viewer. Gracias de antemano.

    ResponderEliminar
  88. Hola Beto Rios

    Pues el asunto no es dificil, solamente tendrías que elaborar tu reporte, poner un reportviewer en un formulario, y para pasarle los parametros tendrías que poner algo asi, en el load del formulario que tiene el report viewer:

    En el load:

    Dim p As New ReportParameter("pDesde", FrmReporteVentas.TxtDesde.Text)
    Dim p2 As New ReportParameter("pHasta", FrmReporteVentas.TxtHasta.Text)
    Me.RvVentas.LocalReport.SetParameters(New ReportParameter() {p})
    Me.RvVentas.LocalReport.SetParameters(New ReportParameter() {p2})
    Me.PA_Listar_Ventas_X_FechasTableAdapter.Fill(Me.Reportes.PA_Listar_Ventas_X_Fechas, CType(FrmReporteVentas.TxtDesde.Text, Date?), CType(FrmReporteVentas.TxtHasta.Text, Date?))


    Me.RvVentas.RefreshReport()

    Con eso ya tienes tu reporte con 2 parámetros, en este caso del ejemplo se está pasando 2 parámetros de fecha, desde y hasta, que es un rango de fechas para obtener un reporte.

    Espero te sirva.

    Saludos cordiales

    ResponderEliminar
  89. Gracias. Es un excelente aporte.

    ResponderEliminar
  90. tengo un problema con mi codigo espero puedan ayudarme, estoy trabajando con webforms de vb.net 2005 y al intenta guardar mis datos no hace nada este es mi codigo.

    Protected Sub Btn_guardar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_guardar.Click

    Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.16.121.64\Coordinación\Modificaciones\Registro_y_seguimiento_datos.mdb")
    Dim strSQL As New OleDbCommand("INSERT INTO Documentos (Folio_Recepcion) VALUES (@Folio_Recepcion)", Conn)
    'Fecha_Documento, Id_TipoDoc, NumeroOficio, Dirigido_a, Remitente, Resumen_Asunto, Insruccion_CGA, Prioridad, Fecha_Limite, Id_Area) VALUES (@Folio_Recepcion, @Fecha_Documento, @Id_TipoDoc, @NumeroOficio, @Dirigido_a, @Remitente, @Resumen_Asunto, @Insruccion_CGA, @Prioridad, @Fecha_Limite, @Id_Area)", Conn)
    Dim prm As New OleDbParameter

    prm = New OleDbParameter("@Folio_Recepcion", OleDbType.Integer)
    prm.Direction = Data.ParameterDirection.Input
    prm.Value = Folio_Recepcion.Text
    strSQL.Parameters.Add(prm)

    Try
    Conn.Open()
    strSQL.ExecuteNonQuery()

    Catch ex As Exception
    Mensaje.Text = "Error al escribir en el archivo..."
    Mensaje.ForeColor = Drawing.Color.Red
    End Try

    Conn.Close()
    strSQL.Parameters.Clear()


    espero me puedan ayudar..

    ResponderEliminar
  91. tengo un problema, me estoy incursionando apenas en esto tengo una base de datos en access y quiero insertar informacion desde un webforms y no me hace nada mi codigo es el siguiente

    Protected Sub Btn_guardar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Btn_guardar.Click

    Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\172.16.121.64\Coordinación\Modificaciones\Registro_y_seguimiento_datos.mdb")
    Dim strSQL As New OleDbCommand("INSERT INTO Documentos (Folio_Recepcion) VALUES (@Folio_Recepcion)", Conn)
    'Fecha_Documento, Id_TipoDoc, NumeroOficio, Dirigido_a, Remitente, Resumen_Asunto, Insruccion_CGA, Prioridad, Fecha_Limite, Id_Area) VALUES (@Folio_Recepcion, @Fecha_Documento, @Id_TipoDoc, @NumeroOficio, @Dirigido_a, @Remitente, @Resumen_Asunto, @Insruccion_CGA, @Prioridad, @Fecha_Limite, @Id_Area)", Conn)
    Dim prm As New OleDbParameter

    prm = New OleDbParameter("@Folio_Recepcion", OleDbType.Integer)
    prm.Direction = Data.ParameterDirection.Input
    prm.Value = Folio_Recepcion.Text
    strSQL.Parameters.Add(prm)

    Try
    Conn.Open()
    strSQL.ExecuteNonQuery()

    Catch ex As Exception
    Mensaje.Text = "Error al escribir en el archivo..."
    Mensaje.ForeColor = Drawing.Color.Red
    End Try

    Conn.Close()
    strSQL.Parameters.Clear()


    espero me puedan ayudar muchas gracias...

    ResponderEliminar
  92. Hola Julio Cesar.

    Te recomiendo que sigas la sintaxis exacta como está en el ejemplo, porque la verdad no se entiende nada tu código, veo comentario y 2 veces VALUES, asi que no se exactamente que hace.

    Trata de seguir el ejemplo que con eso lograrás insertar los datos.

    Luego nos cuentas como te fué

    Saludos cordiales

    ResponderEliminar
  93. Hola wilfredo
    disculpa que te moleste
    quisiera saber como puedo crear una pagina web que me almacene los datos de un cd el autor, el titulo, el precio y la imagen del disco y que en recuadro mas abajo se puedan ver las etichetas de los dicos ya guardados

    ResponderEliminar
  94. disculpa me olvidaba la base de datos en access 2007

    ResponderEliminar
  95. se llama test la tabla cd
    con los campos
    autor titulo precio etiqueta

    ResponderEliminar
  96. Hola Anthony

    No te podría indicar exactamente como hacer tu página, porque hay muchas maneras de abordar ese tema, dependiendo con que lo hagas. asp, asp.net php, lo único que te indicaría en el tema de acceso a los datos si sigues el ejemplo que puse alli lograrás guardar los datos que necesites.

    Saludos

    ResponderEliminar
  97. Hola Antony

    Puedes usar visual studio o visual web developer, y con el realizar toda la parte de la presentación, en cuanto al tema de acceso a los datos, como te dije, usa la misma técnia que indico en el blog y todo irá bien.

    Saludos cordiales

    ResponderEliminar
  98. Hola Wilfredo Patricio Castillo, sabe excelente tu comentarios con respecto a los Procedimientos almacenados en access.

    y Tengo una pregunta con respecto al procedimiento que muestras del
    PROCEDURES [@CODIGO] TEXT (255),[@NOMBRE] TEXT (255), [@DIRECCION] TEXT(255)
    INSERT INTO CLIENTE ...


    Haber que posibilidad hay de EN VIAR OTRO PARAMETRO PARA PREGUNTAR ASI:
    IF [@NUMERO]=1
    INSERT INTO CLIENTE ...
    IF [@NUMERO]=2
    UPDATE CLIENTE...
    IF [@NUMERO]=3
    DELETE CLIENTE ...

    ¿SE PODRA HACER? O DE QUE MANERE.

    TE LO DIGO POR QUE SI TIENES 100 TABLAS Y PARA CADA TABLA HAY QUE HACERLE UN PROCEDIMIENTO PARA INSERTAR, OTRO PARA ACTUALIZA, OTRO PARA ELIMINAR ETCC..

    GRACIAS

    ResponderEliminar
  99. Hola Wilfredo me parecio excelente tu post, por otra parte, es posible que subas un video para ver la accion en forma mas interactiva.
    Saludos

    ResponderEliminar
  100. hola, esta muy bien tu ejemplo, sencillo y practico, pero me gustaria que me ayudes a ejecutar consultas con parametros, en tu ejemplo agregas una linea para cada parametro que quieres definir, sin embargo en SQL server utilizo el sqlcommandbuilder.deriveparameters(cmd) para automaticamente leer los parametros de procedimiento almacenado y asignarles su valor mediante un buqule, de tal modo que solo coloco el nombre del procedimiento almacenado seguido de los valores para los parametros, que automaticamente los llena, ya sean 1 o 100 parametros, de ese modo no tengo que escribir 100 lineas para agregar todos los parametros, BUeno espero haberme explicado bien, te muestro el codigo que utilizo para sqlserver pero que lo modifique para access (OLEDB) pero no me funciona.

    Slds.

    Sub llenar_parametros(ByVal cmd As OleDbCommand, ByVal ParamArray parametros() As Object)
    If CN.State = ConnectionState.Closed Then CN.Open()
    OleDbCommandBuilder.DeriveParameters(cmd)
    Dim prm As New SqlParameter
    Dim I As Integer = 0
    For Each prm In cmd.Parameters
    If prm.ParameterName <> "@RETURN_VALUE" Then
    prm.Value = parametros(I)
    I = I + 1
    End If
    Next
    End Sub

    ResponderEliminar
  101. Hola David

    Gracias por leer el blog y disculpas por la demora en responder.

    Bueno si te fijas en tu código estás haciendo uso de sentencias SQL Server que no son válidas para MS Acess, asimismo hay que recordar que ms access no es un servidor de base de datos como SQL Server, por lo tanto debemos tener presente las limitaciones.

    Saludos cordiales

    ResponderEliminar
  102. Saludos Wilfredo
    Estoy tratando de guardar en una tabla en access los datos de una grilla, al abrir la tabla guarada los datos, pero me sale el siguiente error: El parámetro @Idproducto no tiene un valor predeterminado.
    este es el codigo que utilizo
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'GUARDAR DATOS EN LA TABLA
    conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
    Dim i As Integer
    Dim a As String
    Dim reg As System.Data.OleDb.OleDbCommand

    For i = 0 To DataGridView1.Rows.Count - 1
    a = "Update IngredientesMenus set Idmenu= ""@Idmenu"" where Idproducto= ""@Idproducto"" "
    a = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"

    reg = New System.Data.OleDb.OleDbCommand(a, conexion)
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value

    reg.Connection.Open()
    reg.ExecuteNonQuery()
    reg.Connection.Close()
    Next
    MsgBox("Ingredientes guardados satisfactoriamente")
    Gracias por tu ayuda

    ResponderEliminar
  103. Saludos Wilfredo

    Estoy tratando de guardar en una tabla en Access los datos de una datagrid, al abrir la tabla guarda los datos, pero me sale el siguiente error:
    El parámetro @Idproducto no tiene un valor predeterminado.
    este es el codigo que utilizo
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'GUARDAR DATOS EN LA TABLA
    conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")
    Dim i As Integer
    Dim a As String
    Dim reg As System.Data.OleDb.OleDbCommand

    For i = 0 To DataGridView1.Rows.Count - 1
    a = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"

    reg = New System.Data.OleDb.OleDbCommand(a, conexion)
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value

    reg.Connection.Open()
    reg.ExecuteNonQuery()
    reg.Connection.Close()
    Next
    MsgBox("Ingredientes guardados satisfactoriamente")

    Gracias por tu ayuda

    ResponderEliminar
  104. Hola Edgar

    Primero gracias por visitar el blog.

    Ahora

    Respecto a tu consulta, si te das cuenta en el ejemplo lo que hago es generar una consulta de acción dentro de la base de datos con los parámetros que recibirá y en el formulario en todo caso solo le envio los parámetros.

    Por otro lado el error que te arroja, debe ser porque no está tomando el idproducto al parecer, tendrias que asegurarte que estás capturando el idproducto correcto.

    Lo otra diferencia es la sintaxis que muestro con lo que estás haciendo tu.

    Revisa ese par de cosas y luego nos cuentas como te fue.

    Saludos cordiales

    ResponderEliminar
  105. Saludos Wilfredo

    Ya consegui que me guarde los datos, pero me guarda doble, no se porque, te dejo el codigo a ver si me das una mano.
    Gracias

    'GUARDAR DATOS EN LA TABLA
    conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")

    Dim i As Integer
    Dim reg As New System.Data.OleDb.OleDbCommand
    For i = 0 To DataGridView1.Rows.Count - 1
    reg.Connection = conexion

    reg.CommandText = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"

    reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value

    reg.Connection.Open()
    reg.ExecuteNonQuery()
    reg.Connection.Close()
    Next
    MsgBox("Productos Guardados Satisfactoriamente")

    ResponderEliminar
  106. Saludos Wilfredo

    Ya me guarda los registros, pero el problema es que me guarda doble, te dejo el codigo para que me ayudes.
    Gracias

    conexion = New System.Data.OleDb.OleDbConnection("PROVIDER = MICROSOFT.ACE.OLEDB.12.0;DATA SOURCE= C:\Documents and Settings\Administrador\Escritorio\CONTROLES EDGAR\MENUS\MENUS\Alimentacion.accdb")

    Dim i As Integer

    Dim reg As New System.Data.OleDb.OleDbCommand

    For i = 0 To DataGridView1.Rows.Count - 1

    reg.Connection = conexion
    reg.CommandText = "insert into IngredientesMenus values(@Idmenu,@Idproducto,@Opcion,@Clase,@Producto,@Cantidad)"

    reg.Parameters.Add(New OleDb.OleDbParameter("@Idmenu,", OleDb.OleDbType.VarChar, 15)).Value = Me.Codigomenus.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Idproducto,", OleDb.OleDbType.VarChar, 15)).Value = Me.DataGridView1.Rows(i).Cells("Codigo").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Opcion,", OleDb.OleDbType.VarChar, 60)).Value = Me.TextBox2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Clase,", OleDb.OleDbType.VarChar, 40)).Value = Me.Label2.Text
    reg.Parameters.Add(New OleDb.OleDbParameter("@Producto,", OleDb.OleDbType.VarChar, 60)).Value = Me.DataGridView1.Rows(i).Cells("Producto").Value
    reg.Parameters.Add(New OleDb.OleDbParameter("@Cantidad,", OleDb.OleDbType.Double)).Value = Me.DataGridView1.Rows(i).Cells("Cantidad").Value

    reg.Connection.Open()
    reg.ExecuteNonQuery()
    reg.Connection.Close()
    Next

    MsgBox("Productos Guardados Satisfactoriamente")

    Dim columna As DataGridViewColumn = New DataGridViewTextBoxColumn()
    Dim columna1 As DataGridViewColumn = New DataGridViewTextBoxColumn()
    Dim columna2 As DataGridViewColumn = New DataGridViewTextBoxColumn()

    Me.Codigomenus.Text = ""
    Me.TextBox2.Text = ""
    Me.Label2.Text = ""
    Me.TextBox3.Text = ""
    Me.TextBox4.Text = ""
    Me.TextBox5.Text = ""
    BusquedaOpcionesMenus.campo = ""
    Form11.campo3 = ""
    DataGridView1.Columns.Clear()
    Me.TextBox2.DataBindings.Clear()
    Me.Label2.DataBindings.Clear()
    Me.TextBox4.DataBindings.Clear()
    Me.Codigomenus.Focus()
    columna.Name = "CODIGO"
    columna.Width = 200
    columna1.Name = "PRODUCTO"
    columna1.Width = 595
    columna2.Name = "CANTIDAD"
    columna2.Width = 150
    Me.DataGridView1.Columns.Add(columna)
    Me.DataGridView1.Columns.Add(columna1)
    Me.DataGridView1.Columns.Add(columna2)

    ResponderEliminar
  107. Saludos Wilfredo

    Ya me guarda los datos en la tabla, pero el problema es que me duplica, te dejo el codigo para que me ayudes. Gracias

    Dim i As Integer
    For i = 0 To DataGridView1.Rows.Count - 1
    'Dim da As New OleDb.OleDbDataAdapter
    Dim cmd As New OleDb.OleDbCommand

    conexion.Open()

    cmd.Connection = conexion

    cmd.CommandText = "INSERT INTO IngredientesMenus (" & _
    "Idmenu,Idproducto,Opcion,Clase,Producto,Cantidad " & _
    ") VALUES (" & _
    "'" & Codigomenus.Text & "', " & _
    "'" & DataGridView1.Rows(i).Cells("Codigo").Value & "', " & _
    "'" & TextBox2.Text & "', " & _
    "'" & Label2.Text & "', " & _
    "'" & DataGridView1.Rows(i).Cells("Producto").Value & "', " & _
    "'" & Val(DataGridView1.Rows(i).Cells("Cantidad").Value) & "')"
    DataGridView1.Refresh()

    cmd.ExecuteNonQuery()
    'cmd.CommandType = CommandType.TableDirect
    'da.SelectCommand = cmd
    conexion.Close()
    Next

    ResponderEliminar
  108. Haber amigo Edgar

    Si te fijas en el título del artículo dice "procedimientos almacenados", que no son otra cosa que consultas de acción dentro de la base de datos y a eso nos vamos a ceñir en estos comentarios, si sigues el ejemplo tal cual, no tendrás problemas porque si me has enviado 4 correos con código diferente para hacer lo mismo. Si me salgo del contexto del artículo voy a terminar confundiendo a los lectores.

    Saludos cordiales

    ResponderEliminar
  109. Hola que tal Wilfredo

    Espero me puedas ayudar, mira yo no lo logro que vb guarde los datos en la tabla de access, mi base de datos cuenta con dos tablas, en una tengo que dar de alta usuarioos y en la mascota que le corresponde al usuario que voy a registrar, pero por mas que hago al darle registrar no logro que lo guarde en la base de datos :S
    Espero me puedas ayudar, no se que hacer... veo que en tu publicacion haces consultas en las base de datos, es necesario hacer eso? como lo hago?

    ResponderEliminar
  110. Como se hace un procedimiento almacenado en access y con conexion en java.............Porfavor podrias ayudarme con un ejemplo bien detallado, te lo agradeceria mucho....................gracias de antemano

    ResponderEliminar
  111. Bueno mi estimado amigo
    Lo que escribí en el post es lo que se puede hacer con access, exactamente no son procedimientos almacenados, porque no los soporta, es por eso que hago la aclaración que se pueden hacer algunas cosas pequeñas. Respecto a java, no podría hacerte un post detallado solo para tí, porque en primer lugar no trabajo con java, y no quisiera terminar de confundirte mas, talvez te puedan ayudar busca en www.lawebdelprogramador.com.

    Saludos cordiales

    ResponderEliminar
  112. Wilfredo

    Te hago una consulta:

    Si modificara la cadena de conexión la siguiente manera, podría acceder a una base de datos en red ? :
    Dim Cone As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\server\D:\Pruebas\Pruebas.mdb;Persist security info=false")

    Gracias !

    ResponderEliminar
  113. Así es, porque estás indicando un recurso compartido, asi que no habrá inconveniente., claro que lo ideal sería que la cadena de conexión la leyeras desde el App.config o de algún archivo para evitar incrustar la cadena de conexión en el código de la aplicación.

    ResponderEliminar
  114. Hola Wilfredo, excelente blog, muy informativo.

    Quisiera hacerte una consulta, estoy utilizando Access en VB.net 2008 y actualmente realizo todo por código directo. Me gusto este método por las ventajas que tiene en comparación a mi código actual.

    He realizado algunas pruebas satisfactorias de "Consultas" de Access desde vb y funcionan muy bien, pero no logro hacer una consulta que funcione en access con parámetros y muestre una cantidad "n" de registros y no toda la tabla.
    Tengo varias consultas del tipo: SELECT TOP 10 Nombre, Apellido FROM Clientes;

    En la consulta access pongo algo así:
    PARAMETERS [@Condicion] Integer;
    SELECT TOP [@Condicion] Campo1, Campo2 FROM Tabla;

    Me reclama "La instrucción SELECT incluye una palabra reservada, le falta un argumento o está mal escrito, o bien los signos de puntuación no son correctos. "

    Si escribo: SELECT TOP 22 Campo1, Campo2 FROM Tabla; en la consulta de access, funciona sin problema, puede que sea limitante del access.

    ¿Sabes como hacer algo similar pero con procedimientos almacenados?

    ResponderEliminar
  115. Hola Felipe Andres, solo para decirte que no es parametrizable el "n" en Access ni en SQL Server, pero para lo que tu necesitas las consultas TOP, puedes optar por hacer código desde la aplicación de esta manera no tendrás problemas, te pongo un ejemplo que te debe funcionar sin problemas y obtendrás el TOP que necesitas.

    Private Sub BtnConsultar_Click(sender As Object, e As EventArgs) Handles BtnConsultar.Click
    Try
    If Conn.State = ConnectionState.Closed Then
    Conn.Open()
    End If
    With DBComando
    .CommandText = "SELECT TOP " & CInt(Me.TxtCantidad.Text) & " IdCliente, ApePaterno, ApeMaterno, Nombres From CLIENTES"
    .CommandType = CommandType.Text
    .Connection = Conn
    End With
    Dim rd As OleDbDataReader
    Dim oLista As New List(Of Cliente)
    Dim oClie As New Cliente
    rd = DBComando.ExecuteReader
    If rd.HasRows Then
    While rd.Read
    oClie = New Cliente
    oClie.IdCliente = rd.GetString(0)
    oClie.ApePaterno = rd.GetString(1)
    oClie.ApeMaterno = rd.GetString(2)
    oClie.Nombres = rd.GetString(3)
    oLista.Add(oClie)
    End While
    End If
    rd.Close()
    Me.dgvLista.DataSource = oLista
    Catch ex As Exception
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
    Conn.Close()
    End Try
    End Sub


    Si te fijas no es nada difícil, en el textbox TxtCantidad pones el numero que quieras seleccionar con el TOP (10, 20, etc), solo es cuestión de crear una clase para devolver la lista genérica con los datos y va de maravilla.

    Espero te sirva.

    Saludos cordiales y gracias por visitar el blog.

    ResponderEliminar
    Respuestas
    1. Estimado, gracias por tu respuesta, eso es lo que actualmente realizo con las consultas armadas directo en el código. Efectivamente no se puede incluir como parámetro, seguí buscando información del tema y vi varios comentarios con lo mismo.

      Voy a guardar su ejemplo para futuras referencias, esta muy bueno.
      Le agradezco su tiempo y dedicación, que tenga Feliz año nuevo.

      Eliminar
  116. Hola por casualidad tienes un ejemplo de procedimientos para ser usado con el control DataBindings. Gracias

    ResponderEliminar
  117. jajajaja bien hecho Wilfredo, este post aunque es viejito no esta desfasado aun, me ha servido para un formulario de ingreso de nuevos empleados en mi sistema, la unica variante fue hacer que algunas variables que se usan frecuentemente como el de la conexion a la base de datos, las he declarado de manera global desde un modulo de tal manera que puedo mandarlas a llamar desde cualquier parte del sistema sin necesidad de escibir todo su codigo.

    Saludos y gracias por el aporte

    ResponderEliminar
  118. Pues gracias por visitar el blog y que bueno que te haya servido.

    Saludos cordiales

    ResponderEliminar
  119. Hola, disculpa podrías ayudarme a sincronizar una base de datos creada en access 2013 a visual studio 2010 y una vez sincronizada que busque los datos desde un textbox? por favor y de antemano gracias.

    Rosendo Rodríguez
    3h_chendo@hotmail.com

    ResponderEliminar
  120. Sincronizar?, No entiendo bien que es lo que pretendes, ya que visual studio es un IDE de desarrollo, pero no entiendo lo de sincronizar la base con el visual studio.

    Si fueras mas específico y explicaras con mas claridad te podría ayudar.

    Otra cosa, tu correo está bien escrito?, ya que intenté responderte por allí y dice que no existe.

    ResponderEliminar
  121. ah disculpa es hhh_chendo@hotmail.com, espero tu respuesta

    ResponderEliminar
  122. Hola, tengo una duda las consultas de acción son tambien para la web?

    ResponderEliminar
  123. Si tu aplicación web necesita ejecutar una consulta de acción igualmente se ejecutará, recuerda que al ser una aplicación en capas, la capa de acceso a datos recibirá una petición y no sabrá si lo pidió una aplicación web o de escritorio.

    Saludos cordiales

    ResponderEliminar
  124. Buenas noches don Wilfredo, hace poco menos de 2 años me hizo el favor de orientarme en còmo administrar una base de datos en access 2003 para el desarrollo de un sistema para moteles. Èste ha trabajado de manera òptima, sin embargo surge la necesidad de actualizar el sistema pero ya para un hotel en forma, donde opere las habitaciones, reservaciones, restaurante e ingresos de los empleados. Sè que access me puede dar soporte sin embargo creo que es tiempo de migrar a SQL server. Me gustarìa su opiniòn y consejos pues las veces que lo he solicitado han sido de gran ayuda. Gracias por ello.

    ResponderEliminar
  125. Buenas noches don Wilfredo, hace poco menos de 2 años me hizo el favor de orientarme en còmo administrar una base de datos en access 2003 para el desarrollo de un sistema para moteles. Èste ha trabajado de manera òptima, sin embargo surge la necesidad de actualizar el sistema pero ya para un hotel en forma, donde opere las habitaciones, reservaciones, restaurante e ingresos de los empleados. Sè que access me puede dar soporte sin embargo creo que es tiempo de migrar a SQL server. Me gustarìa su opiniòn y consejos pues las veces que lo he solicitado han sido de gran ayuda. Gracias por ello.

    ResponderEliminar
  126. Hola Guillermo.

    Que bueno saber de tí nuevamente.

    Pues fíjate que lo mejor que has pensado en cuanto a migrar a SQL Sever.

    No se si piensas hacer todo desde cero reescribiendo tu aplicación o solo la base de datos. Si solo es la base de datos pues solo es cosa de planificar esa migración verificando que la data pase sin problemas, para ello te puede ayudar mucho SSMA para access, el cual lo puedes descargar de manera gratuita desde acá:
    https://www.microsoft.com/en-us/download/details.aspx?id=42656

    Haz las pruebas necesarias y luego nos cuentas como te fue.

    Si necesitas reescribir la aplicación pues ahora se hace mucho mas sencillo que hace unos años, ya que tienes a tu disposición Entity Framework que la parte de acceso a datos lo hace por tí, y mejor aún si prefieres hacerla web con ASP.NET MVC, con entity Framework, hasta las vistas te genera, así que no te desanimes, adelante, cualquier cosa solo me escribes.

    Saludos cordiales,

    ResponderEliminar
    Respuestas
    1. Gracias por contestarme y darme, como siempre, la mejor alternativa y las mejores alternativas. Lo voy a hacer desde cero para tener un mejor control y aprovechar las ventajas que ahora se ofrece.

      Eliminar
  127. Una pregunta màs. Que tan conveniente es usar sql express 2014 para crear la base de datos nueva. Las personas tiene movimiento de unas 60 habitaciones diarias con 25 o 30 de las mismas con service room y operan sus empleados en turnos de 12 horas.

    ResponderEliminar
  128. Pues para gestionar esa cantidad de información y operaciones, es mas que suficiente, ya que SQL Server Express 2014, tiene una capacidad de almacenamiento de hasta 10 gigas por base de datos, así que por ese lado no tendrías problemas, no se cuantos usuarios concurrentes vayas a tener, pero como referencia te puedo contar que tengo una aplicación de cuentas corrientes en una oficina de cobranzas, con un promedio de 12 terminales en ventanillas en simultáneo y está soportado por SQL Server express y va sin problemas y ya lleva unos cuantos años, ya que empezó con SQL Server express 2005, y antes de eso estuvo con una base de datos access, se hizo la migración, mejoraron en un 90% los tiempos de respuesta, los procesos de facturación que son los mas largos cada fin de mes no pasa de 7 minutos y claro que son solo 12 mil clientes y hay un poco de lógica alli porque verifica si ya le facturaron por adelantado a un cliente, si tuvo corte de servicio, reposición de servicio y temas como que si va a pagar completo o fracción, entonces todo ese proceso lo hace en el lado del servidor y tranquilo, pero para lo que era antes con access pues el asunto va muy bien. Así que adelante no te desanimes ni te asustes, cualquier cosa estoy a tu disposición.

    Saludos cordiales,

    ResponderEliminar
  129. Gracias don Wilfredo. Ya estoy creando desde cero la base de datos. Tengo mucho del programa avanzado pero en access. Lo unico que va a quedar pendiente es que cuando lo termine tengo que instalar la base de datos y el programa en un servidor que tiene Microsoft SQL Server 12R Standar. Voy a hacer lo mismo que con el de los moteles, crear un disco de instalaciòn e instalarlo, valga la redundacia, en el servidor. ¿Ahì tambièn tengo que instalar el sql server express como en la computadora del usuario antes instalaba access?

    ResponderEliminar
  130. Haber si me dices que tienes un servidor con SQL Server 2012 R2 estándard, ya no tiene sentido instalar el express, puedes usar el 2012 R2, solamente crar el script de creación de la base de datos completa y ejecutarlo en el servidor, con lo cual quedará tu base de datos lista en el servidor.

    La aplicación si tendrás que generar tu instalador e instalarlo en los terminales de los usuarios. En cuanto a lo de access, tampoco es necesario instalar access en cada terminal, solo es cosa de poner la base de datos en una carpeta compartida y la aplicacion debe apuntar a la base de datos en esa carpeta compartida y listo, todo debe funcionar sin problemas. Para el caso de SQL Server es lo mismo, la aplicación debe tener configurado en la cadena de conexion la dirección del servidor y puerto respectivo y todo irá bien.

    Cualquier otra duda, solo me escribes.

    Saludos cordiales.

    ResponderEliminar
  131. Buenas tardes. Me expliquè mal. El access solo lo ocupo en el programa de moteles. Este con el sql va a ser para un hotel. Mi duda es que la base de datos la voy a crear en mi computadora junto con el programa. Al terminarlo tengo que poner la base de datos en el servidor para que los usuarios de recepciòn, ama de llaves y administraciòn accesen a ella. Estoy terminando el desarrollo del còdigo del programa en mi computadora. Mi pregunta es si la base de datos, con la ruta correspondiente puedo llevarla de mi computadora al servidor mediante una "instalacion".

    ResponderEliminar
  132. No, no es así como lo piensas, cuando se trabaja con SQL Server, la base de datos se debe implementar en el servidor, y la aplicación se debe instalar con su instalador, pero sola, y al momento de implementar, puedes configurar la cadena de conexión que apunte a la base de datos en el servidor, pero no se puede llevar la base de datos como un archivo de access, que si se podría hacer, ya que SQL Server, es un servidor que debe estar corriendo y configurado por separado, tu base de datos que estás creando en tu pc, cuando ya esté lista, tiene la opción de generar un script que lo puedes llevar y correr en el servidor y te dejará la base creada en el servidor tal y como lo tienes en tu pc que estás desarrollando.

    Cualquier otra duda, solo me escribes.

    Saludos cordiales,

    PD: No se si lo estés haciendo en capas y orientado a objetos que sería mucho mas mantenible y ordenado, lo cual se te haría mas sencillo pasar a web, con solo agregar una capa cliente web y reutilizarías toda la lógica de negocio y acceso a datos que ya tienes en la aplicaicón de escritorio.

    ResponderEliminar
  133. Buenas noches Don Wilfredo. Nuevamente Guillermo Torres. Terminé de desarrollar el programa e hice la base de datos en sql server express 2014 instalada en una pc que configurè como servidor, instalandole el MS Server 2012 standar. Hice las pruebas pero me fallan algunos procesos pues no acceso a ella. En mi ignorancia, he probado crear la cadena empleando Base de datos basada en servicio; ADO.NET y Conjunto de datos al desarrollar los dataset y en los 3 tengo problemas de comunicación. Me doy a explicar? Sé que estoy haciendo algo mal, pues cuando corro el programa en una base de datos sql local no me falla nada. Qué me aconseja.

    ResponderEliminar
  134. Hola Guillermo.

    Agrégame al skype para poder conversar mas fluido y poderte ayudar mejor en este asunto, ya que por mensajes estamos un poco adivinando.
    Agregame como wilfredopatricio@outlook.com, o búscame como Wilfredo Patricio Castillo, y cuando veas este mismo logo, me agregas y conversamos.

    Saludos cordiales,

    ResponderEliminar
  135. UNA PRUGUNTA COM SERIA.. EL CODIGO PARA UN SELECT. CON LOS MISMO CAMPOR QUE TIENES PARA EL INSERT

    ResponderEliminar
  136. Hola Freddy Orozco, gracias por visitar el blog.

    Lo que pides es sencillo, como este ejemplo trata de hacer los "procedimientos" en la base de datos, quedarías mas o menos así:

    PARAMETERS [@Codigo] Text(10);
    SELECT Codigo,Nombre Direccion From Clientes WHERE Codigo=@Codigo

    Eso sería todo, y la manera de llamarlo está allí arriba donde dice como Buscar.

    Saludos cordiales,

    ResponderEliminar
  137. muy bueno el articulo, a ver si me puedes ayudar, tengo una app en wpf c#, que consulta 4 tablas, cuyo resultado se muestra en un datagrid, quisiera saber si puedo hacer un procedimiento almacenado que me simplifique un poco el codigo, el codigo que uso es este:
    string cadenaselect = "SELECT pacientes.id, pacientes.nombre, pacientes.appat, pacientes.apmat, pacientes.fechanac, pacientes.edad, pacientes.sexo, pacientes.rfc, pacientes.curp, pacientes.calle, pacientes.num_ext, pacientes.colonia, pacientes.delegacion, pacientes.estado, pacientes.cp, pacientes.edocivil, pacientes.ocupacion, pacientes.telefono, pacientes.email, pacientes.fechaing, pacientes.noexp, pacientes.noafil, pacientes.referido, pacientes.rutafoto, antecedentes.afdiab, antecedentes.afcard, antecedentes.afhiper, antecedentes.afneop, antecedentes.afvarices, antecedentes.afotros, antecedentes.appdiab, antecedentes.appcard, antecedentes.apphiper, antecedentes.apphcol, antecedentes.appob,antecedentes.appinf, antecedentes.apptvp, antecedentes.grhblood, antecedentes.apnpalcoh, antecedentes.apnptab, antecedentes.appnptoxi, antecedentes.apnpalerg, antecedentes.apnpgineco_m, antecedentes.apnpgineco_c, antecedentes.apnpgineco_g, antecedentes.apnpgineco_p, antecedentes.apnpgineco_fum, antecedentes.apnpgineco_fup, antecedentes.apnpantqx, antecedentes.apnpfactriesg FROM pacientes INNER JOIN antecedentes ON pacientes.id = antecedentes.idpac";

    OleDbConnection cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["medikfile.Properties.Settings.remunmedikcon"].ToString());
    try
    {
    cn.Open();
    OleDbCommand sc = new OleDbCommand(instruccion, cn);
    OleDbDataAdapter da = new OleDbDataAdapter(sc);
    DataSet ds = new DataSet("TitlesDS");
    da.Fill(ds);
    dg.ItemsSource = ds.Tables[0].DefaultView;
    cn.Close();
    }
    catch (Exception ex)
    { Console.WriteLine("{0} error de conexion", ex); }
    finally
    { }

    ResponderEliminar
  138. Hola Wilfredo, buenos días. Estoy utilizando tu forma de trabajo para una aplicacion en VB.net con base de datos en ACCESS, me parece muy practica la idea de poder modificar los procedimientos desde la base una vez desplegado el programa.
    Te consulto porque tengo un problema al ejecutar el procedimiento almacenado, el cual es un UPSER con datos tomados de un datagrid, me aparece un cartel que dice:
    "No se puede leer ningun registro; no tiene permiso para READ en 'msysobjects'."
    Entiendo que no estoy conectandome como administrador o algo por el estilo.
    Si pudieras guiarme, te agradecería.

    ResponderEliminar
  139. Hola Claudio, para eso el buen Enrique Martínez, en su momento escribió esto, dale una, mirada y te ayudará mucho.

    https://social.msdn.microsoft.com/Forums/lync/es-ES/376b03c9-555f-4b44-bfb9-dc001247b543/error-en-funcinquotno-se-puede-leer-ningn-registroquot

    Espero te ayuda a solucionar tu problema.

    Saludos cordiales,

    Wilfredo.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

TextBox Solo Números con Punto Decimal en .NET

Deshabilitar el botón cerrar [X] de Formularios en Visual Basic 2005/2008