lunes, 10 de septiembre de 2007

ADO.NET 2.0 - Comandos (Command) y Lector de Datos (DataReader)

Los comandos son clases que nos peromiten establecer y ejecutar instrucciones sobre las bases de datos, el Framework 2.0 nos ofrece una interfaz llamada IDBCommand que es implementada por las clases SqlCommand, OleDbCommand, OdbcCommand y OracleCommand, ademas existe una clase base con la implementacion de dicha interfaz llamada DBCommand que sirve como clase base para ser heredada por los proveedores de datos los cuales los llamaremos XxxCommand.

Ejemplo de un command

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "SELECT ContactID, LastName, ";
cmdStr += "FirstName, ModifiedDate ";
cmdStr += "FROM Person.Contact";

SqlConnection cn = new SqlConnection();
cn.ConnectionString = conStr;
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = cmdStr;

Algunas de las caracteristicas de los comandos son:

Propiedades

CommandText: Indica la sentencia SQL o nombres de un objeto de la base de dato.
Conection: Indica la conexion asignada al comando.
CommandType: Indicar el tipo de comando a utilizar, este es una enumeracion que contiene los siguiente valores:

Text: Es la opcion por defecto. Es necesario que la propiedad CommandText contenga una sentencia SQL valida.
StoreProcedure: Permite utilizar el comando para ejecutar un procedimiento almacenado. La propiedad CommandText deberia tener asignado solamente el nombre del procedimiento.
TableDirect: Cuando necesitamos traer todas las filas y todas las columnas de una tabla o una vista, debemos usar este tipo de comando, asignado a la propiedad CommandText el nombre de la tabla o vista requerida.

Metodos

ExecuteReader: Permite construir un DataReader;

DataReaders

ADO.NET posee una clase que optimiza el acceso a los datos a través de diferentes clases llamados DataReaders, estos son utiles cuando se necesita obtener datos de la base de datos y estos no serán modificados, es decir, que los mismos van a ser de solo lectura.

Ejemplo de un DataReader

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "SELECT top 10 ContactID as Id, ";
cmdStr += "LastName + ', ' + FirstName as Nombre ";
cmdStr += "FROM Person.Contact";

string msgStr = "Las personas son: ";

SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
SqlDataReader dr;
cn.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
msgStr += "\n" + dr["Id"] + " - " + dr["Nombre"];
}
dr.Close();
cn.Close();
Console.Write(msgStr);

Algunas de las caracteristicas de los comandos son:

Propiedades

Count: Indica la cantidad de registros.
HasRows: Indica si posee registros o no.

Métodos

Read: Permite leer el siguiente registro (si existe).
NextResult: Permite leer el siguiente resultset (si existe)
GetOrdinal: Devuleve el numero de la columna.
GetSchemaTable:
Close: Permite cerrar el objeto.

CommandBehavior
CloseConnection: Al cerrar el DataReader tambien cerramos la conexion asociada al comando.
Default: Resulta lo mismoque no colocar ningun argumento en el metodo ExecuteReader. Esto nos permitirá traer resultados múltiples con varias filas y columnas.
KeyInfo: Nos devuelve informacion extra sobre las columnas y, lo mas importante, informacion sobre la clave primaria. Extremadamente util cuando consultamos los metadatos a través del metodo GetSchemaTable. Esta constante tambien nos trae los datos.
SchemaOnly: Solamente útil cuando usamos el método GetSchemaTable, ya que trae los metadatos pero ningún dato.
SequentialAccess: Se utiliza para optimizar la lectura de BLOBs (Binary large objects ó grandes objetos binarios) en la base de datos. El acceso secuencial significa que en vez de tener una sola fila en memoria a la vez, tenemos un dato simple por vez, lo que hace que debamos leer los datos de las distintas columnas en el orden exacto que es devuelto por la consulta. Para leer los objetos binarios utilizamos el método GetBytes.
SingleResult: Por defecto el DataReader esta preparado para recibir mas de un conjunto de resultados. Si sabemos que nuestra consulta devolverá solamente un conjunto de resultados, podemos optimizarla eligiendo esta constante, asi el DataReader no debe prepararse para el trabajo extra que insume otro conjunto de resultados.
SingleRow: El DataReader se prepara para recibir solo una fila. Incluso si la consulta devolviera mas de una fila el DataReader no podrá leerla, ya que la segunda vez que ejecutemos el metodo Read devolverá False de todas maneras.

Multiples Resultados

Es posible que un comando retorne mas de un resultado, es por ello que los DataReaders vienen preparados para trabajar en este escenario a través del metodo NextResult, el cual cumple la doble funcion de pasar al siguiente conjunto de resultados y avisar ademas si existe otro conjunto de resultados.

Ejemplo de el Next Result

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "SELECT top 5 ContactID as Id, ";
cmdStr += "LastName + ', ' + FirstName as Nombre ";
cmdStr += "FROM [Person].[Contact]; ";

cmdStr += "SELECT top 5 CountryRegionCode as Id, ";
cmdStr += "[Name] as Nombre ";
cmdStr += "FROM [Person].[CountryRegion]";

SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
SqlDataReader dr;
cn.Open();
dr = cmd.ExecuteReader();
string msgStr = "";
do
{
while (dr.Read())
{
msgStr += "\n" + dr["Id"] + " - " + dr["Nombre"];
}
msgStr += "\n";
}
while (dr.NextResult());
dr.Close();
cn.Close();
Console.Write(msgStr);

Obtener la estructura de una tabla

En aplicaciones que son realmente grandes, podemos escribir mecanismos genéricos para realizar las operaciones para insertar, modificar y eliminar registros. Es por ello que ADO.NET nos permite obtener los metadatos de cualquier tabla a través del metodo GetSchemaTable que no es mas que una tabla que nos ofrece la informacion de otra tabla.

Ejemplo del método GetSchemaTable

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "SELECT top 5 ContactID as Id, ";
cmdStr += "LastName + ', ' + FirstName as Nombre ";
cmdStr += "FROM [Person].[Contact]";

SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
SqlDataReader dr;
cn.Open();
dr = cmd.ExecuteReader();
string msgStr = "";
DataTable dt;
dt = dr.GetSchemaTable();
for (int i = 0; i <>
{
msgStr += dt.Columns[i].ColumnName + "\n";
}
dr.Close();
cn.Close();
Console.Write(msgStr);

Parametros (Parameters)

Es muy probable que se necesiten parametros tanto en las consultas Sql como los procedimientos almacenados, es por ello que ADO.NET nos ofrece el objeto Parameters, entre las caracteristicas de esta clase la mas importante es el ParameterDirection que es una enumeracion que nos permite definir la direccion del parametro, en el podemos seleccionar los siguientes valores:

Input: El parametro es solamente para establecer un valor de entrada al comando. Se debe asignar un valor a la propiedad Value antes de ejecutar el comando.

Output: El valor del parametro se recupera leyendo a la propiedad Value, pero esto debe hacerse posteriormente a la ejecucion del comando.

InputOutput: El parametro resulta bidireccional, es decir, se asigna un valor a la propiedad Value, se ejecuta el comando, y si luego leemos la propiedad Value podriamos obtener un valor diferente del originalmente asignado.

ReturnValue: Los procedimientos almacenados podrian devolver un resultado de la misma manera que lo hacen las funciones. La forma de leer ese resultado es a traves de un parametro con esta direccion. Al igual que los parametros de salida u Output, su valor se obtiene luego de la ejecucion del comando.

Ejemplo de un Parameter

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "dbo.uspGetManagerEmployees";
SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter pmId = new SqlParameter("@ManagerID", SqlDbType.Int);
pmId.Direction = ParameterDirection.Input;
pmId.Value = 3;
cmd.Parameters.Add(pmId);
SqlDataReader dr;
cn.Open();
dr = cmd.ExecuteReader();
string msgStr = "Resultado: ";
while (dr.Read())
{
msgStr += "\n" + dr["LastName"] + ", " + dr["FirstName"];
}
dr.Close();
cn.Close();
Console.Write(msgStr);

Valores Escalares

En algunos escenarios se necesita obtener valores simples que se encuentran almacenados en una base de datos, como una fecha, numero máximo o mínimo, una cuenta, el resultado de una funcion de la base de datos, etc. En ADO.NET tenemos un método llamado ExecuteScalar que nos devuelve solamente el valor de la primera columna en la primera fila, independientemente de la cantidad de filas y columnas que devuelva la consulta.

Ejemplo de ExecuteScalar

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr;
cmdStr = "select dbo.ufnGetStock(@Id)";

SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
SqlParameter pmId = new SqlParameter("@Id", SqlDbType.Int);
pmId.Direction = ParameterDirection.Input;
pmId.Value = 1;
cmd.Parameters.Add(pmId);
cn.Open();
string msgStr = "La existencia del producto es: ";
msgStr += cmd.ExecuteScalar();
cn.Close();
Console.Write(msgStr);

Otras Sentencias

En SQL no solo existen consultas que se limitan a leer o escribir datos, si no tambien existen consultas que permiten crear, modificar y eliminar objetos, asi como otogar, denegar o revocar permisos sobre los mismos, entre los tipos de sentencias tenemos las siguientes:

DDL (Data Definition Language ó Lenguaje de Defnicion de Datos): CREATE, ALTER y DROP.

DCL (Data Control Language ó Lenguaje de Control de Datos): GRANT, DENY y REVOKE.

DML (Data Manipulation Language ó Lenguaje de Manipulacion de Datos): SELECT, INSERT, UPDATE y DELETE.

Es por ello que ADO.NET nos ofrece un metodo llamado ExecuteNonQuery que no devuelve un conjunto de resultados, es decir, que es el que deberia ser utilizado para las sentencias DDL y DCL.

Este comando si bien no devuelve un conjunto de resultados, el comando nos informará, con un tipo de dato System.Int32, sobre la cantidad de registros afectados por nuestra consulta.

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

string cmdStr = "UPDATE Person.Address ";
cmdStr += "SET PostalCode = '98011' ";
cmdStr += "WHERE PostalCode = '98011'";

SqlConnection cn = new SqlConnection(conStr);
SqlCommand cmd = new SqlCommand(cmdStr, cn);
cmd.CommandText = cmdStr;

Int32 resultado;

cn.Open();
resultado = cmd.ExecuteNonQuery();
cn.Close();

Console.WriteLine("Se modificaron " + resultado.ToString() + " filas");


Transacciones (Transaction)

Las transacciones son una funcionalidad que poseen los manejadores de base de datos que implementen el estandar SQL como lo son SQL Server, Oracle, entre otros; estas manejan elementos de sintaxis tales como BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION y END TRANSACTION.

Las transacciones exiten debido a que nos ofrecen facilidad de uso y seguridad al momento de utilizar multiples sentencias SQL como si fueran una sola, es decir, que para que la transaccion tenga exito cada una de las sentencias deben tener exito para que la transaccion sea completada.

Ejemplo de Transaction

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";

SqlConnection cn = new SqlConnection(conStr);

string cmdStr = "UPDATE Person.Address ";
cmdStr += "SET PostalCode = '98011' ";
cmdStr += "WHERE PostalCode = '98011'";

string cmdStr2 = "UPDATE Person.Contact ";
cmdStr2 += "SET FirstName = 'Robert' ";
cmdStr2 += "WHERE FirstName = 'Robert'";

SqlCommand cmd = new SqlCommand(cmdStr, cn);
cmd.CommandText = cmdStr;

SqlCommand cmd2 = new SqlCommand(cmdStr2, cn);
cmd2.CommandText = cmdStr;

SqlTransaction tr;

cn.Open();
tr = cn.BeginTransaction();

try
{
cmd.Transaction = tr;
cmd.ExecuteNonQuery();
cmd2.Transaction = tr;
cmd2.ExecuteNonQuery();

tr.Commit();
}
catch (Exception ex)
{
tr.Rollback();
Console.WriteLine(ex.Message);
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
}

ADO.NET 2.0 - Conexiones (Connections)

Para poder hablar de las conexiones de ADO.NET debemos conocer algunas de las propiedades de las cadenas de conexion, entre las cuales podemos ver las siguientes:

Application Name: Nombre de la aplicacion que se esta conectando a la base de datos. A efectos de obtener informacion exacta sobre la actividad en el servidor, es conveniente hacer el uso de esta propiedad, que por defecto no se utiliza

Connection Timeout: Es el lapso de tiempo, medido en segundos, durante el cual una conexion esperará conseguir el vinculo con la base de datos. Superado este tiempo, se disparará una excepcion que indica que no pudo establecerce la conexion. Si no establecemos esta propiedad, se asumirá el valor por defecto de 15 segundos, esta propiedad tambien es llamada Connect Timeout.

Data Source: Como su nombre en ingles lo indica, es la fuente de datos. En el caso de SQL Server, es el nombre o la direccion IP del servidor al cual nos intentamos conectar, por lo cual tambien pueden utilizarse indistintamente las claves Server ó Address. En el caso de las bases de datos en archivos, tales como Access ó DBF entre otros, el valor será el camino para llegar a ellos a través del sistema de archivos (ejem. c:\directorio\basededatos.mdb), en ODBC esta propiedad se llama DBQ.

Initial Catalog: En el estandar ANSI SQL, se le llama catalogo a lo que normalmente entendemos como base de datos en SQL Server. Esta propiedad suele ser inexistente en algunos proveedores de datos, ya que la misma propiedad Data Source queda indicada la base de datos. Esta clave puede llamarse tambien Database.

Network Library: En el caso de SQL Server, se utiliza para indicar la biblioteca de red en uso, la cual depende del protocolo de red utilizado para la comunicacion. Se suele utilizar en entornos que contengan protocolos de red heredados de otras plataformas o en ambientes de alta seguridad que contengan zonas desmilitarizadas entre bases de datos y los servidores web a través de dobles firewalls.

Entre los protocolos de red que tenemos para usarlos cuando nos conectemos con SQL Server estan los siguientes:

dbnmpntw (Named Pipes)
dbmssocn (Winsock TCP/IP)
dbmsspxn (SPX/IPX)
dbmsvinn (Banyan Vines)
dbmsrpcn (Multi-Protocol (Windows RPC))

Integrated Security: Ciertos servidores de bases de datos, tales como SQL Server y Oracle, confian en el esquema de seguridad provista por el sistema operativo, siendo incluso la opcion recomendada siempre que sea posible, ya que no solo simplifica la administracion sino que tambien se incrementa la seguridad. Los valores posibles son true, false, no, yes ó sspi siendo el último altamente recomendado, aunque significa lo mismo que true. En ODBC, esta propiedad suele llamarse Trusted_connection.

User Id: En el caso de no utilizar seguridad integrada, deberá indicarse el nombre de usuario reconocido y mantenido por la base de datos.

Password: Igual que el caso anterior, La clave debe permanecer en forma de texto plano, por lo cual suele resultar poco seguro una cadena de conexion de este tipo. De todos modos, existen casos en donde puede prescindirse de este tipo de seguridad, con lo cual queda la opcion de encriptar la cadena de conexion por completo para obtener un esquema de seguridad óptimo.

Workstation ID: Es el nombre del equipo que está realizando la conexion. Suele ser útil a la hora de relevar la actividad en un servidor de base de datos SQL Server a traves del Profiler.

Provider: Utilizada en OLEDB para indicar el controlador o driver utilizado para realizar la conexion, como por ejemplo, Microsoft.Jet.OLEDB.4.0 para una base de datos Access.

DSN: ODBC permite establecer conexiones y dejarlas guardadas en un archivo o en el sistema operativo, siendo identificables a través de un nombre. Luego utilizaremos como valor de la propiedad DSN en nuestra aplicacion. Si utilizamos esta propiedad, no es necesario utilizar el resto, ya que todos los datos estan previamente definidos en dicho archivo.

Driver: Utilizado en ODBC. Resulta similar a la propiedad Provider de OLEDB, es decir, nos permite indicar a que tipo de fuente de datos nos vamos a conectar.

En el caso que deseemos acceder a un servidor Sql en la misma maquina que se esta desarrollando, podemos denominarlo de varias maneras: localhost, (local), 127.0.0.1 o . (simplemente un punto).

En el caso de Sql Express debemos colocar el nombre del equipo o cualquiera de las denominaciones anteriores y la instancia, ejem: equipo\instancia.

Algunas de las caracteristicas de una conexion en ADO.NET:

Metodos

Open: Permite abrir la conexion.
Close: Permite cerrar la conexion.
ChangeDatabase: Permite cambiar de base de datos.
ChangePassword: Permite cambiar la clave de usuario.
Dispose: Se encarga de liberar recursos en memoria utilizados por la conexion.

Propiedades

CurrentState: Indica el estado actual de la conexion.
OriginalState: Indica el estado original de la conexion.

Estas dos propiedades son de tipo ConnectionState que es una structura que posee los estados Closed, Open, Broken, Connecting, Executing y Fectching.

Eventos

StateChange: se dispara cuando se cambia el estado de la conexion.
InfoMessage: se dispara cuando cuando el servidor envia un mensaje.

Excepciones: Todas las excepciones en ADO.NET 2.0 heredan de la clase exception a cada una de las clases especificas de los proveedores de datos estos poseen una propiedad llamada Errors (a excepcion de Oracle) y esta es una coleccion de los errores devueltos por el manejador de base de datos. De tal manera que el diagrama quedaria de la siguiente manera:

XxxExeption hereda de Exception
XxxInfoMessageEventArgs hereda de InfoMessage
XxxError

Hay que tener en cuenta que cuando una conexion esta abierta ciertos metodos y propiedades pueden arrojar excepciones al tratar de cambiar sus valores, ejem: si se intenta cambiar la cadena de conexion despues que la conexion esta abierta se disparara la excepcion InvalidOperationException.

Ejemplo de una conexion y manejo de errores

string conStr;
conStr = "Data Source=localhost;";
conStr += "Initial Catalog=AdventureWorks;";
conStr += "Integrated Security=true";
SqlConnection cn = new SqlConnection(conStr);
string msgStr = "";
bool err = false;
try
{
cn.Open();
}
catch (SqlException sqlEx)
{
err = true;
foreach (SqlError sqlError in sqlEx.Errors)
{
msgStr += "Error nro " + sqlError.Number;
msgStr += " (" + sqlError.Class + "): ";
msgStr += sqlError.Message + "\n";
}
}
catch (InvalidOperationException invOpEx)
{
err = true;
msgStr += "Operacion no permitida: ";
msgStr += invOpEx.Message + "\n";
}
catch (Exception ex)
{
err = true;
msgStr += "Se produjo un error inesperado: ";
msgStr += ex.Message + "\n";
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
if (err)
Console.WriteLine(msgStr);
}


Connection Pooling (fondo comun de conexiones): Durante el ciclo de vida de una conexion esta pasa desde la instanciacion, utilizacion y destruccion. Cada uno de estos pasos consume valiosos recursos fisicos en el cliente, servidor y la red, y si nos vamos mas a detalle consume microprocesador, memoria, acceso a disco y ancho de banda en la red, ademas de ello una aplicacion puede mantener multiples conexiones contra un mismo servidor e incluso sobre la misma base de datos. Es por ello que los motores de las RDBMS (Relational Database Management System ó Sistema de Administracion de Bases de Datos Relacionales) poseen una caracteristica importante llamada Connection Pooling (fondo comun de conexiones).

Connection Lifetime: La conexion se retira del fondo cuando la diferencia entre la hora de creacion y la hora en que la conexion vuelve al fondo es mayor al establecido en esta propiedad, en segundos. Por defecto se encuentra en cero, lo cual le brinda mayor tiempo de vida posible en el fondo.

Enlist: Asume valores true o false, definiendo si la conexion vuelve al pool luego de ser utilizada si existe un contexto coincidente previamente definido. Por defecto se encuentra establecida como true.

Max Pool Size: Cantidad maxima de conexiones permitidas por el fondo. Por defecto posee valor cero (0).

Min Pool Size: Cantidad minima de conexiones permitidas por el fondo. Por defecto posee valor cien (100).

Pooling: Asume los valores true o false, es decir, habilita o deshabilita el fondo. Por defecto esta establecida como true.

En el caso de que el proveedor de datos nativo sea SQL Server ademas de las propiedades anteriores tendremos la propiedad Connection Reset: cada vez que utilizamos una conexion, SQL Server ejecuta en forma automatica un procedimiento almacenado que realiza ciertos controles para asegurarse que el contexto siga siendo el mismo, asi como tambien limpia la informacion en memoria que pueden crearse al utilizar las conexiones (tablas, variables, etc). Este control puede evitarse colocando esta propiedad en false, ya que esta verificacion consume recursos extra al tener que ejecutar dicho procedimiento, y en el caso de SQL Server 7.0, hace un viaje distinto hasta el servidor. Esta propiedad se encuentra en true por defecto, aunque podria eventualmente colocarse en false para poder liberar recursos, pero siempre y cuando estemos seguros que nuestra aplicacion no cambia el contexto de la conexion o que no utiliza tablas temporales u otros objetos en memoria. Es recomendable analizar con mucho detalle el uso de esta propiedad, ya que podriamos obetener resultados adversos en lugar de mejoras.

jueves, 6 de septiembre de 2007

Folder Share

FolderShare le permite crear una red privada de igual a igual que le ayudará a sincronizar archivos en varios dispositivos y acceder o compartir archivos con colegas y amigos. Ya no necesita enviar archivos grandes a través del correo electrónico, grabarlos en CD o DVD y enviarlos o cargarlos en un sitio Web. FolderShare le permite compartir y sincronizar la información importante de forma inmediata con cualquier persona que usted invite, convirtiéndolo en la solución perfecta tanto para uso personal como de empresa.

Mantenga sus archivos importantes al alcance de su mano en cualquier sitio. Todos los cambios realizados en los archivos se sincronizan automáticamente entre los equipos conectados, por lo que siempre accede a los últimos documentos, fotos, y archivos.

martes, 4 de septiembre de 2007

Sideshow

Es otro de los servicios que ofrece Microsoft con su plataforma Live en el que puedes chequear tu correo electrónico, ver tus fotos y acceder a otra información de tu computador desde los dispositivos compatibles con SideShow.


Move beyond your PC

Windows Live Writer

Writer es uno de los tantos servicios que está ofreciendo Microsoft con su plataforma Live, esta es una aplicación que ayuda a un usuario publicar fácilmente contenido con texto enriquecido en un blog.




Blogging with Windows Live Writer

lunes, 3 de septiembre de 2007

Tafiti

Microsoft lanza la beta de un navegador con estilo utilizando para el Silverlight, este nombre proviene de la palabra “investigar” en Swahili. Este navegador tiene una interfaz muy llamativa y enriquecida.

Visual Studio 2008 Beta 2

Microsoft liberó Visual Studio 2008 Beta 2 (incluyendo las versiones express), NET Framework 3.5 y Silverlight 1.0 RC. A diferencia del Beta 1, el Beta 2 incluye la licencia “go live“, el cual implica que puede ser usado en producción.

Se recomienda hacer la descarga usando MS Secure Content Download, una herramienta peer to peer para hacer descargas desde los servidores de Microsoft, ya que son imágenes de mas de 3 GB.

Visual Studio 2008 Standard Edition Beta 2
Visual Studio 2008 Professional Edition Beta 2
Visual Studio Team System 2008 - Team Suite Beta 2
Visual Studio Team System 2008 - Team Foundation Server Beta 2
Visual Studio Team System 2008 - Test Load Agent Beta 2
Visual Web Developer 2008 Express
Visual Basic 2008 Express
Visual C# 2008 Express
Visual C++ 2008 Express
MSDN Library for Visual Studio 2008 Beta 2
Microsoft .NET Framework 3.5 Beta 2
Silverlight 1.0 RC

Novedades del Visual Studio 2008
+ Soporte para todas las versiones del NET Framework (2.0, 3.0, 3.5)
+ Diseñador Web mejorado, soporte CSS y soporte Master Pages jerarquico
+ Intellisense y debugging para JavaScript
+ Mejoras en los lenguajes y LINQ (C#: Propiedades automáticas, inicializadores de objetos y colecciones, métodos de extensión, expresiones Lambda, métodos anónimos, Sintaxis para consultas)
+ Mejoras en el acceso a datos
+ Diseñador para WPF (Application Model, Data Binding, 3D, Documents/Annotations)
+ Desarrollo en Office incluyendo soporte para ribbon
+ WCF Syndication (Atom 1.0 and RSS 2.0)
+ Silver (WF y WCF)
+ Occasionally Connected Services (OCS)
+ Client Application Services
+ Microsoft AJAX Library
+ ASP.NET integardo con IIS 7.0
+ ASP.NET Merge Tool