Académique Documents
Professionnel Documents
Culture Documents
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
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
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
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
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
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
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
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>
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
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
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
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
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
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.
-- 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()
COMMIT TRANSACTION
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)
SET <@ValorDevuelto> = SCOPE_IDENTITY() [SET <@MensajeDevuelto> = {'Detalle del Error' | @ERROR_MESSAGE | ...}] [SET <@paramOUT> = <@ValorDevuelto>] [SET <@paramOUTMSG> = <@MensajeDevuelto>] SELECT <@ValorDevuelto>[, <@MensajeDevuelto>]
Parmetros de salida
[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:
o o
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().
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 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()
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
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