Pues eso… vamos que los certificados para usarlos con HTTPS ya están operativos, así que, si te muestra un aviso de que no es seguro, cierra esa pestaña del navegador y vuelve a entrar al sitio usando una nueva pestaña.
También están operativos los 3 subdominios de elguille.info, aunque sin https, dicen los de Acens que al ser subdominio no pueden aplicarles el certificado de seguridad… ??? Si ellos lo dicen…
Te los recuerdo: foros.elguille.info (aunque no se pueden hacer preguntas si puedes ver las respuestas) downloads.elguille.info (el sitio donde tengo los archivos para descarga) registro.elguille.info (era el sitio para crear un nuevo usuario para descargas y el foro)
Hay incidencias en el subdominio de downloads ya que aún no he publicado todos los zips.
En cuanto al subdominio de registros: ya no se pueden registrar nuevos usuarios, al menos así fue desde el 17 de junio del año pasado, que fue cuando cambién la base de datos, ahora lo msimo lo vuelvo a reactivar, más que nada por si te quieres registrar para poder seleccionar varias descargas (sin registrar debes entrar cada vez para cada descarga).
En cuanto a la extensión .ORG aún no están operativas para elguille.info (elguille.org) ni para el blog (elguillemola.org). Espero poder redirigirlos a los sitios correspondientes.
Pues eso… parece que con esto del cambio de servidor de alojamiento (hosting) todo está patas arriba… y por supuesto, también le toca a elguille.info (aunque creo que de este aún no he empezado la migración), pero…
Así que… paciencia… y ya mismo estará todo nuevamente en línea…
A fecha de hoy 29 de mayo de 2021 ya está «normal» con el certificado para usar HTTPS… esperemos que este blog (elguillemola) lo esté también pronto.
Pues eso… lo prometido es deuda y aquí tienes el código que te prometí del ejemplo correspondiente al post anterior (VarChar y NVarChar en SQL Server) para VB y C#.
Este código te permite comprobar que usando VARCHAR también puedes agregar caracteres especiales del idioma español: vocales acentuadas, eñes, etc.
En este ejemplo también uso dos bases de datos (en realidad 3), una de SQL Server y otra de MySQL en un servidor que está en la nube (en un hosting de Internet, concretamente en uno de Domitienda.com que es donde yo tengo mis sitios alojados). La tercera base es una de SLQ Server en mi servidor local (el de SQLEXPRESS).
El diseño del formulario y el código de VB y C#
Este es el formulario en modo de diseño (figura 1):
Nota:
En el código tienes la cadena de conexión para las bases de datos que están en «la web» y es posible que dejen de estar disponibles dentro de algún tiempo (no sé si una semana, un mes, un año o un día), así que… si quieres probarlo, usa cuanto antes el código del ZIP que te pondré al final o crea un proyecto a partir de lo que aquí te muestro.
El proyecto está creado con Visual Studio 2019 Preview 4.3 pero debería cargar también en Visual Studio 2017 y utiliza el .NET Framework 4.7.2.
El código para Visual Basic .NET
'------------------------------------------------------------------------------' Prueba de los tipos de SQL VarChar y NVarChar (19/Mar/19)' Usando base de SQL Server y MySQL''' (c) Guillermo (elGuille) Som, 2019'------------------------------------------------------------------------------OptionStrictOnOptionInferOnImports System.Data
Imports System.Data.SqlClient
' Versión de mysql.data.dll: Connector/Net 6.0.3.0Imports MySql.Data.MySqlClient
Imports System.Linq
PublicClassForm1Private inicializando AsBoolean = True'''<summary>''' Para las primeras pruebas uso una base local'''</summary>Private UsarBaseLocal AsBoolean = TruePrivate ServerName AsString = ".\SQLEXPRESS"Private DatabaseName AsString = "PruebaVarChar"Private UsuarioDB AsString = "elGuille_info"Private PasswordDB AsString = "VarChar_19"Private Tabla AsString = "VarCharElGuille"' Campos: Fecha, ConVarChar varchar(50), ConNVarChar nvarchar(50)' en MySQL no hay NVARCHAR y uso TEXT(50)Private MaxFilas AsInteger = 5
'''<summary>''' La cadena de conexión a la base de datos'''</summary>PrivateFunction CadenaConexionSQL() AsString
ConectarSQL()
Dim csb AsNew SqlConnectionStringBuilder
csb.DataSource = ServerName
csb.InitialCatalog = DatabaseName
csb.UserID = UsuarioDB & "SQL"
csb.Password = PasswordDB
csb.IntegratedSecurity = FalseReturn csb.ConnectionString
EndFunction'''<summary>''' La cadena de conexión a la base de datos'''</summary>PrivateFunction CadenaConexionMySQL() AsStringIf UsarBaseLocal ThenReturn"No hay base local de MySQL"
ConectarMySQL()
Dim csb AsNew MySqlConnectionStringBuilder
csb.Server = ServerName
csb.Database = DatabaseName
csb.UserID = UsuarioDB & "My"
csb.Password = PasswordDB
Return csb.ConnectionString
EndFunction'''<summary>''' Conectar a la base de datos de SQL Server'''</summary>PrivateSub ConectarSQL()
If UsarBaseLocal Then
ServerName = ".\SQLEXPRESS"Else
ServerName = "sql3.servidoreswindows.net"EndIfEndSub'''<summary>''' Conectar a la base de datos de MySQL.''' Siempre en remoto.'''</summary>PrivateSub ConectarMySQL()
ServerName = "mysql1.servidoreswindows.net"EndSub'''<summary>''' Añadir el dato a la base de SQL Server'''</summary>PrivateFunction AñadirSQL() AsStringDim sCon AsString = CadenaConexionSQL()
Dim sel = $"INSERT INTO {Tabla} (Fecha, ConVarChar, ConNVarChar) " &
$"VALUES('{DateTime.Now}', '{txtDato.Text}', '{txtDato.Text}')"Using con AsNew SqlConnection(sCon)
Dim cmd AsNew SqlCommand(sel, con)
Try
con.Open()
cmd.ExecuteNonQuery()
con.Close()
Return""Catch ex As Exception
Return$"ERROR: {ex.Message}"EndTryEndUsingEndFunction'''<summary>''' Añadir el dato a la base de datos de MySQL'''</summary>PrivateFunction AñadirMySQL() AsStringIf UsarBaseLocal ThenReturn"No hay base local de MySQL"Dim sCon = CadenaConexionMySQL()
' En MySQL he definido Fecha como varchar(20)Dim sel = $"INSERT INTO {Tabla} (Fecha, ConVarChar, ConNVarChar) " &
$"VALUES('{DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}', '{txtDato.Text}', '{txtDato.Text}')"Using con AsNew MySqlConnection(sCon)
Dim cmd AsNew MySqlCommand(sel, con)
Try
con.Open()
cmd.ExecuteNonQuery()
con.Close()
Return""Catch ex As Exception
Return$"ERROR: {ex.Message}"EndTryEndUsingEndFunction'''<summary>''' Mostrar los datos de la base de SQLServer'''</summary>PrivateFunction MostrarDatosSQL(ByRef dt As DataTable) AsStringDim orden = If(chkOrden.Checked, "DESC", "ASC")
Dim sel = $"SELECT TOP ({MaxFilas}) * FROM {Tabla} ORDER BY Fecha {orden}"Dim sCon = CadenaConexionSQL()
Dim da As SqlDataAdapter
dt = New DataTable
Try' Crear un nuevo objeto del tipo DataAdapter
da = New SqlDataAdapter(sel, sCon)
' Llenar la tabla con los datos indicados
da.Fill(dt)
Return$"Recuperadas {dt.Rows.Count} filas."Catch ex As Exception
Return$"ERROR: {ex.Message}"EndTryEndFunction'''<summary>''' Mostrar los datos de MySQL'''</summary>PrivateFunction MostrarDatosMySQL(ByRef dt As DataTable) AsStringIf UsarBaseLocal ThenReturn"No hay base local de MySQL"Dim orden = If(chkOrden.Checked, "DESC", "ASC")
' MySQL no tiene TOP, usar en su lugar LIMITDim sel = $"SELECT * FROM {Tabla} ORDER BY Fecha {orden} LIMIT {MaxFilas}"Dim sCon = CadenaConexionMySQL()
Dim da As MySqlDataAdapter
dt = New DataTable
Try' Crear un nuevo objeto del tipo DataAdapter
da = New MySqlDataAdapter(sel, sCon)
' Llenar la tabla con los datos indicados
da.Fill(dt)
Return$"Recuperadas {dt.Rows.Count} filas."Catch ex As Exception
Return$"ERROR: {ex.Message}"EndTryEndFunctionPrivateSub btnAñadir_Click(sender AsObject,
e As EventArgs) Handles btnAñadir.Click
Dim msg = ""
msg = AñadirSQL() & vbCrLf
msg &= AñadirMySQL()
LabelError.Text = msg
btnRefrescar.PerformClick()
EndSubPrivateSub btnRefrescar_Click(sender AsObject,
e As EventArgs) Handles btnRefrescar.Click
Dim dt As DataTable = NothingDim msg = ""
lvDatos.Items.Clear()
Dim i = 5
Integer.TryParse(txtFilas.Text, i)
MaxFilas = i
msg = MostrarDatosSQL(dt) & vbCrLf
asignarDatos("SQL", dt)
Dim lvi = lvDatos.Items.Add("---")
lvi.SubItems.Add("---")
lvi.SubItems.Add("---")
lvi.SubItems.Add("---")
dt = Nothing
msg &= MostrarDatosMySQL(dt)
asignarDatos("MySQL", dt)
LabelError.Text = msg
EndSubPrivateSub asignarDatos(base AsString, dt As DataTable)
If dt IsNothingThenReturnForEach r As DataRow In dt.Rows
Dim lvi = lvDatos.Items.Add(base)
lvi.SubItems.Add(r("Fecha").ToString)
lvi.SubItems.Add(r("ConVarChar").ToString)
lvi.SubItems.Add(r("ConNVarChar").ToString)
NextEndSubPrivateSub Form1_Load(sender AsObject, e As EventArgs) HandlesMyBase.Load
inicializando = FalseEndSubPrivateSub ChkUsarBaseLocal_CheckedChanged(sender AsObject, e As EventArgs) Handles chkUsarBaseLocal.CheckedChanged
If inicializando ThenReturn
UsarBaseLocal = chkUsarBaseLocal.Checked
EndSubEndClass
El código para C#
//-----------------------------------------------------------------------------// Prueba de los tipos de SQL VarChar y NVarChar (21/Mar/19)// Usando base de SQL Server y MySQL////// (c) Guillermo (elGuille) Som, 2019//-----------------------------------------------------------------------------using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
// Versión de mysql.data.dll: Connector/Net 6.0.3.0using MySql.Data.MySqlClient;
namespace VarChar_y_NVarChar_cs
{
publicpartialclassForm1 : Form
{
publicForm1()
{
InitializeComponent();
}
privatebool inicializando = true;
///<summary>/// Para las primeras pruebas uso una base local///</summary>privatebool UsarBaseLocal = true;
privatestring ServerName = @".\SQLEXPRESS";
privatestring DatabaseName = "PruebaVarChar";
privatestring UsuarioDB = "elGuille_info";
privatestring PasswordDB = "VarChar_19";
privatestring Tabla = "VarCharElGuille";
// Campos: Fecha, ConVarChar varchar(50), ConNVarChar nvarchar(50)// en MySQL no hay NVARCHAR y uso TEXT(50)privateint MaxFilas = 5;
///<summary>/// La cadena de conexión a la base de datos///</summary>privatestring CadenaConexionSQL()
{
ConectarSQL();
var csb = new SqlConnectionStringBuilder();
csb.DataSource = ServerName;
csb.InitialCatalog = DatabaseName;
csb.UserID = UsuarioDB + "SQL";
csb.Password = PasswordDB;
csb.IntegratedSecurity = false;
return csb.ConnectionString;
}
///<summary>/// La cadena de conexión a la base de datos///</summary>privatestring CadenaConexionMySQL()
{
if (UsarBaseLocal)
return"No hay base local de MySQL";
ConectarMySQL();
var csb = new MySqlConnectionStringBuilder();
csb.Server = ServerName;
csb.Database = DatabaseName;
csb.UserID = UsuarioDB + "My";
csb.Password = PasswordDB;
return csb.ConnectionString;
}
///<summary>/// Conectar a la base de datos de SQL Server///</summary>privatevoid ConectarSQL()
{
if (UsarBaseLocal)
ServerName = @".\SQLEXPRESS";
else
ServerName = "sql3.servidoreswindows.net";
}
///<summary>/// Conectar a la base de datos de MySQL./// Siempre en remoto.///</summary>privatevoid ConectarMySQL()
{
ServerName = "mysql1.servidoreswindows.net";
}
///<summary>/// Añadir el dato a la base de SQL Server///</summary>privatestring AñadirSQL()
{
string sCon = CadenaConexionSQL();
var sel = $"INSERT INTO {Tabla} (Fecha, ConVarChar, ConNVarChar) " +
$"VALUES('{DateTime.Now}', '{txtDato.Text}', '{txtDato.Text}')";
using (var con = new SqlConnection(sCon))
{
var cmd = new SqlCommand(sel, con);
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return"";
}
catch (Exception ex)
{
return$"ERROR: {ex.Message}";
}
}
}
///<summary>/// Añadir el dato a la base de datos de MySQL///</summary>privatestring AñadirMySQL()
{
if (UsarBaseLocal)
return"No hay base local de MySQL";
var sCon = CadenaConexionMySQL();
// En MySQL he definido Fecha como varchar(20)var sel = $"INSERT INTO {Tabla} (Fecha, ConVarChar, ConNVarChar) " +
$"VALUES('{DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")}', '{txtDato.Text}', '{txtDato.Text}')";
using (var con = new MySqlConnection(sCon))
{
var cmd = new MySqlCommand(sel, con);
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return"";
}
catch (Exception ex)
{
return$"ERROR: {ex.Message}";
}
}
}
///<summary>/// Mostrar los datos de la base de SQLServer///</summary>privatestring MostrarDatosSQL(ref DataTable dt)
{
var orden = chkOrden.Checked ? "DESC" : "ASC";
var sel = $"SELECT TOP ({MaxFilas}) * FROM {Tabla} ORDER BY Fecha {orden}";
var sCon = CadenaConexionSQL();
SqlDataAdapter da;
dt = new DataTable();
try
{
// Crear un nuevo objeto del tipo DataAdapter
da = new SqlDataAdapter(sel, sCon);
// Llenar la tabla con los datos indicados
da.Fill(dt);
return$"Recuperadas {dt.Rows.Count} filas.";
}
catch (Exception ex)
{
return$"ERROR: {ex.Message}";
}
}
///<summary>/// Mostrar los datos de MySQL///</summary>privatestring MostrarDatosMySQL(ref DataTable dt)
{
if (UsarBaseLocal)
return"No hay base local de MySQL";
var orden = chkOrden.Checked ? "DESC" : "ASC";
// MySQL no tiene TOP, usar en su lugar LIMITvar sel = $"SELECT * FROM {Tabla} ORDER BY Fecha {orden} LIMIT {MaxFilas}";
var sCon = CadenaConexionMySQL();
MySqlDataAdapter da;
dt = new DataTable();
try
{
// Crear un nuevo objeto del tipo DataAdapter
da = new MySqlDataAdapter(sel, sCon);
// Llenar la tabla con los datos indicados
da.Fill(dt);
return$"Recuperadas {dt.Rows.Count} filas.";
}
catch (Exception ex)
{
return$"ERROR: {ex.Message}";
}
}
privatevoid BtnAñadir_Click(object sender, EventArgs e)
{
var msg = "";
msg = AñadirSQL() + "\n";
msg += AñadirMySQL();
LabelError.Text = msg;
btnRefrescar.PerformClick();
}
privatevoid BtnRefrescar_Click(object sender, EventArgs e)
{
DataTable dt = null;
var msg = "";
lvDatos.Items.Clear();
var i = 5;
int.TryParse(txtFilas.Text, out i);
MaxFilas = i;
msg = MostrarDatosSQL(ref dt) + "\n";
asignarDatos("SQL", dt);
var lvi = lvDatos.Items.Add("---");
lvi.SubItems.Add("---");
lvi.SubItems.Add("---");
lvi.SubItems.Add("---");
dt = null;
msg += MostrarDatosMySQL(ref dt);
asignarDatos("MySQL", dt);
LabelError.Text = msg;
}
privatevoid asignarDatos(string @base, DataTable dt)
{
if (dt == null) return;
foreach (DataRow r in dt.Rows)
{
var lvi = lvDatos.Items.Add(@base);
lvi.SubItems.Add(r["Fecha"].ToString());
lvi.SubItems.Add(r["ConVarChar"].ToString());
lvi.SubItems.Add(r["ConNVarChar"].ToString());
}
}
privatevoid Form1_Load(object sender, EventArgs e)
{
inicializando = false;
}
privatevoid ChkUsarBaseLocal_CheckedChanged(object sender, EventArgs e)
{
if (inicializando) return;
UsarBaseLocal = chkUsarBaseLocal.Checked;
}
}
}
Y esto es todo… espero que te sea de utilidad.
Nos vemos. Guillermo
El código completo del ejemplo (solución para Visual Studio usando .NET 4.7.2)
El ZIP con el código completo (una solución de Visual Studio 2019 Preview con los proyectos de Visual Basic y C# además de la DLL de MySQL con la referencia a la copia dentro del directorio de la solución.
Aquí tienes el enlace para la descarga del ZIP que me descargué con el conector de MySQL para .NET versión 6.0.3 (mysql-connector-net-6.0.3-noinstall.zip) el tamaño es 1.64MB y el MD5 Checksum es: 57BB7F42645665D5A616A3484041F0C0.