lunes, 17 de septiembre de 2007

Recuperar ID de un registro que recién se insertó

Ejemplo para recuerar un id de una registro que recién se insertó en la BD. Normalmente se requiere ese id para insertar un segundo registro, muy usado en transacciones de SQL.


Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
Using connection As New SqlConnection(connectionString)
connection.Open()
Dim intRegionID As Integer
Dim command As SqlCommand = connection.CreateCommand()
Dim transaction As SqlTransaction

' Start a local transaction
transaction = connection.BeginTransaction("SampleTransaction")

' Must assign both transaction object and connection
' to Command object for a pending local transaction.
command.Connection = connection
command.Transaction = transaction

Try
command.CommandText = _
"Insert into Region (RegionName, RegionDescription) VALUES (100, 'Description');SELECT @@Identity"
'Get the Region ID in the intRegionID variable
'Very important to use ExecuteScalar in order to get the
'numeric value of the ID
intRegionID = command.ExecuteScalar()

'Now we can use that id to our next SQL statement
command.CommandText = _
"Insert into RegionGroup (RegionID, RegionName) VALUES (" & RegionID & ", 'Description')"

command.ExecuteNonQuery()

' Attempt to commit the transaction.
transaction.Commit()
Console.WriteLine("Both records are written to database.")

Catch ex As Exception
Console.WriteLine("Commit Exception Type: {0}", ex.GetType())
Console.WriteLine(" Message: {0}", ex.Message)

' Attempt to roll back the transaction.
Try
transaction.Rollback()

Catch ex2 As Exception
' This catch block will handle any errors that may have occurred
' on the server that would cause the rollback to fail, such as
' a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
Console.WriteLine(" Message: {0}", ex2.Message)
End Try
End Try
End Using
End Sub


Ejemplo de SqlTransaction

Aquí un ejemplo para realizar transacciones en SQL, muy util cuando se van a insertar más de 1 registro en una BD


Private Sub ExecuteSqlTransaction(ByVal connectionString As String)
Using connection As New SqlConnection(connectionString)
connection.Open()

Dim command As SqlCommand = connection.CreateCommand()
Dim transaction As SqlTransaction

' Start a local transaction
transaction = connection.BeginTransaction("SampleTransaction")

' Must assign both transaction object and connection
' to Command object for a pending local transaction.
command.Connection = connection
command.Transaction = transaction

Try
command.CommandText = _
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"
command.ExecuteNonQuery()
command.CommandText = _
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"

command.ExecuteNonQuery()

' Attempt to commit the transaction.
transaction.Commit()
Console.WriteLine("Both records are written to database.")

Catch ex As Exception
Console.WriteLine("Commit Exception Type: {0}", ex.GetType())
Console.WriteLine(" Message: {0}", ex.Message)

' Attempt to roll back the transaction.
Try
transaction.Rollback()

Catch ex2 As Exception
' This catch block will handle any errors that may have occurred
' on the server that would cause the rollback to fail, such as
' a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
Console.WriteLine(" Message: {0}", ex2.Message)
End Try
End Try
End Using
End Sub

viernes, 14 de septiembre de 2007

Creación de trigger

Un trigger ayuda a gestionar de una mejor forma la información que se encuentra en la BD. De este modo cuando la información sea modificada, podrán ejecutarse acciones diversas. Ejemplos de ello pueden ser:
1. Al eliminar un registro se eliminen otros cuantos de otras tablas
2. Al insertar un registro se lleve a cabo una validación
3. Al actualizar un registro, actualizar otras tablas
4. Al insertar un registro, insertar otros cuantos en otras tablas

Para crear un trigger sólo hace falta ejecutar una sentencia como la siguiente, colocando los textos en negritas con sus valores correspondientes. En este caso el trigger aplica justo después de haber insertado un nuevo registro en MiTabla2.


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [NombreDelTrigger]
ON [dbo].[MiTabla2]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

IF (SELECT COUNT(*) FROM MiTabla2, inserted WHERE (MiTabla2.IdUsuario = inserted.IdUsuario)) > 10
BEGIN
RAISERROR('No se pueden insertar mas de 10 registros para un usuario', 16, 1)
ROLLBACK TRANSACTION
END

END
GO

viernes, 7 de septiembre de 2007

ASCX dentro de DataGrid

Importante: Antes que todo deberás saber que esto no funciona con GridView, de modo que tendremos que recurrir al DataGrid que es más flexible.

Supongamos que tenemos en un archivo ASPX algo como lo siguiente:


<asp:DataGrid ID="dg1" AutoGenerateColumns="False" runat="server">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
   <asp:Label ID="lldld" Text='<%# DataBinder.Eval(Container.DataItem, "FechaNacimiento")%>' runat="server" /><br />
   <asp:Label ID="Label1" Text='<%# DataBinder.Eval(Container.DataItem, "Sexo")%>' runat="server" />
   <asp:Label ID="Label2" Text='<%# DataBinder.Eval(Container.DataItem, "Apellidos")%>' runat="server" />
   <asp:Label ID="Label3" Text='<%# DataBinder.Eval(Container.DataItem, "ClaveNivel")%>' runat="server" />
   <MisComponentes:Micontrol ID="control1" ValorAsignar='<%# DataBinder.Eval(Container.DataItem, "Nombres")%>' runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>


Tomar en cuenta que "control1" ya fue registrado en el aspx mediante la directiva @Register.

Ahora veamos cómo está conformado el ASCX.


<%@ Control Language="vb" AutoEventWireup="true" %>

<asp:Label ID="lblUsuario" runat="server" />

<script runat="server">

   Public Property ValorAsignar() As String
      Get
         Return lblUsuario.Text
      End Get
      Set(ByVal value As String)
         lblUsuario.Text = value
      End Set
      End Property

</script>


En este caso existe una propiedad llamada "ValorAsignar" que permite colocar y/o obtener el valor del label.

jueves, 6 de septiembre de 2007

Abrir un pop-up


<SCRIPT>
function fn_open_Window()
{
window.open('MiArchivo.html','Titulo de la pagina','width=850,height=650,top=100,left=150,resizable=yes');
}
</SCRIPT>

<a href="javascript:fn_open_Window()" >
<img src="MiImagen.gif" border=0>
</a>

lunes, 3 de septiembre de 2007

Utilización de un DropDownList en un GridView (modo editar)

En éste caso el siguiente código lo que hace al darle editar al GridView es que automaticamente muestra el drop cargado y seleccionado en un valor, por ejemplo:



<DropDownList runat="server" ID="DropEjemplo" selectedValue='<%# Bind("Estado")%>' DataSourceID="DSDDL" DataTextField="Estado" DataValueField="IDEstado" />
<asp:SqlDataSource ID="DSDDL"" runat="server" ConnectionString="<%$ ConnectionStrings:NombreBD %>"
SelectCommand="SELECT * FROM Estados order by Estado"/>


Notas:
DataSourceID="" se refiere al Id del DataSource declarado para el Drop.
DataTextField="" se refiere al texto que C/elemento mostrará en el Drop.
DataValueField="" se refiere al valor con el que el C/elemento será identificado en el Drop.
selectedValue='<%# Bind("Estado") %>', se refiere al valor que trae el Gridview.
Los valores especificados deben llamarse igual que como se traen en el Query.

Al dar clic en Update se tomara automaticamente el valor que en ese momento este seleccionado

Ñau