Vous êtes sur la page 1sur 35

Almacenar y Mostrar Imgenes [Vb.

Net & SQL SERVER]


Y Bueno Ahora Para El Ejemplo Crearemos Una Base De Datos Para Este Ejemplo

Hola De Nuevo ahora haremos un ejemplo simple Para Almacenar imgenes en nuestro servidor de base de datos Desde un formulario en el lenguaje desde visual basic.net Para Esto Utilizaremos :

o o o o o o o

4 Button Un Button Para Buscar La Imagen Un Button Para Guardar La Imagen En La Base De Datos Un Button Para Visualizar Las Imgenes Guardadas En La Base De Datos Un Button Para Ocultar Las Imgenes Almacenadas En La Base De Datos 1 OpenFileDialog1 Un OpenFileDialog Para Seleccionar Nuestra Imagen A Almacenar 1 DataGridView Un DataGridView Para Mostrarnos los datos De La Base De Datos 1 PictureBox Un PictureBox Donde Nos Mostrara Y Nos Dara Una vista Previa De las Imgenes. 1 Label

Un Label Para Mostrarlos La Ruta Donde se encuentra la imagen

Create Database TechPeru Go Use TechPeru Go Create Table AlmacenarImagenes( Id int primary key identity(0,1), Imagen Image )

Imports System.Data Imports System.Data.SqlClient Imports System.IO Public Class Form1 Dim Str As String = "Data Source=.;Initial Catalog=TechPeru;Integrated Security=True" Dim Da As New SqlDataAdapter

Dim Dt As DataTable Dim Cn As New SqlConnection(Str) Dim Cmd As New SqlCommand Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Size = New System.Drawing.Size(396, 412) DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect OpenFileDialog1.Filter = "Todos(*.Jpg, *.Png, *.Gif, *.Tiff, *.Jpeg, *.Bmp)|*.Jpg; *.Png; *.Gif; *.Tiff; *.Jpeg; *.Bmp" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Size = New System.Drawing.Size(396, 412) End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Me.Size = New System.Drawing.Size(396, 591) Try Cn.Open() With Cmd .CommandType = CommandType.Text .CommandText = "SELECT * from AlmacenarImagenes" .Connection = Cn End With With Da .SelectCommand = Cmd

Dt = New DataTable .Fill(Dt) DataGridView1.DataSource = Dt End With Catch ex As Exception MsgBox(ex.Message) Finally Cn.Close() End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click OpenFileDialog1.ShowDialog() Label1.Text = OpenFileDialog1.FileName.ToString PictureBox1.Image = System.Drawing.Image.FromFile(Label1.Text) End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Try Cn.Open() Dim arrFilename() As String = Split(Text, "\") Array.Reverse(arrFilename) Dim ms As New MemoryStream PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat) Dim arrImage() As Byte = ms.GetBuffer

With Cmd .CommandType = CommandType.Text .CommandText = "Insert Into AlmacenarImagenes(Imagen)Values(@Imagen)" .Connection = Cn .Parameters.Add(New SqlParameter("@Imagen", SqlDbType.Image)).Value = arrImage End With MessageBox.Show("Registrado Correctamente") Cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message) Finally Cmd.Parameters.Clear() Cn.Close() End Try End Sub Function ExtraerImagen(ByVal Foto As Integer) As Byte() With Cmd .CommandType = CommandType.Text .CommandText = "Select Imagen From AlmacenarImagenes Where id = " & Foto .Connection = Cn End With With Cn .Open() Dim MyPhoto() As Byte = CType(Cmd.ExecuteScalar(), Byte()) .Close()

Return MyPhoto End With End Function Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Try Dim ms As New MemoryStream(ExtraerImagen(CInt(DataGridView1.SelectedCells(0).Value))) PictureBox1.Image = Image.FromStream(ms) Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class

DATA GRIV VIEW MANTENIMIENTO LIMPIAR CAJA TEXT

ANTES QUE TODO PEGAR EL DATAGRIIWVIEW Y AADIR LOS PROCEDIMEITNOS ALMACENADOS


Public Class Form1

Public total As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: esta lnea de cdigo carga datos en la tabla 'UNIDataSet.amigos' Puede moverla o quitarla segn sea necesario. Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) Me.Label8.Text = Me.UNIDataSet.amigos.Count

End Sub

Private Sub limpiartext(ByVal form As Form) 'limpiar todos los cuadros de text del form For Each oControl As Control In form.Controls If TypeOf oControl Is TextBox Then oControl.Text = "" End If Next

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.AmigosTableAdapter.agregar(text1.Text, text2.Text, text3.Text, text4.Text, text5.Text, text6.Text) Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) 'llamamos al procedimiento pa limpiar los textbox Call limpiartext(Me) End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.AmigosTableAdapter.actualizar(text1.Text, text2.Text, text3.Text, text4.Text, text5.Text, text6.Text) Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) Call limpiartext(Me)

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Me.AmigosTableAdapter.borrar(text1.Text) Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Me.AmigosTableAdapter.FillBy(Me.UNIDataSet.amigos, text1.Text) End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Me.AmigosTableAdapter.FillByN(Me.UNIDataSet.amigos, text2.Text) End Sub End Class

DATA GRIV VIEW MANTENIMIENTO LIMPIAR CAJA TEXT CON BLINDIN


MANTENIMIENTO

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: esta lnea de cdigo carga datos en la tabla 'UNIDataSet.amigos' Puede moverla o quitarla segn sea necesario. Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) ' INTRUCCIONES PARA LLENADO DE TEXBOX DESDE BINDING Me.txtdni.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "dni", True)) Me.txtnombres.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "nombres", True)) Me.txtapellidos.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "apellidos", True)) Me.txtdireccion.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "direccion", True)) Me.txtedad.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "edad", True)) Me.txtcurso.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "curso", True)) 'Deshabilitar busqueda lblbuscar.Text = "NO BUSQUEDAS" txtbuscar.Enabled = False Button1.Enabled = False Call deshabilitartext(Me)

End Sub

Private Sub habilitartext(ByVal form As Form) 'limpiar todos los cuadros de text del form For Each oControl As Control In form.Controls If TypeOf oControl Is TextBox Then oControl.Enabled = True End If Next End Sub Private Sub deshabilitartext(ByVal form As Form) 'limpiar todos los cuadros de text del form For Each oControl As Control In form.Controls If TypeOf oControl Is TextBox Then oControl.Enabled = False End If Next End Sub Private Sub limpiartext(ByVal form As Form) 'limpiar todos los cuadros de text del form For Each oControl As Control In form.Controls If TypeOf oControl Is TextBox Then oControl.Text = "" End If Next

End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) Call limpiartext(Me) 'Deshabilitar busqueda lblbuscar.Text = "NO BUSQUEDAS" Button1.Enabled = False 'habilitartext cuadro text Call habilitartext(Me)

End Sub Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click Me.AmigosTableAdapter.nuevo(txtdni.Text, txtnombres.Text, txtapellidos.Text, txtdireccion.Text, txtedad.Text, txtcurso.Text) 'actualizar la tabla Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.AmigosTableAdapter.BUSCAR(Me.UNIDataSet.amigos, txtbuscar.Text) End Sub Private Sub NombresToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NombresToolStripMenuItem.Click LBLbuscar.Text = "INGRESE EL NOMBRE" End Sub Private Sub DNIToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DNIToolStripMenuItem.Click 'Habilitar busqueda lblbuscar.Text = "INGRESE EL NUMERO DNI" txtbuscar.Enabled = True Button1.Enabled = True

End Sub Private Sub CursoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CursoToolStripMenuItem.Click lblbuscar.Text = "INGRESE EL NOMBRE DEL CURSO" End Sub End Class

CARGA DATOS A UN COMBO BOX

Manera 01

Pero en el titulo del mensaje dice textbox, y en la descripcion del problema dices combobox, que control deseas cargar ? si la idea es cargar un combobox podrias usar Using cn As New SqlConnection("connection string") Dim sql as String = "SELECT id, nombre FROM <tabla>" Dim cmd As New SqlCommand(sql, cn) Dim da As New SqlDataAdapter(cmd) Dim dt As New DataTable da.Fill(dt) combobox.DisplayMember = "nombre" combobox.ValueMember = "id" combobox.DataSource = dt End Using

Manera 02 . teniendo ya conectado un bindi al datagrid


Propiedades del ComboBox Datasource - amigosbindinsource DisplayMember - nombres ValueMenber - nombres

AGREGANDO REGISTROS A UN TEXTBOX DESDE BD SQL CON BINDIG

Antes que todo se agrega el DAtaGriwView y se realiza la conexion

MODO GRID CON PROCEDIMIENTO ALMACENADOS

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: esta lnea de cdigo carga datos en la tabla 'UNIDataSet.amigos' Puede moverla o quitarla segn sea necesario. Me.AmigosTableAdapter.Fill(Me.UNIDataSet.amigos) ' INTRUCCIONES PARA LLENADO DE TEXBOX DESDE BINDING Me.txtdni.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "dni", True)) Me.txtnombres.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "nombres", True)) Me.txtapellidos.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "apellidos", True)) Me.txtdireccion.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "direccion", True)) Me.txtedad.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "edad", True)) Me.txtcurso.DataBindings.Add(New System.Windows.Forms.Binding("Text", AmigosBindingSource, "curso", True)) End Sub

AADIR REGISTRO A UNA BASE DATOS SQL POR MEDIO DE UN TEXTBOX

Creamos la bd - interusuario Creamos la tabla - usuario Creamos el procedimiento almacenado - agregar PROCEDIMIENTO AGREGAR

create procedure insertar @nombre varchar(50), @apellidos varchar(50) as begin insert into usuario values (@nombre, @apellidos) raiserror ('usuario agregado',16,1) end

Botn Insertar Imports System.Data Imports System.Data.SqlClient Imports System.Configuration

Explorador de soluciones Agregar Referencia

Net System.configuration

Exporador de soluciones Agregar Nuevo elemento General Archivo de configuracinn de aplicaciones App.config Ingresamos al App.config Anadimos Debajo de configuracin esta lnea de comando <connectionStrings> <add name="conexion" connectionString="Data Source=LENIN; initial catalog=interusuario; integrated security=true" providerName="System.data.sqlclient"/> </connectionStrings>

Luego vamos al botn click

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try Dim conex As New SqlConnection(ConfigurationManager.ConnectionStrings("conexion") .ConnectionString) Dim cmd As New SqlCommand("insertar", conex) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add("@nombre", SqlDbType.VarChar).Value = TextBox1.Text cmd.Parameters.Add("@apellidos", SqlDbType.VarChar).Value = TextBox2.Text conex.Open() cmd.ExecuteNonQuery() conex.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try

End Sub End Class

CARGAR DATOS BD A UN COMBOBOX POR MEDIO DE UN COMANDO CARGAR

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim sql As String Dim cn As SqlConnection Dim cm As SqlCommand Dim da As SqlDataAdapter Dim ds As DataSet Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cn = New SqlConnection("Data Source=LENIN;Database=uni;integrated security =true") cn.open() Sql = "SELECT nombres FROM amigos" cm = New SqlCommand() cm.CommandText = Sql cm.CommandType = CommandType.Text cm.Connection = cn

End Sub

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click da = New SqlDataAdapter(cm) ds = New DataSet() da.Fill(ds)

ComboBox1.DataSource = ds.Tables(0)

ComboBox1.DisplayMember = "nombres" ComboBox1.ValueMember = "nombres" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub

End Class

MAS ORDENADO
Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim Dim Dim Dim Dim sql As String cn As SqlConnection cm As SqlCommand da As SqlDataAdapter ds As DataSet

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cn = New SqlConnection("Data Source=LENIN;Database=uni;integrated security =true") cn.Open() sql = "SELECT nombres FROM amigos" cm = New SqlCommand() cm.CommandText = sql cm.CommandType = CommandType.Text cm.Connection = cn End Sub Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click da = New SqlDataAdapter(cm) ds = New DataSet() da.Fill(ds) ComboBox1.DataSource = ds.Tables(0) ComboBox1.DisplayMember = "nombres" ComboBox1.ValueMember = "nombres" End Sub End Class

MAS REDUCIDO Y SIMPLE

Imports System.Data Imports System.Data.SqlClient Public Class Form1 Dim Dim Dim Dim Dim sql = cn As cm As da As ds As "SELECT nombres FROM amigos" New SqlConnection("Data Source=LENIN;Database=uni;integrated security =true") New SqlCommand() New SqlDataAdapter(sql, cn) New DataSet()

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click da.Fill(ds) ComboBox1.DataSource = ds.Tables(0) ComboBox1.DisplayMember = "nombres" 'ComboBox1.ValueMember = "nombres" End Sub End Class

Llenar Un ComboBox Desde BD [Vb.net & SQL Server]


Publicado el 15 agosto, 2011 por Luis Bautista

Bueno Para EL Siguiente Ejercicio Mostraremos Como Mostrar Registros de una Base De Datos(BD) En El Control ComboBox. Para Este Tendremos En Cuenta!! Las Siguientes Propiedades Del Combobox
Propiedad DataSource Descripcion Obtiene o establece el origen de datos de este objeto ComboBox.

DisplayMember Obtiene o establece la propiedad que se va a mostrar. ValueMember Obtiene o establece la propiedad que se utilizar como valor real.

Bien Tomando En Cuenta Estas Propiedades. Comenzaremos A Crear Muestra BD Para Nuestra Prueba.
01 </pre> 02 --Creamos La BD 03 Create Database Prueba 04 --Seleccionamos La BD Prueba 05 Use Prueba 06 --Creamos La Tabla Animales 07 --Con El Campo id Como Clave 08 --Primeria Y Que Aumente De Uno En Uno 09 Create Table Animales( 10 id Int PRIMARY KEY not null identity(1, 1),

11 nombre nvarchar(50) 12 ) 13 --Insertamos Registros 14 insert into Animales(nombre) values('Gato') 15 insert into Animales(nombre) values('Perro') 16 insert into Animales(nombre) values('Perico') 17 insert into Animales(nombre) values('Loro') 18 insert into Animales(nombre) values('Mono') 19 --Mostramos Los Registros De La Tabla Animales 20 Select * From Animales

Ahora Diseamos Nuestro Formulario

Codigo Fuente:
Imports System.Data.SqlClient 02 Public Class Form1 03 04 05 06 Dim Dt As DataTable Dim Cn As New SqlConnection("Data Source=.;Initial Catalog=Prueba;Integrated Security=True") Dim Da As New SqlDataAdapter Dim Cmd As New SqlCommand

07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


With Cmd .CommandType = CommandType.Text .CommandText = "Select * From Animales" .Connection = Cn End With Da.SelectCommand = Cmd Dt = New DataTable Da.Fill(Dt) With ComboBox1 .DataSource = Dt .DisplayMember = "nombre" .ValueMember = "id" End With End Sub

22 End Class

Imports System.Data.SqlClient

Public Class Form1 Dim Dim Dim Dim dt As DataTable cn As New SqlConnection("data source=.;initial catalog=uni; integrated security=true") da As New SqlDataAdapter cmd As New SqlCommand

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click With cmd .CommandType = CommandType.Text .CommandText = "select * from amigos" .Connection = cn End With da.SelectCommand = cmd dt = New DataTable da.Fill(dt) With ComboBox1 .DataSource = dt .DisplayMember = "nombres" .ValueMember = "dni" End With End Sub End Class

ADO.NET

Esta tecnologa es una parte del .NET Framework 3.0 (habiendo sido parte del framework desde la versin 1.0).

ADO.NET es un conjunto de componentes del software que pueden ser usados por los programadores para acceder a datos y a servicios de datos. Es una parte de la biblioteca de clases base que estn incluidas en el Microsoft .NET Framework. Es comnmente usado por los programadores para acceder y para modificar los datos almacenados en un Sistema Gestor de Bases de Datos Relacionales, aunque tambin puede ser usado para acceder a datos en fuentes no relacionales. ADO.NET es a veces considerado como una evolucin de la tecnologa ActiveX Data Objects (ADO), pero fue cambiado tan extensivamente que puede ser concebido como un producto enteramente nuevo.

Arquitectura
ADO.NET consiste en dos partes primarias:

Data provider
Estas clases proporcionan el acceso a una fuente de datos, como Microsoft SQL Server y Oracle. Cada fuente de datos tiene su propio conjunto de objetos del proveedor, pero cada uno tienen un conjunto comn de clases de utilidad: Connection: Proporciona una conexin usada para comunicarse con la fuente de datos. Tambin acta como Abstract Factory para los objetos command. Command: Usado para realizar alguna accin en la fuente de datos, como lectura, actualizacin, o borrado de datos relacionales. Parameter: Describe un simple parmetro para un command. Un ejemplo comn es un parmetro para ser usado en unprocedimiento almacenado. DataAdapter: "Puente" utilizado para transferir data entre una fuente de datos y un objeto DataSet (ver abajo). DataReader: Es una clase usada para procesar eficientemente una lista grande de resultados, un registro a la vez.

[editar ]DataSets Los objetos DataSets, es un grupo de clases que describen una simple base de datos relacional en memoria, fueron la estrella del show en el lanzamiento inicial (1.0) del Microsoft .NET Framework. Las clases forman una jerarqua de contencin: Un objeto DataSet representa un esquema (o una base de datos entera o un subconjunto de una). Puede contener las tablas y las relaciones entre esas tablas. Un objeto DataTable representa una sola tabla en la base de datos. Tiene un nombre, filas, y columnas. Un objeto DataView "se sienta sobre" un DataTable y ordena los datos (como una clusula "order by" de SQL) y, si se activa un filtro, filtra los registros (como una clusula "where" del SQL). Para facilitar estas operaciones se usa un ndice en memoria. Todas las DataTables tienen un filtro por defecto, mientras que pueden ser definidos cualquier nmero de DataViews adicionales, reduciendo la interaccin con la base de datos subyacente y mejorando as el desempeo. Un DataColumn representa una columna de la tabla, incluyendo su nombre y tipo. Un objeto DataRow representa una sola fila en la tabla, y permite leer y actualizar los valores en esa fila, as como la recuperacin de cualquier fila que est relacionada con ella a travs de una relacin de clave primaria - clave extranjera. Un DataRowView representa una sola fila de un DataView, la diferencia entre un DataRow y el DataRowView es importante cuando se est interactuando sobre un resultset. Un DataRelation es una relacin entre las tablas, tales como una relacin de clave primaria - clave ajena. Esto es til para permitir la funcionalidad del DataRow de recuperar filas relacionadas. Un Constraint describe una propiedad de la base de datos que se debe cumplir, como que los valores en una columna de clave primaria deben ser nicos. A medida que los datos son modificados cualquier violacin que se presente causar excepciones. Un DataSet es llenado desde una base de datos por un DataAdapter cuyas propiedades Connection y Command que han sido iniciados. Sin embargo, un DataSet puede guardar su contenido a XML (opcionalmente con un esquema XSD), o llenarse a s mismo desde un XML, haciendo esto excepcionalmente til para los servicios web, computacin distribuida, y aplicaciones ocasionalmente conectadas.

PANTILLA DE PROCEDIMIENTOS ALMACENADOS


CREATE PROCEDURE [dbo].[Objeto_Accion] -- Parmetros de salida [<@paramOUT> int OUTPUT[, <@paramOUTMSG> varchar(255) OUTPUT] -- Parmetros de entrada (obligatorios) <@param1> <datatype>, <@param2> <datatype>, ... -- Parmetros de entrada (opcionales) <@param11> <datatype> = <default value>, <@param12> <datatype> = <default value>, ...
AS

-- Bloque de declaracin de variables DECLARE <@ValorDevuelto> int [DECLARE <@MensajeDevuelto> varchar(255)] -- Bloque de declaracin de constantes DECLARE <@ValorDevuelto> int BEGIN

-- Bloque de sentencias SELECT -- Asignacin de variables. -- Validaciones. -- Condicin de salida previa [IF <condicin de salida previa> BEGIN SET <@ValorDevuelto> = -1 [SET <@MensajeDevuelto> = 'Detalle de condicin de salida']

[SET <@paramOUT> = <@ValorDevuelto>] [SET <@paramOUTMSG> = <@MensajeDevuelto>] SELECT <@ValorDevuelto>[, <@MensajeDevuelto>] RAISEERROR (50001, 25, Salida sin ejecucin)

-- Salida sin ejecucin RETURN(-1) END ] [SET TRANSACTION ISOLATION LEVEL ] SET XACT_ABORT ON

BEGIN TRY

BEGIN TRANSACTION

-- Bloque de sentencias DML -- ... -- ... -- Recuperar el ID que nos interesa devolver a la aplicacin SET <@ValorDevuelto> = SCOPE_IDENTITY()

-- Bloque de auditoria SET ... INSERT INTO Auditoria

COMMIT TRANSACTION

[SET <@MensajeDevuelto> = 'Mensaje de ejecucin OK'] [SET <@paramOUT> = <@ValorDevuelto>]

[SET <@paramOUTMSG> = <@MensajeDevuelto>] SELECT <@ValorDevuelto>[, <@MensajeDevuelto>]

-- Salida con ejecucin exitosa RETURN (1) END TRY

BEGIN CATCH

-- Obtener info del error. Escribir en tabla de track de Errores SET @ERROR_NUMBER = ERROR_NUMBER() SET @ERROR_SEVERITY = ERROR_SEVERITY() SET @ERROR_STATE = ERROR_STATE() SET @ERROR_LINE = ERROR_LINE() SET @ERROR_PROCEDURE = ERROR_PROCEDURE() SET @ERROR_MESSAGE = ERROR_MESSAGE() -- Test XACT_STATE() -- If -- If 1, la XACT es "committable". COMMIT 0, no hay XACT abierta. -- If -1, la XACT es "uncommittable". ROLLBACK

IF (XACT_STATE()) = -1 ROLLBACK TRANSACTION IF (XACT_STATE()) = 1 COMMIT TRANSACTION -- Ante error SQL se devuelve a la aplicacin el ID del registro conteniendo el error en la tabla ErrorInfo -- INSERT INTO ErrorInfo ---(ErrorNumber, ErrorSeverity, ErrorState, ErrorLine, ErrorProcedure, VALUES (@ERROR_NUMBER, @ERROR_SEVERITY, @ERROR_STATE, @ERROR_LINE, ErrorMessage)

@ERROR_PROCEDURE, @ERROR_MESSAGE)

-- RAISEERROR (@ERROR_NUMBER, @ERROR_SEVERITY, @ERROR_MESSAGE);

SET <@ValorDevuelto> = SCOPE_IDENTITY() [SET <@MensajeDevuelto> = {'Detalle del Error' | @ERROR_MESSAGE | ...}] [SET <@paramOUT> = <@ValorDevuelto>] [SET <@paramOUTMSG> = <@MensajeDevuelto>] SELECT <@ValorDevuelto>[, <@MensajeDevuelto>]

-- Salida con error RETURN (0) END CATCH END GO

Paso a explicar en detalle las secciones ms importantes de la plantilla.

Parmetros de salida

[<@paramOUT> OUTPUT[, <@paramOUTMSG> OUTPUT]]


Si bien figura como un bloque opcional, es aconsejable devolver tanto el valor de salida del procedimiento como el mensaje explicativo de xito o error como parmetros de salida adems de como parte del SELECT de resultados. Bloque de sentencias SELECT En este bloque deben incluirse todas las asignaciones de variables de trabajo que puedan consultarse en forma independiente a la transaccin. De esta manera se reduce el tiempo de bloqueos exclusivos requerido por el procedimiento. Si existen variables cuyos valores influyen directamente en la transaccin debern asignarse dentro del bloque BEGIN TRANSACTION END TRANSACTION configurando para ello el nivel de aislamiento deseado previo al mismo:

[SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT}]

Condicin de salida previa Si el procedimiento debe incluir algunas verificaciones para detectar casos que impidan la ejecucin del mismo, las mismas deben programarse de acuerdo al esquema propuesto en la plantilla. En este caso <@ValorDevuelto> = -1 y <@MensajeDevuelto> puede contener un detalle de porque se abandon el procedimiento sin ejecutarlo. El valor de retorno puede ser 0 1. Este ltimo caso permitira diferenciar el estado de ejecucin del procedimiento:

1 indicara ejecucin correcta. <1 indicara ejecucin incorrecta.

o o

0 ejecucin con error. -1 no ejecucin por pre-condicin no cumplida.

SET XACT_ABORT ON El uso de esta sentencia ha generado mucha discusin en nuestras reuniones de capacitacin. Finalmente concluimos que este valor es indispensable configurar previo a la ejecucin todo bloque BEGIN TRY / BEGIN TRANSACTION COMMIT TRANSACTION / END TRY. La explicacin ms exacta del por qu el uso de esta configuracin, es porque su utilizacin permite que cualquier error que se produzca dentro del bloque BEGIN TRY END TRY marque como invlida a la transaccin.

Bloque de sentencias DML Siempre dentro del bloque BEGIN TRY / BEGIN TRANSACTION COMMIT TRANSACTION / END TRY.

Bloque de auditoria Si no hay implementado algn otro mecanismo de auditoria (aplicacin, desencadenadores, etc.) se lo debe incluir dentro del bloque BEGIN TRY / BEGIN TRANSACTION COMMIT TRANSACTION / END TRY.

Bloque BEGIN CATCH END CATCH Captura errores producidos dentro del bloque BEGIN TRY END TRY y confirma o deshace la transaccin de acuerdo al valor de la funcin XACT_STATE().

Plantilla Simple con devolucin de errores nicamente por RETURN.

CREATE PROCEDURE [dbo].[Objeto_Accion] -- Parmetros de entrada (obligatorios) <@param1> <datatype>, <@param2> <datatype>, ... -- Parmetros de entrada (opcionales) <@param11> <datatype> = <default value>, <@param12> <datatype> = <default value>, ...

AS

-- Bloque de declaracin de variables -- Bloque de declaracin de constantes BEGIN

-- Bloque de sentencias SELECT -- Asignacin de variables, validaciones, etc. SET XACT_ABORT ON BEGIN TRY BEGIN TRANSACTION -- Bloque de sentencias DML -- Bloque de auditoria COMMIT TRANSACTION -- Salida con ejecucin exitosa RETURN (1) END TRY

BEGIN CATCH -- Test XACT_STATE() IF (XACT_STATE()) = -1 ROLLBACK TRANSACTION IF (XACT_STATE()) = 1 COMMIT TRANSACTION -- Salida con error RETURN (0) END CATCH END GO

Ejemplo de ExecuteScalar:

' Usar el procedimiento almacenado sp_TotalFilasPrueba ' para saber el nmero de filas o registros de la tabla Prueba ' El comando SQL es: ' SELECT COUNT(*) FROM Prueba Dim cnn As SqlConnection = Nothing Dim cmd As SqlCommand = Nothing ' Try ' Usar la cadena de conexin almacenada en el fichero app.config ' En este caso es para acceder a un fichero .mdf ' en el que habr que cambiar el "path" ' por el correcto de nuestro equipo. ' Data Source=.\SQLEXPRESS;AttachDbFilename=...\pruebasGuille_SQL.mdf;Integrated Security=True cnn = New SqlConnection(My.Settings.cs_pruebasGuille) cmd = New SqlCommand("sp_TotalFilasPrueba", cnn) cmd.CommandType = CommandType.StoredProcedure

cnn.Open()

Dim n As Integer n = CInt(cmd.ExecuteScalar())

Me.LabelTotalFilas.Text = "Nmero de filas: " & n LabelStatus.Text = "Nmero de filas: " & n Catch ex As Exception Me.LabelTotalFilas.Text = "Error: " & ex.Message LabelStatus.Text = "ERROR" Finally If cnn IsNot Nothing AndAlso cnn.State <> ConnectionState.Closed Then cnn.Close() End If End Try

Ejemplo ExecuteNonQuery:

' Agregar N datos de prueba, ' usando el procedimiento almacenado sp_InsertarVariosDatosPrueba ' creado con Visual Basic. ' Este procedimiento almacenado a su vez usa: sp_TotalFilasPrueba Dim cnn As SqlConnection = Nothing Dim cmd As SqlCommand = Nothing ' LabelAgregar.Text = "Agregando datos..." LabelAgregar.Refresh() ' Try cnn = New SqlConnection(My.Settings.cs_pruebasGuille) cmd = New SqlCommand("sp_InsertarVariosDatosPrueba", cnn) cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.Add("@cuantos", SqlDbType.Int) cmd.Parameters.Add("@hastaMesActual", SqlDbType.Bit) cmd.Parameters("@cuantos").Value = CInt(Me.txtCuantos.Text) cmd.Parameters("@hastaMesActual").Value = Me.chkHastaEstemes.Checked

cnn.Open()

cmd.ExecuteNonQuery()

LabelAgregar.Text = "Aadir datos de ejemplo (indica el nmero):" LabelStatus.Text = "Datos aadidos correctamente" Catch ex As Exception Me.LabelAgregar.Text = "Error: " & ex.Message LabelStatus.Text = "ERROR" Finally If cnn IsNot Nothing AndAlso cnn.State <> ConnectionState.Closed Then cnn.Close() End If End Try

Vous aimerez peut-être aussi