viernes, 30 de marzo de 2012

ReDim en c#

Cuando estemos utilizando un arreglo y querramos cambiar su tamaño, en c# se realiza de la siguiente forma:

//Declaramos el arreglo
string[] usuariosSeleccionados = new string[1]

//En este caso tengo una CheckBoxList llamda "usuarios" y los que esten marcados los agrego a mi arreglo

            int jj = 0;

            for (int ii = 0; ii < usuarios.Items.Count; ii++)
            {
                if (usuarios.Items[ii].Selected)
                {
                    jj++;
                    if (jj > 1) Array.Resize(ref usuariosSelecionados, jj);
                    usuariosSeleccionados[jj - 1] = usuarios.Items[ii].Text;
                }
            }

Y eso es todo!!!

miércoles, 28 de marzo de 2012

Capturar pantalla en .Net

Se me acaba de presentar el requerimiento de capturar la pantalla desde mi código en .Net y quiero compartirles la forma en que logré capturar pantallazos o capturar el escritorio con .Net

Deben descargar esta clase para c# o bien esta otra para vb.  Y la manera de usarla es muy sencilla:

//Declaramos una instancia de nuestra clase
ScreenCapture sc = new ScreenCapture();

//Capturamos toda la pantalla y la asignamos a una variable de tipo Image
Image img = sc.CaptureScreen();

//Asignamos la variable de imagen a un PictureBox
this.Pantalla.Image = img;

//Ahora capturamos esta ventana y la grabamos en un archivo GIF
sc.CaptureWindowToFile(this.Handle,"C:\\temp1.gif",ImageFormat.Gif);

//También podemos capturar la pantalla completa y grabarla en un archivo GIF
sc.CaptureScreenToFile("C:\\temp2.gif",ImageFormat.Gif);

Y listo!!!

Espero que les pueda ser de gran utilidad para grabar la ventana o la pantalla con .Net

lunes, 26 de marzo de 2012

Cómo elegir el esquema de colores de tu sitio web

Encontrar la correcta combinación de colores para tu sitio web es uno de los aspectos más importantes del diseño web. Un sitio con un esquema de colores bien balanceado no sólo será agradable a los ojos, sino que también demostrará el conocimiento de quien está detrás de su diseño.

Como sabrás, para todo artista, diseñador gráfico, e incluso diseñador de interiores, los colores son algo que requiere de mucho entendimiento, y a la vez se tratan de un tópico muy subjetivo. La tendencia, dentro de lo usual, es utilizar colores que se suavicen entre sí y no que tengan un contraste muy marcado.

Hay dos sitios de mucha utilidad, que puedes visitar para seleccionar los colores para tu pagina web:

1) Color Palette Gallery

Aquí encontrarás una galería que muestra distintas combinaciones posibles, junto al nombre de los colores que las componen para que escojas los colores para tu sitio web.

Haz clic aquí para visitar Color Palette Gallery >>

2) Color Scheme Designer

Aquí puedes tú mismo crear tus propias combinaciones, tan sólo cambiando con facilidad unos pocos parámetros. De gran utilidad.


Con estas herramientas podrás elegir los colores para tu página web que sean los mas adecuados.

Activar xp_cmdshell en SQL server

xp_cmdshell permite ejecutar secuencias de comando en el shell de Windows, es muy útil para ejecutar archivos "EXE" a partir de una consulta SQL.

Lo que debemos ejecutar en el SQL SERVER MANAGEMENT STUDIO es lo siguiente:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
go
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
go

Y luego para ejecutar un EXE desde la consulta SQL escribimos lo siguiente para ejecutar EXE usando xp cmd shell:

EXEC xp_cmdshell 'C:\Windows\calc.exe' --Ejecutar EXE desde SQL SERVER

viernes, 23 de marzo de 2012

Ejemplos de Linq en C#

He aquí un sitio excelente con muchos ejemplos de Linq en C#:

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

Ahora, para quienes usan un antiguo lenguaje, e este como se llamaba?? aaa ya Visual Basic, pueden ver este link:

http://msdn.microsoft.com/en-us/vstudio/bb688088

miércoles, 21 de marzo de 2012

Estructura de tablas mediante un query SQL SERVER

En mi base de datos tengo una enorme cantidad de tablas y esquemas por lo que me tomaba mucho tiempo encontrar una tabla en el Object Explorer del SQL SERVER MANAGEMENT STUDIO, por lo que construí el siguiente query para encontrarlas por medio del nombre:


SELECT (d.name + '.' + a.name) AS Tabla, b.name AS Campo, c.name AS [Tipo de Dato], b.max_length AS Longitud, (CASE b.is_nullable WHEN 0 THEN 'Not Null' ELSE 'Null' END) AS [Null?], (CASE b.is_identity WHEN 0 THEN 'No' ELSE 'Sí' END) AS [Identity?], a.object_id AS Id
FROM sys.all_objects a JOIN sys.all_columns b ON a.object_id = b.object_id JOIN sys.types c ON b.user_type_id = c.user_type_id JOIN sys.schemas d ON a.schema_id = d.schema_id
WHERE
--a.object_id = 1837249600
a.name LIKE '%PRECIO%'
ORDER BY d.name, a.name, b.column_id

Deben cambiar la palabra PRECIO por el nombre de la tabla que quieran encontrar.

Si quieren encontrar el ID de la tabla que están buscando, deben escribir lo siguiente:


SELECT b.name AS Esquema, a.name AS Tabla, (b.name + '.' + a.name) AS Nombre, a.object_id AS Id
FROM sys.all_objects a JOIN sys.schemas b ON a.schema_id = b.schema_id
WHERE a.type = 'U'
AND a.name LIKE '%PRECIO%'
ORDER BY b.name, a.name

Y nuevamente reemplazando la palabra PRECIO por la que les interesa y luego este ID lo podrían utilizar en el query de arriba en la línea que está comentareada.

De esta manera pueden desplegar la estructura de una tabla de SQL SERVER con un query a la base de datos.

Aceptar nulos en Linq

En mi caso estoy instanciando como arreglo una clase para usarla con Linq To Sql, pero tengo columnas que vienen nulos, entonces lo que hice fue lo siguiente al declarar mi clase:


[Serializable]
public class Info
{
    public string Tipo { get; set; }
    public string Articulo { get; set; }
    public string NombreArticulo { get; set; }
    public string UsuarioCancela { get; set; }
    public Nullable<DateTime> FechaCancela { get; set; }
    public string MotivoCancela { get; set; }
}

Donde "FechaCancela" puede venir null de la base de datos.  

Probablemente hayan muchas otras formas de hacerlo, pero esta es una de ellas para Null en Linq.

Row not found or changed (Error en Linq)

Uno de los exceptions que por lo general aparecen cuando estas trabajando con Linq to Sql, es el ChangeConflictException.

El mensaje tradicional correspondiente a este exception es: Row not found or changed.

Cuando recien estas construyendo el software. Muy probablemente te encuentres con este mensaje. Si no te calmas en encontrar la solucion, te podria sacar de tus casillas.

Lo que sucede es que generalmente la base de datos esta aun ajustandose, cambiando si un campo de la tabla permitira nulo o NO, por ejemplo. Si un tipo de dato BIT sera cambiado a un CHAR(1), por decir algo.

Y otras simpleces a nivel de base de datos.

Pero aquellos cambios, por la premura del tiempo o por alguna circunstancia, NO son plasmados tambien en el modelo que propone Linq To Sql, dentro de tu aplicativo.

Y he alli el origen del problema.

Cuando estas desarrollando software y te apoyas en Linq To Sql para facilitarte la construccion de los Business Entities, debes estar pendiente que la estructura de tablas de tu Base de Datos sincronize con las caracteristicas de los Business Entities asociada a cada tabla.

Al realizar una operacion de actualizacion o eliminacion contra la Base de Datos de un elemento en particular, Linq To Sql no construye la sentencia SQL en funcion a un WHERE mykeyfield = @mykeyfield

Linq To Sql realiza un WHERE en funcion al estado actual del registro previo al cambio.

Y si alguna caracteristica de tu Base de Datos NO esta sincronizada con el modelo de Linq To Sql, pues veras este mensajito constamente: Row not found or changed.

Por citar una ejemplo, que un campo en la base de datos haya sido cambio para NO permitir nulo, cuando antes si lo permitia. Pero sin embargo dicho cambio NO se realizo de la misma manera en el modelo de Linq To Sql, se entiende que para Linq To Sql aquel campo aun permite nulo.

Entonces al construir su WHERE, Linq To Sql, constuira una lista de campos para hacer el match del estado anterior del registro y con un myfieldchange IS NULL dentro de todos ellos. 

En lugar de algo distinto al nosotros saber, que a nivel de Base de Datos, esto ya NO esta permitido.

En consecuencia, Linq To Sql NO puede encontrar el registro anterior, debido a que efectivamente este ya NO existe, bajo esas circunstancias.

La solución pasa por simplemente sincronizar la estructura de tu Base de Datos a nivel de campos con tu modelo de Linq To Sql.

No pude encontrar ninguna forma específica para sincronizar con el contexto de Linq To Sql.  Lo que tuve que hacer es eliminar las tablas del contexto y agregarlas de nuevo y con eso se solucionó el problema.

Execute Scalar en Linq

El equivalente de ExecuteScalar en Linq es el siguiente:

string estatus = (from c in db.Productos
                                   where c.Producto == "Producto" && c.Bodega = "Bodega"
                                   select c).Single().Estatus.ToString();

Como hacer un InputBox en asp.net

Si es posible hacer un InputBox en asp.net para que el usuario nos ingrese algunas observaciones.  Lo hacemos de la siguiente forma utilizando JavaScript:


    <script type="text/javascript">
        function InputBox() {
            var strInput = prompt("Debe ingresar las observaciones", "");
            var tBox = document.getElementById('<%=Observaciones.ClientID%>');
            tBox.value = strInput;  
    </script>

En este ejemplo estoy asignando el las observaciones ingresadas por el usuario a un TextBox de asp.net.  En este artículo explico como Acceder a controles de asp.net desde JavaScript.

Acceder a controles de asp.net desde javascript

Asignar valor a un textbox desde javascript

En algunas oportunidades uno requiera hacer uso de archivos .js para llevar allí el código javascript y trabajarlo de forma separada al html que esta en el aspx, pero es aquí donde empiezan los problemas.

Resulta que si se hace uso del tag <% %>, este solo puede ser aplicado dentro de la página donde se hace el render por parte de asp.net, o sea solo funciona dentro del aspx

El archivo .js es referenciado por el aspx, pero este no se incluye en el proceso de render, por lo tanto el ClientID nunca será reemplazado.

Pero hay una solución a este punto, la cual consiste en dejar la definición del tag <% %> dentro del aspx, pero que la misma solo asigne a una variable javascript el nombre del control, luego sera usada en el .js para así poder tomar el control y trabajarlo.

<script type="text/javascript">
    var TextBox1 = '<%=TextBox1.ClientID%>';
</script>

en donde se asigna en la pagina aspx el nombre como string, para luego dentro del .js usar

function ObtenerValor() {
    var text1 = document.getElementById(TextBox1);
    alert(text1.value);
}

Es necesario apreciar como cambio la selección al usar el getElementById(), usando ahora el nombre de la variable.

El único problema que se presenta es que por cada control que se quiera usar dentro de .js será necesario crear una variable en la pagina que incluya el ID que asp.net asigna.

Obtener y asignar el valor de un TextBox


Seguramente se preguntaran “cuando comenzamos”, es cierto hasta aquí se presentaron temas mas relacionados con javascript, que al propio jquery, pero eran necesario tenerlos presente ya que estos también afectan al desarrollo.

Bien, comencemos con algo simple.

Seleccionemos el valor de un TextBox, copiando el contenido a otro:

[HTML]

<form id="form1" runat="server">
    <table>
        <tr>
            <td>
                <input id="txtInfo" type="text" />
            </td>
            <td> 
                <input id="btnMostrar" type="button" value="button" onclick="Mostrar_OnClick();"/>
            </td>
        </tr>
        <tr>
            <td colspan="2"> 
                <input id="txtInfoCopia" type="text" />
            </td>
        </tr>
    </table>
</form>

[JavaScript] 

function Mostrar_OnClick() {
    var info = $('#txtInfo').val();
    $('#txtInfoCopia').val(info);
}

como se observa jquery lo hizo bien simple.

Es preciso conocer que cuando uno selecciona un control y lo hace por el atributo “id” debe anteponer el “#”, este es uno de los tanto selectores tiene jquery que iremos viendo.

Para que esto funcione es necesario contar con la librería, en este caso se encuentra en la línea

<script src="../script/jquery-1.5.2.min.js" type="text/javascript"></script>

por lo general se sitúa en la propia pagina, pero también es común verlo en la Master Page para que todas incluyan la librería, y no se tenga que declarar en cada una particularmente.

Y que sucede si se tratan de controles de asp.net, bien es igual de simple, pero conociendo lo que vimos en el punto: “1 – Acceder a los controles de asp.net”, se obtendría la misma funcionalidad usando:

[JavaScript]

function MostrarASPNET_OnClick() {
    var info = $('#<%=txtInfoASPNET.ClientID%>').val();
    $('#<%=txtInfoCopiaASPNET.ClientID%>').val(info);
}

Avancemos un poco inicializando los textbox, para hacerlo individualmente se podría aplicar algo como esto:

[JavaScript]

function LimpiarASPNET_OnClick() {
    $('#<%=txtInfoASPNET.ClientID%>').val('');
    $('#<%=txtInfoCopiaASPNET.ClientID%>').val('');
}

es idéntico a lo que ya se viene viendo solo que no se le pasa valor

Y si se quiere limpiar el contenido de todos los textbox, se deberá asignar uno a uno?, no es necesario, hay técnicas mucho mas simples:

[JavaScript]

function LimpiarTodos_OnClick() {
    $(':text').val('');
}

aquí se puede ver otro selector distinto proporcionado por jQuery, en este caso se trata de un selector por tipo text el cual aplicara el valor a todos los controles que encuentre del tipo textbox.

Ahora bien, lo lindo que tiene esta librería es que no hay una sola forma de hacer esto, si se revisa la documentación: :text Selector, menciona que usar $('[type=text]') o $('*:text') y también $('input:text') son equivalentes, pero por simplicidad en la escritura se aplica :text

Nota: los ejemplos de esta sección se encuentra en el “Ejemplo 3” del código publicado.

Trabajando con Labels

Asignar un valor a un label difiere un poco de como se haría a un TextBox.

Se agrega un label html

<label id="lblInfoCopia" />

y uno de asp.net

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

accederlo de forma individual no representa mayor problema, salvo por el hecho de cambiar el val() por el html() para tomar o asignar un valor.

Pero el seleccionar todos los labels de la pagina no es tan directo, ya que se renderiza diferentes en html estos controles, si se analiza el código generado en el browser se notara que el label de html sigue siendo un label, pero el de asp.net no lo es, ya que es transformado a un tag <span> cuando se convierte

Es por esto que debe seleccionarse distinto cada control.

[JavaScript]

function Mostrar_OnClick() {
    var info = $('#txtInfo').val();
    $('#lblInfoCopia').html(info);
}

function MostrarASPNET_OnClick() {
    var info = $('#<%=txtInfoASPNET.ClientID%>').val();
    $('#<%=lblInfoCopiaASPNET.ClientID%>').html(info);
}

function LimpiarASPNET_OnClick() {
    $('#<%=txtInfoASPNET.ClientID%>').val('');
    $('#<%=lblInfoCopiaASPNET.ClientID%>').html('');
}

function LimpiarTodos_OnClick() {
    $(':text').val('');
    $('label').html('');
    $('span').html('');
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js" language="javascript" type="text/javascript"></script>

viernes, 16 de marzo de 2012

Los Chismes en el trabajo

De: PRESIDENTE
Para:
 GERENTE GENERAL

El lunes próximo, a eso de las siete de la noche el cometa Halley se hará visible. Es un acontecimiento que ocurre cada 78 años.  Reúna a todo el personal en el patio de la fábrica, todos usando casco de seguridad, que allí les explicaremos el fenómeno.  Si llueve, este raro espectáculo no podrá ser visto a ojo desnudo, en ese caso entraremos al comedor donde será exhibido un documental sobre ese mismo tema 


De:
 GERENTE GENERAL
Para:
 JEFE DE PRODUCCIÓN

Por orden del presidente, el lunes a las siete aparecerá sobre la fábrica el cometa Halley.  Si llueve reúna a los empleados con cascos de seguridad y llévelos al comedor, donde tendrá lugar un raro espectáculo, que sucede cada 78 años a ojo desnudo. 


De:
 JEFE DE PRODUCCIÓN
Para:
 SUPERVISOR

A pedido de nuestro gerente general, el científico Halley de 78 años, aparecerá desnudo en el comedor de la fábrica usando casco, porque va a ser presentado un documental sobre el problema de la seguridad en días de lluvia. 
 

De:
 SUPERVISOR
Para:
 ASISTENTE

Todo el mundo desnudo sin excepción, deberá estar en el patio el lunes a las siete, donde el famoso músico Halley mostrará el vídeo bailando bajo la lluvia. El show se presenta cada 78 años. 


De:
 ASISTENTE
Para:
 PERSONAL DE PLANTA 

El jefe cumple 78 años el lunes y habrá una fiesta de poca madre en el patio y en el comedor se presentará el famoso conjunto Bill Halley y sus cometas. Todo el que quiera puede ir en pelotas pero usando casco, porque se va a armar un pinche desmadre aunque llueva.

jajajaja  Bueno no?????

jueves, 15 de marzo de 2012

Llamar Stored Procedure que devuelve Multiples Resultados desde Linq

En esta oportunidad me hice un StoredProcedure que me devuelve múltiples resultados y no me funcionaba la llamada a este desde Linq.  Me daba el siguiente error al agregar el SP al dbml:

Error: Unknown Return Type, The return types for the following stored procedures could not be detected

Si tienen un problema similar, esto se debe a que el SP devuelve múltiples resultados y se resuelve modificando manualmente el designer del dbml.  La forma predeterminada es la siguiente:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.TuSP")]
public object spDevuelveInfo()
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((int)(result.ReturnValue));
}

Y es de esta forma en que se debe dejar:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.TuSP")] 
[ResultType(typeof(Info))] 
public IMultipleResults spDevuelveInfo() 
{  
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod()));
return (IMultipleResults)(result.ReturnValue); 
}

"Info" en este caso es una clase serializable que deben tener:

[Serializable]
public class Info
{
    public string Dato1 { get; set; }
    public string Dato2 { get; set; }
    public string Dato3 { get; set; }
}

De nuevo salu2.

viernes, 9 de marzo de 2012

Obtener usuarios de Active Directory usando c#

A continuación les comparto la forma en que podemos obtener los usuarios activos en el Active Directory, debemos agregar las referencias:


using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

Y luego el código es el siguiente:

                DirectoryContext dc = new DirectoryContext(DirectoryContextType.Domain, Environment.UserDomainName);
                Domain domain = Domain.GetDomain(dc);
                DirectoryEntry de = domain.GetDirectoryEntry();

                LlenarUsuarios(de);

Este es el método para llenar los usuarios:

        private void LlenarUsuarios(DirectoryEntry de)
        {
            DirectorySearcher deSearch = new DirectorySearcher(de);

            deSearch.Filter = "(&(objectClass=user)(objectCategory=person))";
            SearchResultCollection results = deSearch.FindAll();

            foreach (SearchResult srUser in results)
            {
                DirectoryEntry deUser = srUser.GetDirectoryEntry();

                int flag = (int)deUser.Properties["userAccountControl"].Value;

                bool mActivo = false;
                if (!Convert.ToBoolean(flag & 0x0002)) mActivo = true;

                if (deUser.Properties["sAMAccountName"].Value.ToString().Contains(".") && mActivo) CheckBoxList1.Items.Add(deUser.Properties["sAMAccountName"].Value.ToString());
            }


De nuevo espero haberles sido de utilidad.

jueves, 8 de marzo de 2012

Restaurar una Base de Datos desde T-SQL y eliminar conexiones

En lo personal pienso que todo lo debemos hacer con código para tener un control total de lo que esta pasando.  En esta oportunidad quiero compartir con ustedes lo que debemos ejecutar en T-SQL para restaurar una base de datos desde código y relacionar los logins si es que existen con la base.

Primero debemos eliminar los procesos que estén conectados a la base de datos:


USE Master
GO
--Eliminar todos los procesos pendientes
DECLARE @spid INT,
@dbName VARCHAR(50),
@cmd VARCHAR(50)

DECLARE #Cursor CURSOR LOCAL FOR
SELECT spid ,dbname = CASE WHEN dbid = 0 THEN null WHEN dbid <> 0 THEN db_name(dbid) END
 FROM master.dbo.sysprocesses
  WHERE spid >= 0
AND spid <= 32767
AND LOWER(db_name(dbid)) = 'TuDB'

OPEN #Cursor
FETCH NEXT FROM #Cursor INTO @spid,@dbName

WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'KILL ' + CONVERT(varchar(5),@spid) + ';'
EXECUTE (@cmd)
FETCH NEXT FROM #Cursor INTO @spid,@dbName
END
CLOSE #Cursor
DEALLOCATE #Cursor
GO

Ahora restauramos la base de datos:

--Restaurar la base de datos
RESTORE DATABASE TuDB
 FROM DISK = 'C:\TuBackUP'
  WITH REPLACE
GO

USE TuDB
GO

Si así lo requieren, podemos relacionar los Logins de SQL con los usuarios en la base de datos:

--Relacionar login con user
DECLARE @name AS NVarchar(100)
DECLARE #Cursor CURSOR LOCAL FOR
 SELECT name
  FROM sysUsers
   WHERE hasdbAccess = 1
AND isLogin = 1
AND issqlUser = 1
AND name NOT IN ('dbo','guest')
AND name IN (SELECT name COLLATE database_default FROM master..syslogins)

OPEN #Cursor
FETCH NEXT FROM #Cursor INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC TuDB.dbo.sp_change_users_login 'UPDATE_ONE',@name,@name
FETCH NEXT FROM #Cursor INTO @name
END
CLOSE #Cursor
DEALLOCATE #Cursor


Salu2.

Truncal Log y modificar el tamaño de una base de datos de SQL SERVER

Para truncar el LOG de una base de datos debemos ejecutar la siguiente instrucción en SQL SERVER MANAGEMENT STUDIO:


ALTER DATABASE TuDB
SET RECOVERY SIMPLE;
GO
-- Reducir el LOG a 1 MB.
DBCC SHRINKFILE (TuDB_Log, 1);
GO
ALTER DATABASE TuDB
SET RECOVERY FULL;
GO


Para modificar el tamaño de nuestra base de datos, debemos ejecutar la siguiente instrucción:


USE master;
GO

--En este ejemplo estoy aumentando el tamaño de la Base de Datos a 4GB
ALTER DATABASE TuDB
MODIFY FILE
    (NAME = TuDB,
    SIZE = 4096MB);
GO

miércoles, 7 de marzo de 2012

Como determinar las versiones de SQL SERVER que tenemos instaladas

Cómo determinar la versión de SQL Server 2008 que se ejecuta

Para saber la version SQL Server 2008, debemos conectarnos a SQL Server 2008 con SQL Server Management Studio y, a continuación, ejecute la siguiente instrucción de Transact-SQL:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Se devuelve el siguiente resultado para encontrar la version de SQL Server 2008

·         La versión del producto (por ejemplo, 10.0.1600.22).
·         El nivel del producto (por ejemplo, RTM).
·         La edición (por ejemplo, Enterprise).

Por ejemplo, el resultado puede presentar un aspecto similar al siguiente:

10.0.1600.22         RTM           Enterprise Edition

En la tabla siguiente se muestra el número de versión de Sqlservr.exe.

Versión                                             Sqlservr.exe
RTM                                                2007.100.1600.0
SQL Server 2008 Service Pack 1     2007.100.2531.0

Cómo determinar la versión de SQL Server 2005 que se ejecuta

Para saber qué versión de Microsoft SQL Server 2005 se ejecuta, conéctese a SQL Server 2005 con el Analizador de consultas y ejecute la instrucción de Transact-SQL siguiente: 

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Se devuelve el siguiente resultado para encontrar la version de SQL Server 2005:

·         La versión del producto (por ejemplo, 9.00.1399.06).
·         El nivel del producto (por ejemplo, RTM).
·         La edición (por ejemplo, Enterprise Edition).

Por ejemplo, el resultado puede presentar un aspecto similar al siguiente:

9.00.1399.06         RTM           Enterprise Edition

En la tabla siguiente se muestra el número de versión de Sqlservr.exe.

Versión                                                     Sqlservr.exe
RTM                                                        2005.90.1399
Service Pack 1 de SQL Server 2005        2005.90.2047
Service Pack 2 de SQL Server 2005        2005.90.3042
SQL Server 2005 Service Pack 3             2005.90.4035

Cómo determinar la versión de SQL Server 2000 que se está ejecutando

Para saber qué versión de SQL Server 2000 se está ejecutando, conéctese a SQL Server 2000 con el Analizador de consultas y ejecute el código siguiente:

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Se devuelve el siguiente resultado para encontrar la version de SQL Server 2000:

·         La versión del producto (por ejemplo, 8.00.534)
·         El nivel del producto (por ejemplo, "RTM" o "SP2")
·         La edición (por ejemplo, "Standard Edition"). Por ejemplo, el resultado puede presentar un aspecto similar al siguiente:

8.00.534 SP2 Standard Edition

En la tabla siguiente se muestra el número de versión de Sqlservr.exe.

RTM                                                         2000.80.194.0
Service Pack 1 de SQL Server 2000         2000.80.384.0
Service Pack 2 de SQL Server 2000         2000.80.534.0
Service Pack 3 de SQL Server 2000         2000.80.760.0
Service Pack 3a de SQL Server 2000       2000.80.760.0
Service Pack 4 de SQL Server 2000         2000.8.00.2039

Cómo determinar la versión de SQL Server 7.0 que se está ejecutando

Para saber qué versión de SQL Server 7,0 se está ejecutando, conéctese a SQL Server 7.0 con el Analizador de consultas y ejecute el código siguiente:

SELECT @@VERSION

El resultado se asemeja al siguiente para encontrar la version de SQL Server 7

Microsoft SQL Server  7.00 - 7.00.623 (Intel X86)
        Nov 27 1998 22:20:07
        Copyright (c) 1988-1998 Microsoft Corporation
        Desktop Edition on Windows NT 5.1 (Build 2600: )

En este ejemplo, el número de versión es el 7.00.6.23

Si el número de versión que indica @@VERSION no aparece en esta tabla, significa que SQL Server se está ejecutando con una revisión o una compilación de actualización de seguridad. Por ejemplo, si @@VERSION indica el número de versión 7.00.859, significa que se está ejecutando el Service Pack 2 de SQL Server 7.0 con una revisión instalada. Este número de versión aumenta con cada versión nueva del archivo ejecutable Sqlservr.exe. Consulte el archivo Readme.txt correspondiente a su revisión o actualización de seguridad para obtener más información.

Cómo determinar la versión de SQL Server 6.5 que se está ejecutando

Para saber qué versión de Microsoft SQL Server 6.5 se está ejecutando, conéctese a SQL Server 6.5 con Isql_w y, a continuación, ejecute el código siguiente para encontrar la version de SQL Server 6.5

SELECT @@VERSION

Si el número de versión que indica @@VERSION no aparece en esta tabla, significa que SQL Server se está ejecutando con una revisión o una compilación de actualización de seguridad. Este número de versión aumenta con cada versión nueva del archivo ejecutable Sqlservr.exe. Para obtener más información, consulte el archivo Readme.txt correspondiente de la revisión o actualización de seguridad.

De nuevo espero que esta información les pueda ser de utilidad.

Uso de transacciones en Linq

A continuación quiero compartir con ustedes la forma en que debemos utilizar transacciones en Linq para grabar información y así mantener la integridad de los datos por si algún proceso nos diera error en la base de datos:


        using (TransactionScope transactionScope = new TransactionScope())
        {
                MF_NIVEL_PRECIO_COEFICIENTE iMF_NIVEL_PRECIO_COEFICIENTEs = new MF_NIVEL_PRECIO_COEFICIENTE
                {
                    NIVEL_PRECIO = "Texto",
                    MONEDA = "L",
                    COEFICIENTE_MULR = 0,
                    DESCRIPCION = "Nuevo Precio"
                };
                db.MF_NIVEL_PRECIO_COEFICIENTEs.InsertOnSubmit(iMF_NIVEL_PRECIO_COEFICIENTEs);
                db.SubmitChanges();
            transactionScope.Complete();
        }


Convertir Linq to DataTable

En esta oportunidad me vi en la necesidad de convertir Linq hacia una DataTable.  Si es el caso de ustedes en este momento, pueden utilizar el código que a continuación les comparto:


        //Función que convierte de Linq a DataTable
        public DataTable LINQToDataTable<T>(IEnumerable<T> varlist)
        {
             DataTable dtReturn = new DataTable();

             PropertyInfo[] oProps = null;

             if (varlist == null) return dtReturn;

             foreach (T rec in varlist)
             {
                  //Uso reflection para obtener las propiedades, crear la tabla una sola vez.
                  if (oProps == null)
                  {
                       oProps = ((Type)rec.GetType()).GetProperties();
                       foreach (PropertyInfo pi in oProps)
                       {
                            Type colType = pi.PropertyType;

                            if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()    
                            ==typeof(Nullable<>)))
                             {
                                 colType = colType.GetGenericArguments()[0];
                             }

                            dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                       }
                  }

                  DataRow dr = dtReturn.NewRow();

                  foreach (PropertyInfo pi in oProps)
                  {
                       dr[pi.Name] = pi.GetValue(rec, null) == null ?DBNull.Value :pi.GetValue
                       (rec,null);
                  }

                  dtReturn.Rows.Add(dr);
             }
             return dtReturn;
        }

Confirmación de Aceptar o Cancelar en asp.net

Es muy común que necesitemos confirmación del usuario para ejecutar algún proceso.  La forma de resolver esto es muy sencilla, nos vamos al botón que ejecutará el proceso antes mencionado y buscamos la propiedad "OnClientClick" y en ella colocamos la siguiente llamada a JavaScript:

javascript:return confirm("Desea eliminar el registro?")

Con esta acción si el usuario hace clic en "Cancelar" no se ejecutará el código del evento "Clic" relacionado con el botón y si el usuario hace clic en "Aceptar" si se ejecutará el código.

Esto también lo podemos utilizar si tenemos LinkButtons en un Grid, solo debemos convertir a Template la columna del LinkButton y a continuación ya podremos utilizar la propiedad On Client Click del LinkButton de la columna del Grid.

Espero que esta información pueda ser útil para ustedes tal como lo fue para mi para poner un mensaje de si o no en c# asp.net