Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: YAcosta en Julio 10, 2014, 03:18:33 pm
-
A mas de uno le pasa este fastidio? no es que sea difícil sino que a veces es tedioso y aburrido, por ejemplo un Insert a tabla con 30 campos entre string e integers y luego mezclarlos con: & "', " &... a cuantos les fastidia eso? ¿como lidian con eso?
-
uhmmm.... pero para eso existen los procedimientos almacenados....
-
Hola Yacosta, hace poco lo habiamos hablado, la mejor manera, pero que tambien me fastidia >: ( ;D, es usar un ADO Command.
Con el ADO COMMAND, declaras cada parametro que vas a pasar a un procedimiento, le decis el nombre del procedimiento, le das ejecutar y LISTO, el se encarga de ejecutarlo.
Lo que me molesta mucho, es que cada parametro que agregas/declaras le tenes que decir de que tipo es: varchar (50) smallint, int, etc
Tiene su ventaja, como él sabe lo que le pasas a cada parametro, en un parametro de tipo string (varchar) podes pasar una cadena con comillas, comas, punto coma, etc, sin que de error la instruccion SQL
Aca encontre el articulo, y un ej que yo habia puesto:
http://leandroascierto.com/foro/index.php?topic=2548.msg13832#msg13832
Y en el mismo articulo Raul comenta que se puede usar sin procedimientos almacenados, a mi con SQL server no me funcionó
http://leandroascierto.com/foro/index.php?topic=2548.msg13836#msg13836
-
Yo creo una clase para manejar los datos, que me valla estructurando la consulta SQL dependiendo de que tipo de consulta estes utilizando o creando.
Yo trabajo con .Net y MySQL por lo tanto pondre mi código y ustedes lo adaptan
La Clase se llama iData
Imports System.Text
Imports MySql.Data.MySqlClient
Public Class iData
Private Conexion As New MySqlConnection
Private Comando As New MySqlCommand
Private Tabla As MySqlDataReader
Private Usuario As String = String.Empty
Private Contraseña As String = String.Empty
Public Sub New(ByVal Usuario As String, ByVal Contraseña As String)
Me.Usuario = Usuario
Me.Contraseña = Contraseña
End Sub
Private Sub Conectar()
Try
If Conexion.State = ConnectionState.Closed Then
Dim SQL As New StringBuilder
SQL.Append("Server=186.151.203.83;Port=1986;Database=tracer;Uid=")
SQL.Append(Usuario)
SQL.Append(";Pwd=")
SQL.Append(Contraseña)
SQL.Append(";")
Conexion.ConnectionString = SQL.ToString
Conexion.Open()
End If
Catch ex As Exception
Debug.Print("--------------Error de Conectar en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Private Sub Desconectar()
Try
Conexion.Close()
Conexion.Dispose()
Catch ex As Exception
Debug.Print("--------------Error de Desconectar en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Public Function TestConexion() As Boolean
Conectar()
Return Conexion.State
Desconectar()
End Function
Public Sub Agregar(ByVal Tabla As String, ByVal Campos As String, ByVal Valores As String)
Try
Conectar()
Dim SQL As New StringBuilder
SQL.Append("INSERT INTO ")
SQL.Append(Tabla)
SQL.Append(" (")
SQL.Append(Campos)
SQL.Append(") Values (")
SQL.Append(Estructura(Valores))
SQL.Append(")")
Debug.Print("Sentencia: " & SQL.ToString)
Comando.Connection = Conexion
Comando.CommandType = CommandType.Text
Comando.CommandText = SQL.ToString
Comando.ExecuteNonQuery()
Desconectar()
Catch ex As Exception
Debug.Print("--------------Error de Agregar en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Public Sub UpgradeFoto(ByVal Tabla As String, ByVal Id As Integer, ByVal Campo As String, ByVal Foto As Image)
Try
Conectar()
Dim SQL As New StringBuilder
SQL.Append("UPDATE ")
SQL.Append(Tabla)
SQL.Append(" SET ")
SQL.Append(Campo)
SQL.Append(" = ?")
SQL.Append(Campo)
SQL.Append(" WHERE ID =")
SQL.Append(Id)
Comando.Connection = Conexion
Comando.CommandType = CommandType.Text
Comando.CommandText = SQL.ToString
Comando.Parameters.AddWithValue("?" & Campo, ObtenerBytes(Foto))
Comando.ExecuteNonQuery()
Desconectar()
Catch ex As Exception
Debug.Print("--------------Error de UpgradeFoto en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Public Sub Actualizar(ByVal Tabla As String, ByVal Id As Integer, ByVal Campos As String, ByVal Valores As String)
Try
Conectar()
Dim SQL As New StringBuilder
Dim vCampos As String() = Split(Campos, ",")
Dim vValores As String() = Split(Estructura(Valores), ",")
SQL.Append("UPDATE ")
SQL.Append(Tabla)
SQL.Append(" SET ")
For n As Integer = 0 To vCampos.Count - 1
SQL.Append(vCampos(n))
SQL.Append("=")
SQL.Append(vValores(n))
If n < vCampos.Count - 1 Then
SQL.Append(",")
End If
Next
SQL.Append(" WHERE ID = ")
SQL.Append(Id)
Debug.Print(SQL.ToString)
Comando.Connection = Conexion
Comando.CommandType = CommandType.Text
Comando.CommandText = SQL.ToString
Comando.ExecuteNonQuery()
Desconectar()
Catch ex As Exception
Debug.Print("--------------Error de Actualizar en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Public Sub Eliminar(ByVal Tabla As String, ByVal Campo As String, ByVal Valor As String)
Try
Conectar()
Dim SQL As New StringBuilder
SQL.Append("DELETE FROM ")
SQL.Append(Tabla)
SQL.Append(" WHERE ")
SQL.Append(Campo & " = ")
SQL.Append(Estructura(Valor))
Comando.Connection = Conexion
Comando.CommandType = CommandType.Text
Comando.CommandText = SQL.ToString
Comando.ExecuteNonQuery()
Desconectar()
Catch ex As Exception
Debug.Print("--------------Error de Eliminar en DataLink --------------")
Debug.Print(ex.Message)
End Try
End Sub
Enum OpcionesBusqueda
UNO
VARIOS
End Enum
Enum TiposBusqueda
IGUAL
DIFERENTE
CONTENGA
ENTRE
End Enum
Public Function Matris(ByVal Opciones As OpcionesBusqueda, ByVal Tipo As TiposBusqueda, ByVal Tabla As String, ByVal Campo As String, ByVal Valor As String) As DataTable
Conectar()
Dim SQL As New StringBuilder
SQL.Append("SELECT * FROM ")
SQL.Append(Tabla)
SQL.Append(" WHERE ")
Select Case Opciones
Case OpcionesBusqueda.UNO
SQL.Append(Campo)
Select Case Tipo
Case TiposBusqueda.IGUAL
SQL.Append("=")
SQL.Append(Estructura(Valor))
Case TiposBusqueda.DIFERENTE
SQL.Append("<>")
SQL.Append(Estructura(Valor))
Case TiposBusqueda.ENTRE
SQL.Append(" BETWEEN ")
Dim Variables() As String = Split(Valor, ",")
SQL.Append(Estructura(Variables(0).ToString))
SQL.Append(" AND ")
SQL.Append(Estructura(Variables(1).ToString))
Case TiposBusqueda.CONTENGA
SQL.Append(" LIKE ")
SQL.Append(Estructura("%" & Valor & "%"))
End Select
Case OpcionesBusqueda.VARIOS
Dim vCampos As String() = Split(Campo, ",")
Dim vValores As String() = Split(Valor, ",")
For n As Integer = 0 To vCampos.Count - 1
SQL.Append(vCampos(n))
Select Case Tipo
Case TiposBusqueda.IGUAL
SQL.Append("=")
SQL.Append(Estructura(vValores(n)))
Case TiposBusqueda.DIFERENTE
SQL.Append("<>")
SQL.Append(Estructura(vValores(n)))
Case TiposBusqueda.ENTRE
SQL.Append(" BETWEEN ")
Dim Variables() As String = Split(vValores(n), "|")
SQL.Append(Estructura(Variables(0)))
SQL.Append(" AND ")
SQL.Append(Estructura(Variables(1)))
Case TiposBusqueda.CONTENGA
SQL.Append("LIKE %")
SQL.Append(Estructura(vValores(n)))
SQL.Append("%")
End Select
If n < vCampos.Count - 1 Then
SQL.Append(" AND ")
End If
Next
End Select
Comando.Connection = Conexion
Comando.CommandType = CommandType.Text
Debug.Print("Consulta : " & SQL.ToString)
Comando.CommandText = SQL.ToString
Dim NuevaTabla As New DataTable
NuevaTabla.Load(Comando.ExecuteReader())
Return NuevaTabla
Desconectar()
End Function
End Class
Va acompañada de un módulo con algunas funciones
Imports System.Drawing
Imports System.Text
Module Funciones
Public Function ObtenerBytes(ByVal img As Bitmap) As Byte()
Dim ms As New System.IO.MemoryStream
img.Save(ms, Imaging.ImageFormat.Bmp)
Dim outBytes(CInt(ms.Length - 1)) As Byte
ms.Seek(0, System.IO.SeekOrigin.Begin)
ms.Read(outBytes, 0, CInt(ms.Length))
Return outBytes
End Function
Public Function ObtenerImagen(ByVal bytes As Byte()) As Bitmap
Return CType(Bitmap.FromStream(New IO.MemoryStream(bytes)), Bitmap)
End Function
Public Function DeFecha(ByVal Fecha As String) As String
Dim Respuesta As String = String.Empty
Dim vFecha As Date = Fecha
Respuesta = Year(vFecha) & "/" & Month(vFecha) & "/" & DateAndTime.Day(vFecha)
Return Respuesta
End Function
Public Function NumResc(ByVal Numero As String) As Double
Dim Respuesta As Double = 0
Try
Respuesta = Val(Replace(Numero, ",", ""))
Catch ex As Exception
Respuesta = 0
End Try
Return Respuesta
End Function
Public Function Estructura(ByVal Valores As String) As String
On Error Resume Next
Dim Respuesta As New StringBuilder
Dim vDatos() As String = Split(Valores, ",")
For n As Integer = 0 To vDatos.Count - 1
If IsDate(vDatos(n)) Then
Respuesta.Append("'")
Respuesta.Append(DeFecha(vDatos(n).ToString))
Respuesta.Append("'")
Else
If IsNumeric(Valores(n)) Then
Respuesta.Append(vDatos(n))
Else
Respuesta.Append("'")
Respuesta.Append(Trim(vDatos(n)))
Respuesta.Append("'")
End If
End If
If n < vDatos.Count - 1 Then
Respuesta.Append(",")
End If
Next
Return Respuesta.ToString
End Function
End Module
-
No se por que no me dejo publicar si me paso de 20000 caracteres, arreglen eso
Cuando lo trabajes tienes que declarar una nueva instancia de la clase en tu formulario algo así (Este es un formulario de incripción del empleado)
Imports System.Text
Public Class FrmEmpleados
Dim DataBase As New iData(Usuario, Contraseña)
Private Sub Limpiar()
lblNombre.Text = ""
txtCUI.Text = ""
txtNombres.Text = ""
txtApellidos.Text = ""
txtFechaNacimiento.Value = Now
txtEdad.Text = ""
txtIGSS.Text = ""
txtDPI.Text = ""
txtDPIDepto.Text = ""
txtDPIMuni.Text = ""
txtNIT.Text = ""
txtIRTRA.Text = ""
txtEstadoCivil.Text = ""
txtCantHijos.Text = ""
txtDireccion.Text = ""
txtDireccionDepto.Text = ""
txtDireccionMuni.Text = ""
txtLugarNacimiento.Text = ""
rbEscolar01.Checked = False
rbEscolar02.Checked = False
rbEscolar03.Checked = False
rbEscolar04.Checked = False
txtUltimoGrado.Text = ""
txtProfesion.Text = ""
picFoto.Image = picFoto.ErrorImage
ListView1.Items.Clear()
ListView2.Items.Clear()
ListView3.Items.Clear()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Try
If ListView1.SelectedItems(0).Tag <> "" Then
DataBase.Eliminar("Empleados_Agenda", "Id", ListView1.SelectedItems(0).Tag)
CargarAgenda()
Else
ListView1.SelectedItems(0).Remove()
End If
Catch ex As Exception
End Try
End Sub
Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
FrmEmpleadoFamiliares.ShowDialog()
End Sub
Private Sub Eliminar()
If txtCUI.Text <> "" Then
Dim Respuesta
Respuesta = MessageBox.Show("Realmente desea Eliminar el Registro?", "Centro de Seguridad", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
If Respuesta = vbOK Then
DataBase.Eliminar("Empleados_Agenda", "CUI", Val(txtCUI.Text))
DataBase.Eliminar("Empleados_Familiares", "CUI", Val(txtCUI.Text))
DataBase.Eliminar("Empleados", "Id", Val(txtCUI.Text))
MessageBox.Show("Registro Eliminado.", "Centro de Seguridad", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Limpiar()
Else
Limpiar()
End If
End If
End Sub
Private Sub Guardar()
Dim Tabla As New StringBuilder
Tabla.Append("Empleados")
Dim Campos As New StringBuilder
Campos.Append("Nombres").Append(",")
Campos.Append("Apellidos").Append(",")
Campos.Append("Nombre").Append(",")
Campos.Append("Sexo").Append(",")
Campos.Append("Fecha_Nacimiento").Append(",")
Campos.Append("Edad").Append(",")
Campos.Append("NoAfiliacionIGSS").Append(",")
Campos.Append("DPI").Append(",")
Campos.Append("DPI_Depto").Append(",")
Campos.Append("DPI_Muni").Append(",")
Campos.Append("Nit").Append(",")
Campos.Append("Irtra").Append(",")
Campos.Append("Estado_Civil").Append(",")
Campos.Append("Cant_Hijos").Append(",")
Campos.Append("Direccion").Append(",")
Campos.Append("Direccion_Depto").Append(",")
Campos.Append("Direccion_Muni").Append(",")
Campos.Append("Lugar_Nac").Append(",")
Campos.Append("Escolaridad").Append(",")
Campos.Append("Escolaridad_Ultimo_Grado").Append(",")
Campos.Append("Profesion")
Dim Valores As New StringBuilder
Valores.Append(txtNombres.Text).Append(",")
Valores.Append(txtApellidos.Text).Append(",")
Valores.Append(txtNombres.Text & " " & txtApellidos.Text).Append(",")
Valores.Append(txtSexo.Text).Append(",")
Valores.Append(FormatDateTime(txtFechaNacimiento.Value, DateFormat.ShortDate)).Append(",")
Valores.Append(txtEdad.Text).Append(",")
Valores.Append(txtIGSS.Text).Append(",")
Valores.Append(txtDPI.Text).Append(",")
Valores.Append(txtDPIDepto.Text).Append(",")
Valores.Append(txtDPIMuni.Text).Append(",")
Valores.Append(txtNIT.Text).Append(",")
Valores.Append(txtIRTRA.Text).Append(",")
Valores.Append(txtEstadoCivil.Text).Append(",")
Valores.Append(txtCantHijos.Text).Append(",")
Valores.Append(txtDireccion.Text).Append(",")
Valores.Append(txtDireccionDepto.Text).Append(",")
Valores.Append(txtDireccionMuni.Text).Append(",")
Valores.Append(txtLugarNacimiento.Text).Append(",")
Valores.Append(Escolaridad("", TipoEscolaridad.Tabla)).Append(",")
Valores.Append(txtUltimoGrado.Text).Append(",")
Valores.Append(txtProfesion.Text)
If txtCUI.Text = "" Then
DataBase.Agregar(Tabla.ToString, Campos.ToString, Valores.ToString)
Dim Dato As New DataTable
Dato = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados", "DPI", txtDPI.Text)
If (Dato.Rows.Count) > 0 Then
txtCUI.Text = Dato.Rows(0).Item("Id").ToString
Else
End If
DataBase.UpgradeFoto("Empleados", Val(txtCUI.Text), "Foto", picFoto.Image)
GuardarAgenda()
GuardarFamiliares()
ElseIf txtCUI.Text <> "" Then
DataBase.Actualizar(Tabla.ToString, Val(txtCUI.Text), Campos.ToString, Valores.ToString)
DataBase.UpgradeFoto("Empleados", Val(txtCUI.Text), "Foto", picFoto.Image)
GuardarAgenda()
GuardarFamiliares()
End If
End Sub
Private Sub GuardarAgenda()
If ListView1.Items.Count > 0 Then
For vAgenda As Integer = 0 To ListView1.Items.Count - 1
If ListView1.Items(vAgenda).Tag = "" Then
Dim ValoresAgenda As New StringBuilder
ValoresAgenda.Append(txtCUI.Text).Append(",")
ValoresAgenda.Append(ListView1.Items(vAgenda).Text).Append(",")
ValoresAgenda.Append(ListView1.Items(vAgenda).SubItems(1).Text)
DataBase.Agregar("Empleados_Agenda", "CUI,Tipo,Telefono", ValoresAgenda.ToString)
End If
Next
End If
End Sub
Private Sub GuardarFamiliares()
If ListView2.Items.Count > 0 Then
For vFamiliares As Integer = 0 To ListView2.Items.Count - 1
If ListView2.Items(vFamiliares).Tag = "" Then
Dim ValoresAgenda As New StringBuilder
ValoresAgenda.Append(txtCUI.Text).Append(",")
ValoresAgenda.Append(ListView2.Items(vFamiliares).Text).Append(",")
ValoresAgenda.Append(ListView2.Items(vFamiliares).SubItems(1).Text)
DataBase.Agregar("Empleados_Familiares", "CUI,Nombre,Parentesco", ValoresAgenda.ToString)
End If
Next
End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Guardar()
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Limpiar()
End Sub
Private Sub FrmEmpleados_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Limpiar()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Limpiar()
txtNombres.Focus()
End Sub
Private Sub txtFechaNacimiento_ValueChanged(sender As Object, e As EventArgs) Handles txtFechaNacimiento.ValueChanged
txtEdad.Text = Int(DateDiff(DateInterval.Year, txtFechaNacimiento.Value, Now))
End Sub
Private Sub txtApellidos_TextChanged(sender As Object, e As EventArgs) Handles txtApellidos.TextChanged
lblNombre.Text = txtNombres.Text & " " & txtApellidos.Text
End Sub
Private Sub txtCUI_KeyUp(sender As Object, e As KeyEventArgs) Handles txtCUI.KeyUp
If txtNombres.Text = "" And txtApellidos.Text = "" And txtDPI.Text = "" And e.KeyCode = Keys.Enter Then
Cargar(Val(txtCUI.Text))
End If
End Sub
Friend Sub Cargar(ByVal Id As Integer)
On Error Resume Next
Dim Empleado As New DataTable
Empleado = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados", "Id", txtCUI.Text)
txtNombres.Text = Empleado.Rows(0).Item("Nombres").ToString
txtApellidos.Text = Empleado.Rows(0).Item("Apellidos").ToString
txtSexo.Text = Empleado.Rows(0).Item("Sexo").ToString
txtFechaNacimiento.Text = Empleado.Rows(0).Item("Fecha_Nacimiento").ToString
txtEdad.Text = Empleado.Rows(0).Item("Edad").ToString
txtIGSS.Text = Empleado.Rows(0).Item("NoAfiliacionIGSS").ToString
txtDPI.Text = Empleado.Rows(0).Item("DPI").ToString
txtDPIDepto.Text = Empleado.Rows(0).Item("DPI_Depto").ToString
txtDPIMuni.Text = Empleado.Rows(0).Item("DPI_Muni").ToString
txtNIT.Text = Empleado.Rows(0).Item("Nit").ToString
txtIRTRA.Text = Empleado.Rows(0).Item("Irtra").ToString
txtEstadoCivil.Text = Empleado.Rows(0).Item("Estado_Civil").ToString
txtCantHijos.Text = Empleado.Rows(0).Item("Cant_Hijos").ToString
txtDireccion.Text = Empleado.Rows(0).Item("Direccion").ToString
txtDireccionDepto.Text = Empleado.Rows(0).Item("Direccion_Depto").ToString
txtDireccionMuni.Text = Empleado.Rows(0).Item("Direccion_Muni").ToString
picFoto.Image = ObtenerImagen(Empleado.Rows(0).Item("Foto"))
txtLugarNacimiento.Text = Empleado.Rows(0).Item("Lugar_Nac").ToString
Escolaridad(Empleado.Rows(0).Item("Escolaridad").ToString, TipoEscolaridad.Formulario)
txtUltimoGrado.Text = Empleado.Rows(0).Item("Escolaridad_Ultimo_Grado").ToString
txtProfesion.Text = Empleado.Rows(0).Item("Profesion").ToString
CargarAgenda()
CargarFamiliares()
End Sub
Private Sub CargarAgenda()
Dim Agenda As New DataTable
Agenda = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados_Agenda", "CUI", txtCUI.Text)
ListView1.Items.Clear()
For n As Integer = 0 To Agenda.Rows.Count - 1
Dim Lv As New ListViewItem(Agenda.Rows(n).Item("Tipo").ToString)
Lv.Tag = Agenda.Rows(n).Item("Id").ToString
Lv.SubItems.Add(Agenda.Rows(n).Item("Telefono").ToString)
ListView1.Items.Add(Lv)
Next
End Sub
Private Sub CargarFamiliares()
Dim Familiares As New DataTable
Familiares = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados_Familiares", "CUI", txtCUI.Text)
ListView2.Items.Clear()
For n As Integer = 0 To Familiares.Rows.Count - 1
Dim Lv As New ListViewItem(Familiares.Rows(n).Item("Nombre").ToString)
Lv.Tag = Familiares.Rows(n).Item("Id").ToString
Lv.SubItems.Add(Familiares.Rows(n).Item("Parentesco").ToString)
ListView2.Items.Add(Lv)
Next
End Sub
Enum TipoEscolaridad
Formulario
Tabla
End Enum
Private Function Escolaridad(ByVal Item As String, ByVal Tipo As TipoEscolaridad)
Dim Respuesta As String = String.Empty
Select Case Tipo
Case TipoEscolaridad.Tabla
If rbEscolar01.Checked Then Respuesta = rbEscolar01.Text
If rbEscolar02.Checked Then Respuesta = rbEscolar02.Text
If rbEscolar03.Checked Then Respuesta = rbEscolar03.Text
If rbEscolar04.Checked Then Respuesta = rbEscolar04.Text
Case TipoEscolaridad.Formulario
If Item = "PRIMARIA" Then rbEscolar01.Checked = True
If Item = "BÁSICO" Then rbEscolar02.Checked = True
If Item = "DIVERSIFICADO" Then rbEscolar03.Checked = True
If Item = "UNIVERSIDAD" Then rbEscolar04.Checked = True
End Select
Return Respuesta
End Function
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
If txtCUI.Text <> "" Then
FrmEmpleadosAgenda.Dispose()
FrmEmpleadosAgenda.ShowDialog()
ElseIf txtCUI.Text <> "" Then
End If
End Sub
Private Sub txtCUI_TextChanged(sender As Object, e As EventArgs) Handles txtCUI.TextChanged
If txtCUI.Text = "" Then
Limpiar()
End If
End Sub
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
Try
If ListView2.SelectedItems(0).Tag <> "" Then
DataBase.Eliminar("Empleados_familiares", "Id", ListView1.SelectedItems(0).Tag)
CargarFamiliares()
Else
ListView2.SelectedItems(0).Remove()
End If
Catch ex As Exception
End Try
End Sub
Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
picFoto.Image = picFoto.ErrorImage
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
FrmEmpleadosBuscar.Dispose()
FrmEmpleadosBuscar.ShowDialog()
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Eliminar()
End Sub
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
Try
OFD1.ShowDialog()
Dim SourceToImage As Bitmap
Dim FileName As String
FileName = OFD1.FileName
'Generar un bitmap para el origen
Dim SourceImage As Bitmap
SourceImage = New Bitmap(FileName)
' Generar un bitmap para el resultado
SourceToImage = New Bitmap(SourceImage.Width, SourceImage.Height)
' Generar un objeto Gráfico para el Bitmap resultante
Dim gr_source As Graphics = Graphics.FromImage(SourceToImage)
' Copiar la imagen origen al Bitmap destino
gr_source.DrawImage(SourceImage, 0, 0, _
SourceToImage.Width, _
SourceToImage.Height)
'Liberar recursos
gr_source.Dispose()
SourceImage.Dispose()
Dim NeedsHorizontalCrop As Boolean = True
Dim NeedsVerticalCrop As Boolean = False
'Determina si la imagen es Landscape o Portrait
If SourceToImage.Height > SourceToImage.Width Then
NeedsHorizontalCrop = False
NeedsVerticalCrop = True
End If
'Determina si la imagen excede el ancho del PictureBox
If SourceToImage.Width < 200 Then
NeedsHorizontalCrop = False
If SourceToImage.Height > 150 Then
NeedsVerticalCrop = True
End If
End If
'Calcula el Factor de Ajuste
Dim scale_factor As Single = 1
If SourceToImage.Width > 0 Then
If NeedsHorizontalCrop = True Then
' Obtiene el Factor de Ajuste
scale_factor = 200 / SourceToImage.Width
End If
End If
If SourceToImage.Height > 0 Then
If NeedsVerticalCrop = True Then
' Obtiene el Factor de Ajuste
scale_factor = 150 / SourceToImage.Height
End If
End If
' Generar un bitmap tmp para el resultado. Ajuste Proporcional
Dim DestTmpImage As New Bitmap( _
CInt(SourceToImage.Width * scale_factor), _
CInt(SourceToImage.Height * scale_factor))
' Generar un objeto Gráfico para el bitmap tmp resultante
Dim gr_desttmp As Graphics = Graphics.FromImage(DestTmpImage)
' Copiar la imagen origen al bitmap tmp destino
gr_desttmp.DrawImage(SourceToImage, 0, 0, _
DestTmpImage.Width, _
DestTmpImage.Height)
'Comprime y Guarda un Archivo Temporal para calcular su peso en Kb
Try
ImageManipulation.SaveJPGWithCompressionSetting(DestTmpImage, Application.StartupPath & "\" & "temp.jpg", 100)
Catch exc As Exception
MessageBox.Show(exc, " Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Dim DestImage As Bitmap
DestImage = New Bitmap(Application.StartupPath & "\" & "temp.jpg")
' Generar un bitmap para el resultado
Dim DestToImage As New Bitmap(DestImage.Width, DestImage.Height)
' Generar un objeto Grafico para el bitmap resultante
Dim gr_dest As Graphics = Graphics.FromImage(DestToImage)
' Copiar la imagen origen al bitmap destino
gr_dest.DrawImage(DestImage, 0, 0, _
DestToImage.Width, _
DestToImage.Height)
'Muestra imagen comprimida
picFoto.Image = CType(DestToImage, Image)
Catch ex As Exception
picFoto.Image = picFoto.ErrorImage
End Try
End Sub
End Class
-
uhmmm.... pero para eso existen los procedimientos almacenados....
No pes... no me refiero a eso
-
MMm, creo que no me he explicado bien a que me refiero. Muchas consultas sql que no las necesito en procedimientos almacenados las tengo en un modulo aparte que las invoco como función. La tipica es escribir algo similar a esto:
sql = "Select * From MiTabla"
rs.Open sql, cnn, 1, 1
Pero yo no uso variable sql, siempre uso funciones para reutilizar esos mismos querys en otras partes del proyecto. Sin embargo a veces me topo con proyectos que me dan este query (ejemplo de un insert):
(http://i.snag.gy/R8VUU.jpg)
Y lo invoco así:
(http://i.snag.gy/poyf2.jpg)
Pero en todo caso al parecer es una forma muy particular de trabajar asi que creo que la propuesta que quería hacer no tendrá asidero, igual estoy haciendo un programita que me ahorre este "formateo", me va quedando asi:
(http://i.snag.gy/6ZDRr.jpg)
Recién me anime a hacerlo porque tendré que armar muchísimos querys de un tirón para un proyecto en Access (por eso no corre el SP, ni tampoco me interesan las "Consultas" o no se como se llame que trae el Access), con esto solo pondré la tabla, los campos y su tipo de datos y el código que me arroje lo copiare en mi código de trabajo, aun lo estoy construyendo y de alli lo paso a personalizar porque creo que estoy al borde del plato :-)
Saludos
-
Me Parece bien que estés haciendo algo así, pero creo que te estás complicando la vida, la idea no es escribir lo menos posible, si las sentencias SQL ya están definidas lo unico que tienes que hacer son plantillas para remplazar los campos y los valores, el problema es que los valores depende de que tipo de campo es pero existen tres grandes valores para todos esos campos
Texto que lleva '' para que pueda agregarse
Número (Llamese número a todo número) que no lleva '' para poder agregarse
Fechas que depende de tu servidor de base de datos en access lleva ## y en mysql '' pero la fecha va en otro formato
Bytes que son Bytes no necesito explicar esto
entonces solo pasa un formating para los tres primeros
Yo llame a esta función Estructura:
Public Function Estructura(ByVal Valores As String) As String
On Error Resume Next
Dim Respuesta As New StringBuilder
Dim vDatos() As String = Split(Valores, ",")
For n As Integer = 0 To vDatos.Count - 1
If IsDate(vDatos(n)) Then
Respuesta.Append("'")
Respuesta.Append(DeFecha(vDatos(n).ToString))
Respuesta.Append("'")
Else
If IsNumeric(Valores(n)) Then
Respuesta.Append(vDatos(n))
Else
Respuesta.Append("'")
Respuesta.Append(Trim(vDatos(n)))
Respuesta.Append("'")
End If
End If
If n < vDatos.Count - 1 Then
Respuesta.Append(",")
End If
Next
Return Respuesta.ToString
End Function
Sirve para 3 de los 4 campos y con la clase que te pase solamente tienes que agregar los campos por que de todos modos los vas a escribir en el código de programación, ahora si no quieres hacer esto utiliza el metodo enlazado a datos
'Agregar
Dim Tabla As New StringBuilder
Tabla.Append("Empleados")
Dim Campos As New StringBuilder
Campos.Append("Nombres").Append(",")
Campos.Append("Apellidos").Append(",")
Campos.Append("Nombre").Append(",")
Campos.Append("Sexo").Append(",")
Campos.Append("Fecha_Nacimiento").Append(",")
Campos.Append("Edad").Append(",")
Campos.Append("NoAfiliacionIGSS").Append(",")
Campos.Append("DPI").Append(",")
Campos.Append("DPI_Depto").Append(",")
Campos.Append("DPI_Muni").Append(",")
Campos.Append("Nit").Append(",")
Campos.Append("Irtra").Append(",")
Campos.Append("Estado_Civil").Append(",")
Campos.Append("Cant_Hijos").Append(",")
Campos.Append("Direccion").Append(",")
Campos.Append("Direccion_Depto").Append(",")
Campos.Append("Direccion_Muni").Append(",")
Campos.Append("Lugar_Nac").Append(",")
Campos.Append("Escolaridad").Append(",")
Campos.Append("Escolaridad_Ultimo_Grado").Append(",")
Campos.Append("Profesion")
Dim Valores As New StringBuilder
Valores.Append(txtNombres.Text).Append(",")
Valores.Append(txtApellidos.Text).Append(",")
Valores.Append(txtNombres.Text & " " & txtApellidos.Text).Append(",")
Valores.Append(txtSexo.Text).Append(",")
Valores.Append(FormatDateTime(txtFechaNacimiento.Value, DateFormat.ShortDate)).Append(",")
Valores.Append(txtEdad.Text).Append(",")
Valores.Append(txtIGSS.Text).Append(",")
Valores.Append(txtDPI.Text).Append(",")
Valores.Append(txtDPIDepto.Text).Append(",")
Valores.Append(txtDPIMuni.Text).Append(",")
Valores.Append(txtNIT.Text).Append(",")
Valores.Append(txtIRTRA.Text).Append(",")
Valores.Append(txtEstadoCivil.Text).Append(",")
Valores.Append(txtCantHijos.Text).Append(",")
Valores.Append(txtDireccion.Text).Append(",")
Valores.Append(txtDireccionDepto.Text).Append(",")
Valores.Append(txtDireccionMuni.Text).Append(",")
Valores.Append(txtLugarNacimiento.Text).Append(",")
Valores.Append(Escolaridad("", TipoEscolaridad.Tabla)).Append(",")
Valores.Append(txtUltimoGrado.Text).Append(",")
Valores.Append(txtProfesion.Text)
If txtCUI.Text = "" Then
DataBase.Agregar(Tabla.ToString, Campos.ToString, Valores.ToString)
Dim Dato As New DataTable
Dato = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados", "DPI", txtDPI.Text)
If (Dato.Rows.Count) > 0 Then
txtCUI.Text = Dato.Rows(0).Item("Id").ToString
Else
End If
DataBase.UpgradeFoto("Empleados", Val(txtCUI.Text), "Foto", picFoto.Image)
GuardarAgenda()
GuardarFamiliares()
ElseIf txtCUI.Text <> "" Then
DataBase.Actualizar(Tabla.ToString, Val(txtCUI.Text), Campos.ToString, Valores.ToString)
DataBase.UpgradeFoto("Empleados", Val(txtCUI.Text), "Foto", picFoto.Image)
GuardarAgenda()
GuardarFamiliares()
End If
'Eliminar
DataBase.Eliminar("Empleados_Agenda", "CUI", Val(txtCUI.Text))
'Consultar y recuperar datos
Dim Empleado As New DataTable
Empleado = DataBase.Matris(iData.OpcionesBusqueda.UNO, iData.TiposBusqueda.IGUAL, "Empleados", "Id", txtCUI.Text)
txtNombres.Text = Empleado.Rows(0).Item("Nombres").ToString
txtApellidos.Text = Empleado.Rows(0).Item("Apellidos").ToString
txtSexo.Text = Empleado.Rows(0).Item("Sexo").ToString
txtFechaNacimiento.Text = Empleado.Rows(0).Item("Fecha_Nacimiento").ToString
txtEdad.Text = Empleado.Rows(0).Item("Edad").ToString
txtIGSS.Text = Empleado.Rows(0).Item("NoAfiliacionIGSS").ToString
txtDPI.Text = Empleado.Rows(0).Item("DPI").ToString
txtDPIDepto.Text = Empleado.Rows(0).Item("DPI_Depto").ToString
txtDPIMuni.Text = Empleado.Rows(0).Item("DPI_Muni").ToString
txtNIT.Text = Empleado.Rows(0).Item("Nit").ToString
txtIRTRA.Text = Empleado.Rows(0).Item("Irtra").ToString
txtEstadoCivil.Text = Empleado.Rows(0).Item("Estado_Civil").ToString
txtCantHijos.Text = Empleado.Rows(0).Item("Cant_Hijos").ToString
txtDireccion.Text = Empleado.Rows(0).Item("Direccion").ToString
txtDireccionDepto.Text = Empleado.Rows(0).Item("Direccion_Depto").ToString
txtDireccionMuni.Text = Empleado.Rows(0).Item("Direccion_Muni").ToString
picFoto.Image = ObtenerImagen(Empleado.Rows(0).Item("Foto"))
txtLugarNacimiento.Text = Empleado.Rows(0).Item("Lugar_Nac").ToString
Escolaridad(Empleado.Rows(0).Item("Escolaridad").ToString, TipoEscolaridad.Formulario)
txtUltimoGrado.Text = Empleado.Rows(0).Item("Escolaridad_Ultimo_Grado").ToString
txtProfesion.Text = Empleado.Rows(0).Item("Profesion").ToString
-
La verdad no te entiendo mucho, pero vos sabras...
Lo que te puedo decir, que use un par de veces esas "consultas" que vienen en Acces, y hasta se pueden usar con parametros "casi" como un procedimiento almacenado, para hacer INSERTS o UPDATES, esta bueno porque metes el codigo ahi, y no te queda en la aplicacion., nunca me trajeron problemas
-
Es que por la forma que negocie con el cliente no puedo hacer eso ya que el va a acceder a la BD, prefiero manejarlo en el VB6. Si fuera con Firebird no tendría problema porque entrego la bd en version compilada y me borro todos los SP ya que igual quedan en la BD pero como "ocultos" e innacesibles, obviamente yo mantengo el backup con todos los SP si es que necesito modificar algo, el cliente solo podrá acceder a su data.
En todo caso, peque en comentar sobre un caso muy especifico, sorry por las molestias igual todo lo comentado me sirve. Saludos
-
Me Parece bien que estés haciendo algo así, pero creo que te estás complicando la vida, la idea no es escribir lo menos posible, si las sentencias SQL ya están definidas lo unico que tienes que hacer son plantillas para remplazar los campos y los valores, el problema es que los valores depende de que tipo de campo es pero existen tres grandes valores para todos esos campos...
Disculpa doc, pero la verdad no entendí mucho tu código y como jugaba con lo que necesito. Tampoco se trataba de reducir código sino de ahorrar tiempo en escribirlo, pero ya no nos liemos el programita ya lo tengo casi terminado y esta es mi solución nada complicada, ya mismo lo estoy personalizando para mis propios requerimientos, pensé que era una necesidad compartida y por eso abrí el post pero no hay lio.
Tema resuelto
-
para eso yo uso capas men.. me desarrolle una capa de sqlHelper..
tengo un metodo que pide el procedimiento almacenado, y otro parametro que es un arreglo de valores
entonces hago un for each o for, no recuerdo para instar cada uno... sin necesidad de hacer inserto into tabla('"+ campo1 +"','"+ campo2 +"',etc..) eso... claro esta... el procedimiento almacenado si de ley tengo que hace el Bendito inserto into tabla('"+ campo1 +"','"+ campo2 +"',etc..), ahora estoy en access pero es igual para sql server u otros motores
pero si de ley tengo que crear ese insert into en un procedimiento almacenado... tu lo estas haciendo en vb6.0, por q no lo haces directamente en tu gestor de base de datos, o primero generas el insert into y luego lo pegas en tu gestor?
-
y con respecto a mi select yo lo hago individual.. si la tabla tiene relaciones con 10 tablas lo que hago es heredar o crear objetos de tipo de esa tabla en mi capa de entidad, y con eso lleno mi objeto o puedo llenar un rs, es lo minimo que debe de tener capa clase de mi sistema... por que si o si es necesario para no repetir codigo
-
Doc, gracias pero como dije el tema ya esta resuelto, si te fijas no pedía ayuda de como resolver algo sino el de poner un antecedente para compartir el código que ya estaba desarrollando pero el tiro salio mal, no me exprese bien ya que se entendió otra cosa. Y para no confundir mas el tema cierro el post ya que es un asunto resuelto.
-
Yo llame a esta función Estructura:
Public Function Estructura(ByVal Valores As String) As String
On Error Resume Next
Dim Respuesta As New StringBuilder
Dim vDatos() As String = Split(Valores, ",")
For n As Integer = 0 To vDatos.Count - 1
If IsDate(vDatos(n)) Then
Respuesta.Append("'")
Respuesta.Append(DeFecha(vDatos(n).ToString))
Respuesta.Append("'")
Else
If IsNumeric(Valores(n)) Then
Respuesta.Append(vDatos(n))
Else
Respuesta.Append("'")
Respuesta.Append(Trim(vDatos(n)))
Respuesta.Append("'")
End If
End If
If n < vDatos.Count - 1 Then
Respuesta.Append(",")
End If
Next
Return Respuesta.ToString
End Function
...
Para que serviria esta funcion y como usarlo, y se puede usar en vb6 por que este code es para vb.net
-
Bien se puede utilizar en vb6, lo que pasa es que tienes que modificarla, en la armada por la clase StringBuilder
lo que hace es que cuando estas armando una cadena de texto para consulta, cae mal estar poniendo los '' o ##
entonces esta pequeña función lo que hace es ver que tipo de dato le estas dando, si es una fecha lo devuelve con su respectivo formato, por ejemplo
a devuelve 'a'
1 devuelve 1
13/12/1944 devuelve '1944-12-13'
para ayudarte a armar sin preocuparte de esas pequeñeses
-
buena pregunta Yvan 8), en mis años ya de programar te puedo decir que he renegado armando los strings, pero hoy en dia ya creo que no hay que renegar tanto para hacer esto, hay formas optimas y otras no tanto, todo depende de lo que te resulta comodo.
procedimientos almacenados no creo que sea la solucion a este tema, los sp estan para optimizar otras cosas, no para hacer simples insert a una base, si alguien crea un sp por cada insert que tiene que hacer a la base, va mal encaminado.
aca te voy a dar algunos consejos de como lo veo yo:
Si de armar el string se trata, me dolio ver tu captura de como armas una funcion con todos los campos y despues la llamas jeje. 8)
Por ejemplo si en un sistema tenes la clase Clientes, y esta tiene 100 campos, pues seguro ya tenes que tener armada la clase con todos los get y set y de esa forma armas dentro de la clase un metodo que arme el string para insertar, no necesitas armar una funcion con los 100 campos y llamarla con los 100 campos, sino que la misma clase se encarga de insertar sus propios campos en la base, obvio tenes que armar el string en algun metodo, pero todo queda dentro de la clase.
Por lo que se en .NET y Java (cuando programo en android) se puede usar lo que te comentaron antes, PARAMETROS, de esa forma solo escribis la parte del INSERT...pero el VALUES no se escribe, en realidad se escribe de otra forma evitando tener que escribir las comillas y todo ese lio.
tambien odio ver todo el string SQL en una sola linea, es algo que no se puede leer, yo por mi parte lo escribo de forma larga uno debajo del otro, tiene mas lineas pero es mas legible.
si de tiempo se trata, gracias que por lo menos eclipse en android, se encarga de casi todo, te arma toda la concatenacion, y la parte del INSERT INTO hoy lo podes autogenerar con cualquier editor de base de datos, ya directamente te genera el insert into con todos los campos, digamos que hoy es facil generar el string completo en algunos IDE.
saludos.