2009-04-02 14 views
7

Estoy tratando de insertar un registro en una tabla en una configuración de base de datos de 3 niveles, y el servidor de nivel medio genera el mensaje de error anterior como una excepción OLE cuando intenta agregar el primer parámetro a la consulta.Delphi: "El objeto del parámetro está definido incorrectamente. Se proporcionó información incompleta o incoherente".

He buscado este error en Google y encuentro el mismo resultado de manera consistente: proviene de tener dos puntos en una cadena en algún lugar de tu consulta, lo que hace que el analizador SQL de ADO. Este no es el caso aquí. No hay dos puntos falsos en ninguna parte. Revisé y volví a comprobar la definición del objeto en relación con el esquema de la tabla en la que intento insertar. Todo sale bien, y esto ha dejado perplejos a mis compañeros de trabajo. ¿Alguien sabe qué más podría estar causando esto? Estoy en mi ingenio aquí.

estoy usando Delphi 2007 y SQL Server 2005.

+0

@Mason - ¿Estás usando parámetros? Si no, ¿establece ParamCheck: = False help? –

+0

Estoy usando parámetros. –

Respuesta

0

Si recuerdo bien, usted tiene que poner el valor NULL explícita al parámetro. Si está utilizando un componente TAdoStoredProc, debe hacerlo en tiempo de diseño.

0

¿Está utilizando algún subproceso? Parece que recuerdo haber cometido este error cuando un evento de temporizador inició una consulta mientras la conexión ADO se estaba utilizando para otra consulta síncrona. (El temporizador estaba revisando un indicador de "sistema disponible" cada minuto).

0

¿Ha establecido el DataType del parámetro o lo dejó como ftUnknown?

+0

Se ha establecido el tipo de datos. –

4

Puedo obtener este error, usando Delphi 2007 y MSSQL Server 2008, y encontré una solución alternativa. (. Que es mi humilde opinión bastante malo, pero tal vez es útil para usted si el suyo es causada por la misma cosa)

código para producir el error:

with TADOQuery.Create(nil) 
do try 

    Connection := ADOConnection; 

    SQL.Text := ' (SELECT * FROM Stock WHERE InvCode = :InvCode) ' 
       +' (SELECT * FROM Stock WHERE InvCode = :InvCode) '; 

    Prepared := true; 

    Parameters.ParamByName('InvCode').Value := 1; 

    Open; // <<<<< I get the "parameter object is...etc. error here. 

finally 
    Free; 
end; 

He encontrado dos maneras de solucionarlo:

1) quitar los soportes de la SQL, es decir:

SQL.Text := ' SELECT * FROM Stock WHERE InvCode = :InvCode ' 
       +' SELECT * FROM Stock WHERE InvCode = :InvCode '; 

2) utilizar dos parámetros en lugar de uno:

with TADOQuery.Create(nil) 
do try 

    Connection := ADOConnection; 

    SQL.Text := ' (SELECT * FROM Stock WHERE InvCode = :InvCode1) ' 
       +' (SELECT * FROM Stock WHERE InvCode = :InvCode2) '; 

    Prepared := true; 

    Parameters.ParamByName('InvCode1').Value := 1; 
    Parameters.ParamByName('InvCode2').Value := 1; 

    Open; // <<<<< no error now. 

finally 
    Free; 
end; 
2

Aquí una respuesta tardía. En mi caso, era algo completamente diferente.

Intenté agregar un procedimiento almacenado a la base de datos.

Query.SQL.Text := 
'create procedure [dbo].[test]' + #13#10 + 
'@param int ' + #13#10 + 
'as' + #13#10 + 
'-- For the parameter you can pick two values:' + #13#10 + 
'-- 1: Value one' + #13#10 + 
'-- 2: Value two'; 

Cuando eliminé los dos puntos (:) funcionó. Como vio el colon como un parámetro.

1

Me enfrenta al mismo error descrito en su pregunta. Rastreé el error en ADODB.pas ->procedure TParameters.AppendParameters; ParameterCollection.Append(Items[I].ParameterObject).
Al usar puntos de interrupción, el error se presentó en mi caso por un parámetro que debería llenar un campo DateTime en la base de datos y nunca he rellenado el parámetro. la configuración del parámetro(). value: = '' resolvió el problema (lo he intentado también con varnull, pero hay un problema: en lugar de enviar Null en la base de datos, la consulta está enviando 1, el valor entero de varnull).

PD: Sé que es una respuesta tardía tarde, pero tal vez alguien llegue al mismo error.

+0

Tuve un problema así, pero lo recibí enviando NULL (mi respuesta) – BennyBechDk

+0

Tengo el mismo problema ahora, que a veces sucede, a veces no, y también he logrado rastrearlo hasta TParameters.AppendParameters. Noté que al parámetro que causaba el problema se le asignaba el valor NULL. Cambiarlo a Sin asignar parece haber solucionado el problema. Pero lo que realmente me molesta es el hecho de que el error solo ocurrirá algunas veces. –

0

También he tenido el mismo problema, pero con un comando dinámico (por ejemplo, una declaración de Actualización).
Algunos de los parámetros podrían ser NULL.
La única forma en que podría hacerlo funcionar, fue establecer el parámetro.DataType: = ftString y parameter.Size: = 1 y sin configurar el valor.

cmdUpdate := TADOCommand.Create(Self); 
try 
    cmdUpdate.Connection := '**Conections String**'; 
    cmdUpdate.CommandText := 'UPDATE xx SET yy = :Param1 WHERE zz = :Param2'; 
    cmdUpdate.Parameters.ParamByName('Param2').Value := WhereClause; 
    if VarIsNull(SetValue) then 
    begin 
    cmdUpdate.Parameters.ParamByName('Param1').DataType := ftString; 
    cmdUpdate.Parameters.ParamByName('Param1').Size := 1; 
    end else cmdUpdate.Parameters.ParamByName('Param1').Value := SetValue; 
    cmdUpdate.Execute; 
finally 
    cmdUpdate.Free; 
end; 
3

Encontré este hilo mientras buscaba el mensaje de excepción mencionado anteriormente. En mi caso, la causa fue un intento de insertar un comentario de SQL/* foo */en mi query.sql.text.

(pensé que habría sido útil para ver un comentario ir más allá flotando en mi ventana de perfiles.)

De todos modos - Delphi7 odiaba eso.

+0

Lo mismo para mí, en delphi 2010. Sin embargo, estaba agregando un comentario "- foo". –

0

Acabo de encontrarme con este error hoy en un TADOQuery que tiene ParamCheck := False y no tiene dos puntos en el SQL.

pasar algún modo el parámetro OLECMDEXECOPT_DODEFAULT a TWebBrowser.ExecWB() estaba causando esto por mí:

Esto muestra el problema:

pvaIn := EmptyParam; 
pvaOut := EmptyParam; 
TWebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, pvaIn, pvaOut); 

Esto no muestra el problema:

pvaIn := EmptyParam; 
pvaOut := EmptyParam; 
TWebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut); 
0

Una sola comilla doble en la consulta también puede generar este error por lo que acabo de experimentar y no soy tú cantar parámetros en absoluto ...

1

Acabo de encontrar este error yo mismo. Estoy usando Delphi 7 para escribir en una base de datos MS Access 2003 usando un componente TAdoQuery. (código antiguo) Mi consulta funcionó bien directamente en MS Access, pero falla en Delphi a través del objeto TAdoQuery. Mi error vino de dos puntos (disculpas al cartel original) a partir de un valor de fecha/hora.

Según tengo entendido, el formato de fecha/hora de Jet SQL es # mm/dd/aaaa hh: nn: ss # (0 left-padding no es obligatorio).

Si la propiedad TAdoQuery.ParamCheck es True, este formato falla. (¡Gracias, carteles!) Dos soluciones alternativas son: a) establecer ParamCheck en False, o b) usar un formato de fecha/hora diferente, a saber "mm/dd/aaaa hh: nn: ss" (CON las comillas dobles).

Probé ambas opciones y ambas funcionaron.

Aunque el formato de fecha/hora de doble cita no es el formato Jet fecha/hora, Access es bastante bueno para ser flexible en estos formatos de fecha/hora. También sospecho que tiene algo que ver con el formato de fecha/hora BDE/LocalSQL/Paradox (motor de bases de datos y SQL nativo de Delphi 7) (utiliza comillas dobles, como se indicó anteriormente). Probablemente, el analizador esté diseñado para ignorar cadenas entre comillas (las comillas dobles son el delimitador del valor de cadena en BDE LocalSQL), pero puede tropezar un poco con otros formatos de fecha/hora no nativos.

SQL Server utiliza comillas simples para delimitar cadenas, por lo que podría funcionar en lugar de comillas dobles al escribir en tablas de SQL Server (no probadas). O tal vez el objeto Delphi TAdoQuery todavía tropezará. Apagar ParamCheck en ese caso puede ser la única opción. Si planea alternar el valor de la propiedad ParamCheck en el código, ahorrará tiempo de procesamiento al asegurarse de que la propiedad SQL esté vacía antes de habilitarla, si no planea analizar el SQL actual.

0

Puede obtener este error cuando intenta utilizar un valor de tiempo en el SQL y olvida envolverlo con QuotedStr().

0

Tengo el mismo error. Resultó que se debe a que un parámetro del procedimiento almacenado se declaró como varchar (max). Lo hizo varchar (4000) y el error desapareció.

Cuestiones relacionadas