lunes, 28 de septiembre de 2009

El poderoso OnClientClick

2 comentarios:
Te has topado con que quieres hacer un ultimo aviso de si quiere borrar o no? y esto te representa mucho codigo, pues te tengo la solucion en una linea a través del evento OnClientClick.

Ejemplo.

evento en el boton
< asp:button id="btnClick" runat="server" OnClientClick="return confirm('Quiere destruir el mundo?');" text="Button">< /asp:button >



codigo aspnet
protected override void OnPreRender(EventArgs e)
{

btnClick.Attributes.Add("onclick", "return confirm('Quiere destruir el mundo?');");

}

Pueden hacer en el evento load

void Page_Load(object sender, EventArgs e)
{

btnClick.Attributes.Add("onclick", "return confirm('Quiere destruir el mundo?');");

}
Ver

miércoles, 16 de septiembre de 2009

Personalizar el control de errores ASPNET

3 comentarios:

Cuando hacemos una aplicacion aspnet por lo regular olvidamos manejar los errores y por lo general aparece una pantalla muy parecida a la que tienen a su mano izquierda.

Lo ideal es que no aparesca esta pantalla, manejar el error y llevar un estricto control de los mismos.

Personalización de la página de error

Para personalizar la página de error por defecto, tiene que cambiar la configuración de la aplicación en el web config.

Hay tres modos de error en el que una aplicación ASP.Net que puede trabajar:

Off Mode
On Mode
RemoteOnly Mode

El atributo de modo de error determina si o no un mensaje de error se muestra ASP.Net. De forma predeterminada, el valor de modo está Comentariado sin embargo funciona con la opcion "On Mode" y muestra la pantalla antes mencionada.

Off Mode
Cuando el atributo de error está en "Off", ASP.Net utiliza su página de error por defecto para los usuarios locales y remotos en caso de un error.

On Mode
En el caso de "On Mode" , ASP.Net definidos por el usuario utiliza la página de error personalizados en lugar de su página de error por defecto para los usuarios locales y remotos. Si una página de error personalizada no se especifica, ASP.Net muestra la página de error que describe cómo habilitar la visualización remota de errores.

RemoteOnly
ASP.Net página de error se muestra sólo a los usuarios locales. Peticiones remotas comprueba en primer lugar los ajustes de configuración de la página de error personalizado o, finalmente, mostrar un error de IIS.


Ahora que ya conocemos como funciona la teoria pasemos a la parte practica.

1.) Dirijase al web config y cambie las entradas de customErrors de tal manera que funcionar customerrors. Ejemplo.

Web.Config File
< ?xml version="1.0" encoding="utf-8" ? >
< configuration >
< system.web >
< customErrors defaultRedirect="error.htm" mode="On"/>
< /system.web >
< /configuration >

Como se muestra en el archivo de configuración, el atributo "defaultRedirect" se ha establecido por la pagina error.htm. La página de error puede ser una página web ASP.Net, esta puede ser una página ASP o una página HTML simple.

Ejemplo de la pagina que mostrara el error:
Error.htm

< html xmlns="http://www.w3.org/1999/xhtml" >
< head >
< title >< /title >
< /head >
< body >
Sentimos mucho las molestias causadas, estamos trabajando para servirle mejor...
< br >
< /body >
< /html >

Notificar al Administrador
Ya hemos mostrado una pagina mas bonita de errores ahora nos toca llenar
un control de los errores, por esa razon escribiremos entradas al Event Log del sistema operativo.

Para lograr este objetivo agregue o edite su global.asax en el evento Application_Error.
pero primero agregue unos usign en la parte superior del archivo y luego busque el evento Application_Error y agregue necesario aqui un ejemplo.

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Diagnostics" % >
void Application_Error(object sender, EventArgs e)
{
string ErrorDescription = Server.GetLastError().ToString();
string EventLogName = "ErrorSample";
if ((!EventLog.SourceExists(EventLogName)))
{
EventLog.CreateEventSource(EventLogName, EventLogName);
}
EventLog Log = new EventLog();
Log.Source = EventLogName;
Log.WriteEntry(ErrorDescription, EventLogEntryType.Error);


}

En este mismo evento podria enviar un mail, ejemplo:

< %@ Import Namespace="System.Web" % >
< %@ Import Namespace="System.Web.SessionState" % >
< %@ Import Namespace="System.Web.Mail" % >


void Application_Error(object sender, EventArgs e)
{

MailMessage mail = new MailMessage();
string ErrorMessage = "The error description is as follows : " + Server.GetLastError().ToString;
mail.To = "administrator@domain.com";
mail.Subject = "Error in the Site";
mail.Priority = MailPriority.High;
mail.BodyFormat = MailFormat.Text;
mail.Body = ErrorMessage;
SmtpMail.Send(mail);

}

O puede unir ambos ejemplos, espero les sirva.
Ver

viernes, 11 de septiembre de 2009

Linq la evolución de ADO .net

2 comentarios:
Una de las grandes novedades de Visual Studio 2008 y de .NET Framework 3.5 es el Language Integrated Query (LINQ) que habilita la definición de consultas integradas en el lenguaje de programación y es una de las piedras angulares de las nuevas versiones de C# y VB. Precisamente. No es facil dejar atras nuestros Dataset y nuestros amigos DataAdapters pero es momento de continuar, un consejo para superar la perdida es que imaginen que adonet(dataset,dataadapter,connection) era su carro viejo que funciona y esta perferto sin embargo salio el nuevo de agencia y que esta mejor, corre mas rapido, es mas eficiente, mas bonito y no daña el ambiente.

asi que para ayudarlos a migrarse les doy unos ejemplos con connecion a bases de datos sql server.

Lo primero es la hacer la connecion para lograr esto agreguen un nuevo item en su proyecto y elijan linq.
ejemplo:



ahora ya agregado el dbml tiene que agregar las tablas del server explorer:


bueno ahora ha jugar:
hagamos queries:


Primero la consulta comun:

DataClassesDataContext db = new DataClassesDataContext();
var clientes = from c in db.Customers
select new {c.CustomerID, c.CompanyName, c.ContactName, c.Country,c.City };

como usar el resultado
usando Bind

GridView1.DataSource = clientes;
GridView1.DataBind();


o leerlo con un ciclo:

foreach (var customer in clientes )
{
Console.WriteLine("Customer {0}: {1}", customer.CustomerId, customer.CompanyName);
}


Like


para usar like tiene que hacer un using System.Data.Linq.SqlClient;

DataClassesDataContext db = new DataClassesDataContext();
var clientes = from c in db.Customers
where SqlMethods.Like(c.Country, "%" + TextBox1.Text + "%")
select new {c.CustomerID, c.CompanyName, c.ContactName, c.Country,c.City };


Concatenar dos campos

var query = from c in db.Customers
where c.customerid==txtcodito.text && c.country=="spain"
select new { c.Nombre, nombrecompleto = string.Format("{0} {1}", c.companyname,c.contactname) };

execute scalar ejemplo con function

string nombre=(from c in db.customers where p.customerid== txtusuario.text select c.companyname).Single();

string nombre=(from c in db.customers
 where p.customerid== txtusuario.text select c).Single().companyname;

Group by

var pais = from p in db.Customers
group p by new { p.Country } into r
select new { r.Key.Country };


var rows = from item in TablaEmpleado.AsEnumerable()
           group item by
                   new
                       {
                          empid = item["employeeid"].ToString(),
                          depto = item["DeptoId"].ToString()
                        }
           into g
              select new
                       {
                         EmpresaId = g.Key. empid,
                         depto = g.Key. depto,
                         total = g.Count())
                       };


 Sum en linq


System.Nullable totalFreight =
    (from ord in db.Orders
    select ord.Freight)
    .Sum();


System.Nullable totalUnitsOnOrder =
    (from prod in db.Products
    select (long)prod.UnitsOnOrder)
    .Sum();


in en linq

string[] countries = new string[] { "Guatemala", "USA", "Mexico" };
var customers =from c in context.Customers
where countries.Contains(c.Country)
select c;

comentario:
Eve para que mire que la tomo en cuenta.


Between
var query = from p in db.orders
where p.Fecha >= Convert.ToDateTime(TextBox1.Text) && p.Fecha <= Convert.ToDateTime(TextBox2.Text) select new { p.Fecha };

Distinct

var query = (from c in db.customers
       orderby c.country
select c.country).Distinct();


var query = (from c in db.customers
select c.country).Distinct().OrderByDescending(x=>x.country);


Join
var groupJoinQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID
orderby category.Name
select new
{
Category = category.Name,
Products = prod.Name
};




sub consulta


var groupJoinQuery2 =
from category in categories
join prod in products on category.ID equals prod.CategoryID into prodGroup
orderby category.Name
select new
{
Category = category.Name,
Products = from prod2 in prodGroup
orderby prod2.Name
select prod2
};


Left Outer Joins


var query = (from p in dc.GetTable()
join pa in dc.GetTable() on p.Id equals pa.PersonId into tempAddresses
from addresses in tempAddresses.DefaultIfEmpty()
select new { p.FirstName, p.LastName, addresses.State });

SQL:

SELECT [t0].[FirstName], [t0].[LastName], [t1].[State] AS [State]
FROM [dbo].[Person] AS [t0]
LEFT OUTER JOIN [dbo].[PersonAddress] AS [t1] ON [t0].[Id] = [t1].[PersonID]



mas ejemplos de join clic aquí

si son de las personas que usan Store Procedure
pues bien es mas facil =)

lo primero que tiene que hacer es bajar el sp de server explorar al contex del linq


codigo:
//Obtaining the data source

var dbNorthwind =new NorthwindDataContext() ;

// Create the query
var query = dbNorthwind.SalesByCategory("Beverages","1997");

// Execute the query
foreach (var c in query)
{
Console.WriteLine(c.ProductName + "," + c.TotalPurchase);
}

// si quiere el store procedure solo retorna un valor, esto lo usan para busquedas o totales.

var query = dbNorthwind.ObtenerCategoria(txtcodigo.text).Single();
return query.categoryname;

// otro ejemplo de llamar store procedure con linq
var contactNames =
from result in db.GetCustomersInCity("London")
select result.ContactName;


foreach (string contactName in contactNames)
{
Console.WriteLine(contactName) ;
}

Las transacciones tambien son soportadas en linq ejemplo:

using(TransactionScope ts = new TransactionScope())
{
db.ExecuteCommand("exec sp_DoSomethingCool");
db.SubmitChanges();
ts.Complete();
}

alternativa:

db.LocalTransaction = db.Connection.BeginTransaction();
{
db.SubmitChanges();
db.LocalTransaction.Commit();
db.AcceptChanges();
}
catch {
db.LocalTransaction.Abort();
throw;
}
finally {
db.LocalTransaction = null;
}


si quiere manejar la concurecnia en este punto, puede guiarse con el siguiente ejemplo:
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
db.SubmitChanges(ConflictMode.ContinueOnConflict);




si quieren usar LINQ con Listas
var custOrders =
from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID into orders
where c.CustomerID == "ALFKI"
select new {c.ContactName, orders};

var list = custOrders.ToList() ;

foreach (var listItem in list)
{
Console.WriteLine(listItem.ContactName + " has " + listItem.orders.Count() + " orders, which have been shipped to:") ;
foreach (Order order in listItem.orders)
{
Console.WriteLine(" Order shipped to - " + order.ShipCountry) ;
}
}



Listas genericas


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class MainClass {
public static void Main() {
List customers = GetCustomerList();
var waCustomers =
from c in customers
where c.Region == "R1"
select c;
foreach (var customer in waCustomers) {
Console.WriteLine("Customer {0}: {1}", customer.CustomerId, customer.CompanyName);
foreach (var order in customer.Orders) {
Console.WriteLine(" Order {0}: {1}", order.Id, order.OrderDate);
}
}
}
static List GetCustomerList() {
List empTree = new List();
empTree.Add(new Product { ProductName = "A", Category = "O", UnitPrice = 12, UnitsInStock = 5, Total = 36, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "B", Category = "O", UnitPrice = 2, UnitsInStock = 4, Total = 35, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "C", Category = "O", UnitPrice = 112, UnitsInStock = 3, Total = 34, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "D", Category = "O", UnitPrice = 112, UnitsInStock = 0, Total = 33, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "E", Category = "O", UnitPrice = 1112, UnitsInStock = 2, Total = 32, OrderDate = new DateTime(2005, 1, 1), Id = 1 });
empTree.Add(new Product { ProductName = "F", Category = "O", UnitPrice = 11112, UnitsInStock = 0, Total = 31, OrderDate = new DateTime(2005, 1, 1), Id = 1 });

List l = new List();
l.Add(new Customer { CompanyName = "A", Region = "R1", UnitsInStock = 1, Orders = empTree, CustomerId =0});
l.Add(new Customer { CompanyName = "B", Region = "R2", UnitsInStock = 2, Orders = empTree, CustomerId = 1 });
l.Add(new Customer { CompanyName = "C", Region = "R3", UnitsInStock = 3, Orders = empTree, CustomerId = 2 });
l.Add(new Customer { CompanyName = "D", Region = "R4", UnitsInStock = 4, Orders = empTree, CustomerId = 3 });
l.Add(new Customer { CompanyName = "E", Region = "R5", UnitsInStock = 5, Orders = empTree, CustomerId = 4 });
return l;
}
}

class Customer : IComparable {
public string CompanyName { get; set; }
public string Region { get; set; }
public List Orders { get; set; }
public int UnitsInStock { get; set; }
public int CustomerId { get; set; }

public override string ToString() {
return String.Format("Id: {0}, Name: {1}, Region: {3}", this.CustomerId, this.CompanyName, this.Region);
}
int IComparable.CompareTo(Customer other) {
if (other == null)
return 1;

if (this.CustomerId > other.CustomerId)
return 1;

if (this.CustomerId < other.CustomerId) return -1; return 0; } } class Product : IComparable {
public string ProductName { get; set; }
public string Category { get; set; }
public int UnitPrice { get; set; }
public int UnitsInStock { get; set; }
public int Total { get; set; }
public DateTime OrderDate { get; set; }
public int Id { get; set; }

public override string ToString() {
return String.Format("Id: {0}, Name: {1} , Category: {3}", this.Id, this.ProductName, this.Category);
}
int IComparable.CompareTo(Product other) {
if (other == null)
return 1;
if (this.Id > other.Id)
return 1;

if (this.Id < other.Id) return -1; return 0; } } http://www.java2s.com/Code/CSharp/LINQ/Useforeachlooptodealwiththeresultfromlinq.htm
Ver

viernes, 4 de septiembre de 2009

Pagina para probar Stored Procedures Con ASP.NET

1 comentario:
Si estás escribiendo aplicaciones de bases de datos SQL Server (Oracle o DB2), vas a gastar mucho tiempo de la construcción y pruebas de los procedimientos almacenados, en especial los procedimientos almacenados que retornan información a través de parámetros en lugar de conjuntos de filas. No importa lo mucho que pruebe ese tipo de procedimientos almacenados usando herramientas de base de tatos , siempre cuando se conecta desde su programa, no hace lo que usted desea.

También en el desarrollo de estos procedimientos almacenados utilizando las herramientas de bases de datos, es posible que se encuentre escribiendo un montón de código T-SQL para declarar los parámetros antes de la llamada y mostrar los resultados después. En lugar de escribir todo ese código, sería útil disponer de una utilidad que puede recopilar información acerca de un procedimiento almacenado, lo que le permite especificar los valores para cada parámetro y ejecutar el procedimiento almacenado sin tener que escribir ningún código.


En este artículo, usted aprenderá cómo extraer una lista de procedimientos almacenados de una base de datos, además de información acerca de los parámetros asociados con el procedimiento almacenado. Por último, verás cómo aprovechar esta información y utilizarla para llamar a un procedimiento almacenado.

precaución. Desde que el programa de la muestra permitirá a un usuario para ejecutar un procedimiento almacenado en ejecucion, puede ser un problema de seguridad grande. Por esta razón, el programa solicita al usuario información de base de datos de autenticación y no se basa en la información guardada en un archivo Web.config o incluida en el código. Sin embargo, debe extremar la precaución al usar este programa. En realidad no debería ser usado contra una base de datos de producción a menos que se puede garantizar que sólo los usuarios autorizados pueden ejecutarlo.

Obteniendo los procedimientos almacenados

Con el fin de ejecutar un procedimiento almacenado en la marcha, es necesario recoger una lista de procedimientos almacenados. Este programa utiliza el sistema de almacenado sp_stored_procedures procedimiento para recoger una lista de procedimientos almacenados que pueden ser ejecutadas por el usuario, utilizando la información de conexión especificado por el usuario. Luego se une a la lista a un control DropDownList para que el usuario puede elegir qué procedimiento almacenado para ejecutar (vea la Figura 1).



FIGURA 1: Después de recoger la información de conexión de los controles TextBox, al pulsar el botón Iniciar sesión que va a extraer el conjunto de procedimientos almacenados que el usuario puede ejecutar.

Al hacer clic en el botón Iniciar sesión y se genera el evento LoginButton_Click (vea la Figura 2). Esta rutina comienza por la construcción de un nuevo objeto SqlConnection utilizando la información de conexión proporcionada por el usuario en el formulario web. Entonces se crea un nuevo objeto SqlCommand con el objeto SqlConnection y sp_stored_procedures referencia al procedimiento almacenado. A continuación, un new SqlDataAdapter se crea con el objeto SqlCommand.

Sub LoginButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSetDim conn As New SqlConnection(_
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)

Dim cmd As New SqlCommand("sp_stored_procedures", conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
adpt.Fill(ds, "SPs")
SPs.DataSource = ds.Tables("SPs")
SPs.DataTextField = "PROCEDURE_NAME"
SPs.DataBind()
Catch ex as SqlException
Status.Text = ex.Message
End Try
End Sub

FIGURA 2: El evento LoginButton_Click se dispara cuando el usuario se conecta al servidor de base de datos para llenar un DropDownList con los nombres de los procedimientos almacenados, el usuario puede ejecutar.

En el cuerpo principal de la rutina, un intento comando se usa para atrapar cualquier error de base de datos. Cualquier mensaje de error se mostrará en el cuadro de texto de estado. Dentro de la Prueba declaración, el cuadro de texto es el primer Estado aclaró, y luego la SqlDataAdapter se utiliza para rellenar un objeto DataSet con los resultados de la sp_stored_procedures procedimiento almacenado. Por último, el objeto DataTable devuelto por el adaptador de datos está Unido(bound) a el control DropDownList( SP ).


Desplegando los parámetros
Una vez que la lista de procedimientos almacenados se recupera de la base de datos, el usuario puede seleccionar un nombre de procedimiento almacenado de la lista desplegable y haga clic en el botón Get parámetros para construir una cuadrícula de datos que contienen información sobre sus parámetros (vea la Figura 3).




FIGURA 3: Después de seleccionar un procedimiento almacenado de la lista desplegable, haga clic en el botón Get parámetros para recuperar información de formato y acerca de cada parámetro asociado con el procedimiento almacenado.

En lugar de utilizar las herramientas normales de edición DataGrid, este programa utiliza un modelo de columna para insertar un cuadro de texto para el valor de entrada de cada parámetro en la cuadrícula de datos (vea la Figura 4). El resto de las columnas también se definen explícitamente como BoundColumns para simplificar el proceso de enlace de datos.


< asp:DataGrid id="ParametersDataGrid" runat="server" AutoGenerateColumns="False" >
< Columns >
< asp:BoundColumn DataField="column_name" HeaderText="Name" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="type_name" HeaderText="Type" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="length" HeaderText="Length" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="precision" HeaderText="Precision" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="scale" HeaderText="Scale" >
< /asp:BoundColumn >
< asp:BoundColumn DataField="column_type" HeaderText="Column Type" >
< /asp:BoundColumn >
< asp:TemplateColumn HeaderText="Input Value" >
< ItemTemplate >
< asp:TextBox runat="server" >
< /asp:TextBox >
< /ItemTemplate >
< /asp:TemplateColumn >
< asp:BoundColumn HeaderText="Output Value" >
< /asp:BoundColumn >
< /Columns >
< /asp:DataGrid >
< /asp:DataGrid >

FIGURA 4: El control DataGrid especifica explícitamente cada una de las columnas que se muestran en la tabla de los parámetros del procedimiento almacenado.

Utilizando el código de base que se utilizó para recuperar la lista de procedimientos almacenados de la base de datos, el evento GetParametersButton_Click recupera la lista de los parámetros asociados con el procedimiento almacenado seleccionado de la base de datos usando el procedimiento almacenado sp_sproc_columns (vea la Figura 5). La principal diferencia en esta rutina es que Parameters.Add se utiliza para definir el parámetro @ procedure_name el objeto SqlCommand que contiene el procedimiento almacenado.

Sub GetParametersButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSet
Dim conn As New SqlConnection( _
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)
Dim cmd As New SqlCommand("sp_sproc_columns", conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@procedure_name", SqlDbType.NVarchar, 390).Value = _SPs.SelectedItem.Value
adpt.Fill(ds, "Parameters")
ParametersDataGrid.DataSource = ds.Tables("Parameters")
ParametersDataGrid.DataBind()
ResultsDataGrid.Visible = False
Catch ex as SqlException
Status.Text = ex.Message
End Try
End Sub

FIGURA 5: El evento carga GetParametersButton_Click la información sobre los parámetros de un procedimiento almacenado en la ParametersDataGrid.

Una vez que el método de adaptador de datos Fill ha poblado de un objeto DataSet, el objeto resultante tabla de datos está enlazado al control ParametersDataGrid, que muestra los parámetros para el usuario. Por último, el ResultsDataGrid está desactivada en la preparación para ejecutar el procedimiento almacenado seleccionado.

El sp_sproc_columns procedimiento almacenado contiene una gran cantidad de información, además de la información que aparece en pantalla. Por ejemplo, la columna NULLABLE indica si una columna puede contener valores NULL, la columna COLUMN_DEF contiene el valor predeterminado de la columna, y el ORDINAL_POSITION contiene la posición relativa de cada parámetro en el procedimiento almacenado.

Ejecutar el procedimiento almacenado
Al hacer clic en el botón Ejecutar consulta se ejecuta el código que aparece en la Figura 6. Después de definir un objeto de conexión utilizando la información del formulario Web, un objeto SqlCommand se crea una instancia con el objeto SqlConnection y el procedimiento almacenado seleccionado de la lista desplegable en el formulario web. Un objeto SqlDataAdapter también se crea, que se utiliza para recuperar todos los datos que el procedimiento almacenado puede devolver de la base de datos.

Sub ExecuteQueryButton_Click(sender As Object, e As EventArgs)
Dim ds As New DataSet
Dim conn As New SqlConnection( _
"Data source=" & DatabaseServer.Text & _
";User id=" & Userid.text & _
";Password=" & Password.Text & _
";Initial catalog=" & Database.Text)
Dim cmd As New SqlCommand(SPs.SelectedItem.Value, conn)
Dim adpt As New SqlDataAdapter(cmd)
Try
Status.Text = ""
cmd.CommandType = CommandType.StoredProcedure
AddParameters(cmd)
adpt.Fill(ds, "Results")
UpdateParameters(cmd)
ResultsDataGrid.DataSource = ds.Tables("Results")
ResultsDataGrid.DataBind()
ResultsDataGrid.Visible = True
Catch ex as SqlException
Status.Text = ex.Message
End Try

FIGURA 6: Al hacer clic en el botón Ejecutar consulta se ejecuta el procedimiento almacenado seleccionado desde el formulario web.

Utilizando el objeto de comando de reciente creación, el CommandType se establece en StoredProcedure y luego la rutina de AddParameters está llamado a crear la colección de SqlParameters para el objeto SqlCommand. El SqlDataAdapter ejecuta la consulta y almacena los datos devueltos en un objeto DataSet. Las copias subrutina UpdateParameters los valores de los parámetros del procedimiento almacenado en el formulario web. Luego objeto DataTable que contiene los datos devueltos se une a la ResultsDataGrid en el formulario web. Si no se devuelve ningún registro, el control DataGrid no se mostrará.

Agregando los parámetros
El verdadero truco para hacer que este programa de trabajo es la rutina AddParameters muestra en la Figura 7. Esta rutina se recorre la colección de filas en el DataGrid. Una instrucción Select Case examina la información de tipo de datos contenidos en la segunda columna de la cuadrícula de datos y elige la declaración apropiada para agregar el parámetro a la colección SqlParameters.

Sub AddParameters(cmd As SqlCommand)

Dim di As DataGridItem
For Each di in Parameters
DataGrid.Items
If CType(di.Controls(5), TableCell).Text <> "5" Then
Select Case CType(di.Controls(1), TableCell).Text.ToLower

case "int"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Int).Value = _
CInt(CType(di.Controls(6).Controls(1), TextBox).Text)

case "char"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Char, CInt(CType(di.Controls(2), TableCell).Text)).Value = CType(di.Controls(6).Controls(1), TextBox).Text

case "datetime"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.Datetime).Value = CDate(CType(di.Controls(6).Controls(1), TextBox).Text)


case "varchar"

cmd.Parameters.Add(CType(di.Controls(0), TableCell).Text, SqlDBType.VarChar, _
CInt(CType(di.Controls(2), TableCell).Text)).Value = _
CType(di.Controls(6).Controls(1), TextBox).Text

End Select
End If

If CType(di.Controls(5), TableCell).Text = "1" Then
cmd.Parameters(CType(di.Controls(0), TableCell).Text).Direction = _ParameterDirection.InputOutput

End If
Next di
End Sub

Agregar parámetros FIGURA 7: a la colección SqlParameters consiste en determinar el tipo de datos asociados.

Tenga en cuenta que el parámetro @ RETURN_VALUE se omite. Los valores que devuelve una COLUMN_TYPE de 5, que se almacena en la sexta columna del DataGrid.

Sólo dos tipos se muestran en la Figura 7 para mantener la lista corta, pero estos dos tipos de ilustrar el enfoque básico de agregar el parámetro. El nombre del parámetro se almacena siempre en la primera columna del DataGrid. La función CType arroja el valor devuelto por la colección de controles a un TableCell, y luego el valor real de la célula puede ser extraído de la propiedad Text. El valor del parámetro se puede convertir en el control TextBox al valor entero asociado con el parámetro.

El tipo de datos Varchar ilustra cómo la información adicional sobre el tipo de datos, tales como la longitud, se extrae de la información almacenada en el DataGrid. Otros tipos de datos se manejan de la misma manera.

Después de la instrucción Select Case agrega el parámetro a la colección, la sexta columna del DataGrid se revisa para ver si la propiedad de dirección se debe establecer en InputOutput para el parámetro. Un valor de 2 significa que el parámetro se puede devolver un valor desde el procedimiento almacenado, mientras que un valor de 1 significa que el parámetro es un parámetro de entrada y un valor de 5 indica que el parámetro contiene el valor de retorno para el procedimiento almacenado.

Actualización de Valores de los parámetros
La rutina UpdateParameters contiene un único caso de loop que explora a través de las filas de la cuadrícula de datos y actualiza el valor en la última columna de la cuadrícula de datos utilizando la información de los parámetros contemplados en la primera columna. Tenga en cuenta que desde el retorno no es un parámetro de valor real, su valor no se copia en el DataGrid.

Sub UpdateParameters(cmd As SqlCommand)

Dim di As DataGridItem

For each di in ParametersDataGrid.Items
If CType(di.Controls(5), TableCell).Text <> "5" Then
CType(di.Controls(7), TableCell).Text = cmd.Parameters(CType(di.Controls(0), TableCell).Text).Value.ToString

End If
Next di
End Sub

Después de introducir un valor CustomerID válido y haga clic en el botón Ejecutar consulta, los parámetros de actualización DataGrid se muestra en la Figura 8. Si el procedimiento almacenado devuelve un conjunto de filas, el ResultsDataGrid que contiene el conjunto de filas que aparecen debajo de los parámetros de DataGrid.

Ver

miércoles, 2 de septiembre de 2009

Limpiar Campo con Java Script

No hay comentarios.:
Scrip: Limpiart campo con un Script

Descripción: Este script borra un cuadro de texto cuando se hace clic sobre el.

Copia el siguiente código en su < HEAD > < / HEAD >.
< script language="Javascript" >
< !--
function doClear(theText) {
if (theText.value == theText.defaultValue) {
theText.value = ""
}
}
//-- >
< /script >

Copia el código siguiente entre las < BODY > < / BODY > de su página HTML

< form >
< input type="text" size=15 value="Enter name" onFocus="doClear(this)" >
< /form >

si quieren que se borre cuando empiezan a escribir usen: onkeypress="doClear(this)"

Como ya se que este les sirvio les dejo otro script clasico
como salir de un Frameset

solo ponga esto en medio de su < header >

< script language="javascript" >< !--
if (self.location.href != top.window.location.href)
{ top.window.location.href = self.location.href }
//-- >
< /script >

Si quieren Cerrar la ventana, por medio de un link.

< a href="javascript:self.close()" >
Cerrar ventana
< /a >

ejemplo de como funciona:

Cerrar ventana


sin embargo es posible que esto no funciona si tenes frameset alli tiene que agregar lo siguiente:
< script type="text/javascript" >
< !--
document.write('Cerrar Ventana');
document.links[document.links.length - 1].onclick = function() { top.close(); return false };
// -- >
< /scrip t>
Ver

martes, 1 de septiembre de 2009

Lamborghini Gallardo Superleggera VS Ducati 1098

No hay comentarios.:
La pregunta de siempre es que es mas rapido una moto o un carro, pues en este video compite un Lamborghini Gallardo Superleggera Versus una Moto Ducati 1098.

Ver

Trabajando con temas en ASP.NET

1 comentario:
Introducción
En este artículo describe cómo trabajar con la carpeta App_Themes. Carpeta App_Themes ha sido introducido desde ASP.NET 2.0 y es generalmente es de baja prioridad, a pesar de que juega un papel muy importante en el desarrollo web. Sin embargo, hay muchas paginas de interés relacionados con App_Themes que cada desarrollador debe saber. Estoy tratando de cubrir algunos de ellos. Por favor, siéntase libre de sugerir algo que no he cubrir en este artículo.

¿Cómo definir un tema?
Para definir un tema, debe hacer clic derecho del proyecto Web Project > Add ASP.NET Folder >Theme. Esto por defecto crear una nueva carpeta llamada App_Themes> Theme1. Puede cambiar el nombre de la carpeta Theme1 pero no la carpeta App_Themes. El nombre de la carpeta en la carpeta App_Themes será considerado como el nombre del tema y todos los archivos .css and .skin deben estar alli. Se Puede crear todos los temas que desee en la carpeta App_Themes.

Un tema puede tener más de un archivo .css y/o .skin

¿Qué es el archivo. Css?
Un archivo .CSS es Cascading Style Sheet que contiene el estilo, el comportamiento de una página html y sus elementos. Estos estilos están escritos en el archivo. Los Css son como un bloque de código y se les conoce como clase css. Esto en términos generales puede contener tres tipos de clases.

1.) Para un elemento en particular - esto define el estilo de cualquier elemento HTML y es nombrado como el nombre de la etiqueta HTML como p, tabla, tr, etc estilo siguiente se aplicará a todos tabla de la página.




table
{
border-collapse:collapse;
border:1px solid #c0c0c0;
}


2.) Para cualquier elemento HTML - define el estilo que pueden aplicarse en todos los elementos HTML.
Esto comienza con un (punto) . y seguido por el nombre de la clase CSS.




.ChangeBackground
{
background-color:#c9c9c9;
}


Atravez de la clase del CSS se puede especificar en cualquier elemento HTML.
Por ejemplo

En la etiqueta HTML:
< span class="ChangeBackground" > Mi texto < / span >
En ASP.NET Control:
< asp:Label ID="lblMessage" runat="server" CssClass="ChangeBackground" / >

3. para un determinado identificador - esto define el estilo de un elemento HTML cuyo ID es específico. Esto empieza con el # seguido por el nombre de la clase CSS.




#divMain
{
width:100%;
border:1px solid #cccccc;
}


La clase CSS se llevará a cabo con el elemento HTML cuyo ID es "divMain".
Este es un ejemplo


¿Qué es el archivo .skin?
Un archivo .skin es un nuevo tipo introducido en ASP.NET 2.0, este puede contener estilo Informacíon de cualquier control de servidor asp.net. Estas informaciones están escritas en este archivo como si están escritas página asp.net pero la propiedad ID no se especifica. por ejemplo,




< asp:Label runat="server" Font-Names="Courier" / >
< asp:Label SkinID="LabelMessage" runat="server" ForeColor="Green" BackColor="Yellow" / >
< asp:Label SkinID="LabelError" runat="server" ForeColor="Red" BackColor="Yellow" / >


Observe que en el código anterior no he speicified el ID del control.

Si usted ha utilizado el tema skin en su proyecto, la 1ra. línea define el estilo de todos los controles Label que se utilizarán en la página ASPX. La 2da. línea define el estilo de sólo los controles de etiqueta cuyo SkinID se especifica como LabelMessage. De esta manera usted tiene la libertad de colocar el número de controles de etiqueta en el archivo. Archivos de la skin con SkinID diferentes para los diferentes tipos de uso. (Como se puede definir un skin para el control Label para mostrar el mensaje de éxito y otro de la skin para mostrar el mensaje de error en la página.

Si desea que el comportamiento exacto del control Label es como se ha definido para SkinID "LabelMessage", debe utilizar el valor SkinID del control Label en el aspx como "LabelMessage".

El comportamiento del control Label en el aspx variará en función de si ha especificado el SkinID del control Label o no, o se ha espesificado en el CssClass o no.

No hay limitación de número de archivos Css y Skin que puede crear en un tema, pero se sugiere limitar el número para facilitar el mantenimiento y seguimiento.

Cómo utilizar el tema
Una vez que haya definido un tema para el proyecto asp.net, se puede utilizar de dos maneras diferentes.

1.Predeterminadamente en la página. Aspx
Se puede definir el nombre del tema que desee utilizar en las directivas de la página aspx (No se puede definir en la página principal). Como a continuación:





< %@ Page Theme="Theme1" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" % >



O en el WEB Config para todas las paginas.




< configuration>
< system.web >
< pages theme="ThemeName" / >
< /system.web >
< /configuration >




Documentación tecnica:
http://msdn.microsoft.com/en-us/library/0yy5hxdk.aspx

Tenga en cuenta que Theme1 es el nombre de la carpeta dentro de la carpeta App_Themes y se refiere como el nombre del tema.



2.) Una vez que haya utilizado el tema en su página aspx o web config , la página está lista para usar todas los skins definidos y todas las clases definidas en el CSS. Archivos CSS. También puede obtener IntelliSense en el IDE de Visual Studio como este.

IntelliSense para el archivo Skin.


IntelliSense para el archivo CSS.



Para mas documentación:
http://www.dotnetfunda.com/articles/article14.aspx
Ver