Insert en BD con valores null mediante SOAP... Muy buenas, a ver si me podeis echar un cable, estoy haciendo una aplicación ASP.NET en Visual C# que por motivos de portabilidad todas las transacciones hacia y desde base de datos (SQL Server 2000) se realizan mediante SOAP.
El caso es que, por ejemplo, en el apartado de alta de usuarios al sistema, desde la aplicación ASP.NET, paso los valores que ha introducido el usuario en el formulario a la función SOAP:
Código:
servicio.alta_usuarios (TBUsuario.Text, TBPassword.Text, TBNombre.Text, TBApellido1.Text, TBApellido2.Text, TBNombreBreve.Text, Int32.Parse(DDLDepartamento.SelectedValue), Int32.Parse(RBLCentro.SelectedValue), Int32.Parse(RBLEmpresa.SelectedValue), TBPuesto.Text, TBTelefono.Text, TBExtension.Text, TBEmail.Text, Int32.Parse(TBEstado.Text), DateTime.Parse(TBFechaSolic.Text), DateTime.Parse(TBFechaVal.Text), DateTime.Parse(TBFechaMod.Text), Int32.Parse(TBFuncion.Text), Int32.Parse(TBContratoAlta.Text), Int32.Parse(TBContratoVista.Text));
Y la correspondiente función SOAP es la siguiente:
Código:
[WebMethod]
public string alta_usuarios(string usuario, string password, string nombre, string apellido1, string apellido2, string nombre_breve, int id_departamento, int id_centro, int id_empresa, string puesto, string telefono, string extension, string mail, int estado, DateTime fecha_solic, DateTime fecha_val, DateTime fecha_mod, int funcion, int contrato_alta, int contrato_vista)
{
string conexion = cedena_conexion();
SqlConnection con = new SqlConnection (conexion);
SqlCommand cmdinsert = new SqlCommand ("insert into usuarios (usuario, password, nombre, apellido1, apellido2, nombre_breve, id_departamento, id_centro, id_empresa, puesto, telefono, extension, mail, estado, fecha_solic, fecha_val, fecha_mod, funcion, contrato_alta, contrato_vista) values (@usuario, @password, @nombre, @apellido1, @apellido2, @nombre_breve, @id_departamento, @id_centro, @id_empresa, @puesto, @telefono, @extension, @mail, @estado, @fecha_solic, @fecha_val, @fecha_mod, @funcion, @contrato_alta, @contrato_vista)", con);
cmdinsert.Connection.Open();
SqlParameter param1 = new SqlParameter ("@usuario", SqlDbType.VarChar, 10);
param1.Direction = ParameterDirection.Input;
param1.IsNullable = false;
param1.Value = (usuario);
cmdinsert.Parameters.Add(param1);
SqlParameter param2 = new SqlParameter ("@password", SqlDbType.VarChar, 10);
param2.Direction = ParameterDirection.Input;
param2.IsNullable = false;
param2.Value = (password);
cmdinsert.Parameters.Add(param2);
SqlParameter param3 = new SqlParameter ("@nombre", SqlDbType.VarChar, 20);
param3.Direction = ParameterDirection.Input;
param3.IsNullable = false;
param3.Value = (nombre);
cmdinsert.Parameters.Add(param3);
SqlParameter param4 = new SqlParameter ("@apellido1", SqlDbType.VarChar, 20);
param4.Direction = ParameterDirection.Input;
param4.IsNullable = false;
param4.Value = (apellido1);
cmdinsert.Parameters.Add(param4);
SqlParameter param5 = new SqlParameter ("@apellido2", SqlDbType.VarChar, 20);
param5.Direction = ParameterDirection.Input;
param5.IsNullable = false;
param5.Value = (apellido2);
cmdinsert.Parameters.Add(param5);
SqlParameter param6 = new SqlParameter ("@nombre_breve", SqlDbType.VarChar, 15);
param6.Direction = ParameterDirection.Input;
param6.IsNullable = false;
param6.Value = (nombre_breve);
cmdinsert.Parameters.Add(param6);
SqlParameter param7 = new SqlParameter ("@id_departamento", SqlDbType.Int, 4);
param7.Direction = ParameterDirection.Input;
param7.IsNullable = false;
param7.Value = (id_departamento);
cmdinsert.Parameters.Add(param7);
SqlParameter param8 = new SqlParameter ("@id_centro", SqlDbType.Int, 4);
param8.Direction = ParameterDirection.Input;
param8.IsNullable = false;
param8.Value = (id_centro);
cmdinsert.Parameters.Add(param8);
SqlParameter param9 = new SqlParameter ("@id_empresa", SqlDbType.Int, 4);
param9.Direction = ParameterDirection.Input;
param9.IsNullable = false;
param9.Value = (id_empresa);
cmdinsert.Parameters.Add(param9);
SqlParameter param10 = new SqlParameter ("@puesto", SqlDbType.VarChar, 15);
param10.Direction = ParameterDirection.Input;
param10.IsNullable = false;
param10.Value = (puesto);
cmdinsert.Parameters.Add(param10);
SqlParameter param11 = new SqlParameter ("@telefono", SqlDbType.VarChar, 15);
param11.Direction = ParameterDirection.Input;
param11.IsNullable = true;
param11.Value = (telefono);
cmdinsert.Parameters.Add(param11);
SqlParameter param12 = new SqlParameter ("@extension", SqlDbType.VarChar, 5);
param12.Direction = ParameterDirection.Input;
param12.IsNullable = true;
param12.Value = (extension);
cmdinsert.Parameters.Add(param12);
SqlParameter param13 = new SqlParameter ("@mail", SqlDbType.VarChar, 50);
param13.Direction = ParameterDirection.Input;
param13.IsNullable = false;
param13.Value = (mail);
cmdinsert.Parameters.Add(param13);
SqlParameter param14 = new SqlParameter ("@estado", SqlDbType.Int, 4);
param14.Direction = ParameterDirection.Input;
param14.IsNullable = false;
param14.Value = (estado);
cmdinsert.Parameters.Add(param14);
SqlParameter param15 = new SqlParameter ("@fecha_solic", SqlDbType.DateTime, 10);
param15.Direction = ParameterDirection.Input;
param15.IsNullable = false;
param15.Value = (fecha_solic);
cmdinsert.Parameters.Add(param15);
SqlParameter param16 = new SqlParameter ("@fecha_val", SqlDbType.DateTime, 10);
param16.Direction = ParameterDirection.Input;
param16.IsNullable = true;
param16.Value = (fecha_val);
cmdinsert.Parameters.Add(param16);
SqlParameter param17 = new SqlParameter ("@fecha_mod", SqlDbType.DateTime, 10);
param17.Direction = ParameterDirection.Input;
param17.IsNullable = true;
param17.Value = (fecha_mod);
cmdinsert.Parameters.Add(param17);
SqlParameter param18 = new SqlParameter ("@funcion", SqlDbType.Int, 4);
param18.Direction = ParameterDirection.Input;
param18.IsNullable = false;
param18.Value = (funcion);
cmdinsert.Parameters.Add(param18);
SqlParameter param19 = new SqlParameter ("@contrato_alta", SqlDbType.Int, 4);
param19.Direction = ParameterDirection.Input;
param19.IsNullable = true;
param19.Value = (contrato_alta);
cmdinsert.Parameters.Add(param19);
SqlParameter param20 = new SqlParameter ("@contrato_vista", SqlDbType.Int, 4);
param20.Direction = ParameterDirection.Input;
param20.IsNullable = true;
param20.Value = (contrato_vista);
cmdinsert.Parameters.Add(param20);
try
{
cmdinsert.ExecuteNonQuery();
}
catch (Exception errorMens)
{
return errorMens.Message;
}
finally
{
cmdinsert.Connection.Close();
}
return "ok";
}
Bueno, resulta, que algunos campos de formulario no son obligatorios, de modo que el usuario debería poder dejarlos en blanco y que la Insert funcionara correctamente. Como veis, en la definición de parametros del servicio SOAP se especifica (en cada uno de ellos) si el parametro puede ser nulo o no:
parametro.IsNullable = false; //No puede ser nulo.
parametro.IsNullable = True; //Puede ser nulo.
Pero esto no me sirve de nada, o casi nada, por que, si el usuario deja campos vacios, en la llamada al servicio SOAP desde la página web me salta un error diciendo que la cadena no es válida, es decir, si el usuario deja vacio el campo TBFechaMod.Text, que no es obligatorio, cuando se ejecuta la llamada a la función SOAP, me da el error por que DateTime.Parse(TBFechaMod.Text) no es un formato de fecha válido, ya que está vacio... y así con todos los campos 'nulables' que el usuario no rellene...
No se si habré conseguido explicarme...
¿Se os ocurre alguna forma de que no pete, de que pase un valor null cuando el campo está vacio?
Un saludo y gracias de antemano. |