如何传递一个字符串为“@”的字符串作为字符串的一部分?

时间:2013-11-27 17:01:12

标签: sql stored-procedures char parameter-passing procedure

这是我简单的存储过程

ALTER procedure [dbo].[insertar_Empleado]
@nombre varchar(40),
@apellido varchar (40),
@dni varchar(7),
@direccion int,
@usuario varchar (50),
@contraseña varchar(20),
@mail varchar(50),
@tel varchar(20),
@tipo int

as

insert into Empleados(nombre, apellido, dni, id_direccion ,id_tipoEmpleado, mail,
telefono, usuario, pass)
values(@nombre, @apellido, @dni, @direccion,  @tipo, @mail, @tel, @usuario, 
@contraseña)

问题是参数@usuario总是包含一个像“@Peter”或“@George”这样的字符串,所以当我插入一些行时,字段“usuario”有一个像“Peter”或“George”这样的值忽略人物。我需要这个原因,这是一种识别该用户是特殊类型用户的方法。有什么想法吗?

** RS:

这是第一部分:**

 public void InsertarCliente(Cliente nCliente, SqlConnection conec, SqlTransaction transac)
    {
        Datos objDatos = new Datos();
        SqlParameter[] objParametros = new SqlParameter[9];

        objParametros[0] = new SqlParameter("@nombre", SqlDbType.VarChar, 40);
        objParametros[0].Value = nCliente.Nombre;

        objParametros[1] = new SqlParameter("@apellido", SqlDbType.VarChar, 40);
        objParametros[1].Value = nCliente.Apellido;

        objParametros[2] = new SqlParameter("@dni", SqlDbType.VarChar, 9);
        objParametros[2].Value = nCliente.Dni;

        objParametros[3] = new SqlParameter("@direccion", SqlDbType.Int, 6);
        objParametros[3].Value = nCliente.Direccion;

        objParametros[4] = new SqlParameter("@tipo", SqlDbType.Int, 3);
        objParametros[4].Value = null;

        objParametros[5] = new SqlParameter("@mail", SqlDbType.VarChar, 50);
        objParametros[5].Value = nCliente.Mail;

        objParametros[6] = new SqlParameter("@tel", SqlDbType.VarChar, 20);
        objParametros[6].Value = nCliente.Telefono;

        objParametros[7] = new SqlParameter("@usuario", SqlDbType.VarChar, 50);
        objParametros[7].Value = nCliente.Nombre;

        objParametros[8] = new SqlParameter("@contraseña", SqlDbType.VarChar, 20);
        objParametros[8].Value = nCliente.Nombre;


        try
        {

            if (nCliente.Usuario.StartsWith("@"))
            {
                objParametros[4].Value = 1;
                objDatos.ExecuteNonQuery("insertar_Empleado", ref objParametros, ref conec, ref transac);
            }

            else
            {
                objParametros[4].Value = 3;
                objDatos.ExecuteNonQuery("insertar_Cliente", ref objParametros, ref conec, ref transac);
            }



        }
        catch (Exception ex)
        {
            throw new Exception("Error al insertar el Cliente", ex);
        }

    }

第二部分是使用我使用的存储过程的通用方法:

public void ExecuteNonQuery(string nombreSP , ref SqlParameter[] param, ref SqlConnection objConn, ref SqlTransaction objTran)
    {
        //Hago que el try encierre todo el bloque del procedimiento, sino me puede quedar la transacción colgada 

        try 
        {    

                SqlCommand objCommand = new SqlCommand();
                objCommand.CommandType = System.Data.CommandType.StoredProcedure;
                objCommand.CommandText = nombreSP;
                //La conexión que pasé como parámetro
                objCommand.Connection = objConn;
                //la transacción que pasé como parámetro
                objCommand.Transaction = objTran;

                foreach (SqlParameter parametro in param)
                {
                    objCommand.Parameters.Add(parametro);

                }


                objCommand.Connection = objConn;

                objCommand.ExecuteNonQuery();

        }
        catch (Exception ex)
        {

            throw;
        }
    }

1 个答案:

答案 0 :(得分:1)

我认为您在@字段中没有看到usario任何值的原因是您在此处将名称添加到此参数:

objParametros[7] = new SqlParameter("@usuario", SqlDbType.VarChar, 50);
objParametros[7].Value = nCliente.Nombre;

我认为应该是

objParametros[7] = new SqlParameter("@usuario", SqlDbType.VarChar, 50);
objParametros[7].Value = nCliente.Usuario;

作为一个非相关点,这一行是多余的:

objParametros[4].Value = null;

默认情况下,该值为null,这不等同于数据库中的NULL。等价物是DbNull.Value