none
OLE DB. Debe declarar la variable escalar RRS feed

  • Pregunta

  • Obtengo este error con  OLEDBConnection, con cadena conexión a SQL Server.

    [0] {Debe declarar la variable escalar "@operador".} object {System.Data.OleDb.OleDbError}
      Message "Debe declarar la variable escalar \"@operador\"." string
      NativeError 137 int
      SQLState "42000" string
      Source "Microsoft OLE DB Provider for SQL Server" string

    El código:

     cmd.Parameters.Clear();
    
                cmd.Parameters.Add(new OleDbParameter("@operador", OleDbType.VarChar) { Value = dr[1], });
                cmd.Parameters.Add(new OleDbParameter("@usuario", OleDbType.VarChar) { Value = dr[2], });
                cmd.Parameters.Add(new OleDbParameter("@proyecto", OleDbType.VarChar) { Value = dr[3], });
                cmd.Parameters.Add(new OleDbParameter("@codoperacion", OleDbType.VarChar) { Value = dr[4], });
                cmd.Parameters.Add(new OleDbParameter("@central", OleDbType.VarChar) { Value = dr[5], });
    
               
                cmd.CommandText = sqlInsert;
                int numRows = cmd.ExecuteNonQuery();
                return numRows != 0;

    La SQL

    INSERT INTO xxxx
     (operador, usuario, proyecto, codoperacion, central, provincia, filtro, fecha, observaciones, Caja, Referencia, NuevaReferencia, transferido )
    VALUES (@operador, @usuario, @proyecto, @codoperacion, @central, @provincia, @filtro, @fecha, @observaciones, @caja, @referencia, @nuevaReferencia, @transferido)"

    jueves, 18 de julio de 2019 11:36

Todas las respuestas

  • ¿Estás usando OleDb con bases de datos SQL Server?

    Debes utilizar el proveedor para SQL Server de .Net. Será algo como

    Dim Cmd as SqlCommand

    ...

    cmd.Parameters.Add(new SqlParameter("@operador", SQLType.VarChar) { Value = dr[1], });

    ...


    Saludos, Javier J

    jueves, 18 de julio de 2019 12:58
  • Es código legacy y funciona con OleDb - Microsoft OLE DB Provider for SQL Server
    jueves, 18 de julio de 2019 13:23
  • public static class OleDbCommandExtensions
    {
        public static void ConvertNamedParametersToPositionalParameters(this OleDbCommand command)
        {
            //1. Find all occurrences of parameter references in the SQL statement (such as @MyParameter).
            //2. Find the corresponding parameter in the commands parameters list.
            //3. Add the found parameter to the newParameters list and replace the parameter reference in the SQL with a question mark (?).
            //4. Replace the commands parameters list with the newParameters list.
    
            var newParameters = new List<OleDbParameter>();
    
            command.CommandText = Regex.Replace(command.CommandText, "(@\\w*)", match =>
            {
                var parameter = command.Parameters.OfType<OleDbParameter>().FirstOrDefault(a => a.ParameterName == match.Groups[1].Value);
                if (parameter != null)
                {
                    var parameterIndex = newParameters.Count;
    
                    var newParameter = command.CreateParameter();
                    newParameter.OleDbType = parameter.OleDbType;
                    newParameter.ParameterName = "@parameter" + parameterIndex.ToString();
                    newParameter.Value = parameter.Value;
    
                    newParameters.Add(newParameter);
                }
    
                return "?";
            });
    
            command.Parameters.Clear();
            command.Parameters.AddRange(newParameters.ToArray());
        }
    }
    The Problem is that OleDb (and Odbc too) does not support named parameters. It only supports what's called positional parameters.
    In other words: The name you give a parameter when adding it to the commands parameters list does not matter. It's only used internally by the OleDbCommand class so it can distinguish and reference the parameters.
    https://stackoverflow.com/questions/2407685/oledbparameters-and-parameter-names


    jueves, 18 de julio de 2019 15:31