2009-04-02 34 views
7

3層データベースセットアップのテーブルにレコードを挿入しようとしています。中間層サーバーは、最初のパラメータをクエリに追加しようとすると、上記のエラーメッセージをOLE例外として生成します。Delphi: "パラメータオブジェクトが正しく定義されていません。不一致または不完全な情報が提供されました。"

私はこのエラーをグーグルで見つけました。同じ結果を一貫して見つけました。つまり、ADOのSQLパーサーを使用しているクエリのどこかに文字列にコロンを付けることが原因です。これはここでは当てはまりません。どこでも偽のコロンはありません。私は、挿入しようとしているテーブルのスキーマに対して、オブジェクト定義をチェックして再チェックしました。すべてがチェックアウトされ、これには私の同僚が困惑しています。誰もがこれを引き起こす可能性があることを知っていますか?私はここで私の知恵の終わりです。

私は、Delphi 2007を使用してSQL Server 2005の

+0

@Mason - パラメータを使用していますか?そうでない場合は、ParamCheck:= Falseが設定されますか? –

+0

私はパラメータを使用しています。 –

答えて

0

私はよく覚えている場合だが、あなたはパラメータを明示的にプットNULL値を持っています。 TAdoStoredProcコンポーネントを使用している場合は、設計時にこれを行う必要があります。

0

スレッドを使用していますか?私はタイマーイベントがADO接続が別の同期クエリに使用されている間にクエリを開始したときにこのエラーが発生するのを覚えているようです。 (タイマーは毎分 "システム利用可能"フラグをチェックしていました)。

0

パラメータのデータ型を設定しましたか、それともftUnknownのままにしましたか?

+0

データ型が設定されています。 –

4

Delphi 2007とMSSQL Server 2008を使用してこのエラーが発生する可能性があり、回避策が見つかりました。

:私はそれを修正する2つの方法を見つけ

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; 

:(これはあなたが同じことによるものであれば、かなり安っぽい私見ですが、あなたに多分その便利。)エラーを生成する

コード

1)すなわち、SQLからブラケットを取り外す:

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

2)は、2つのパラメータの代わりにのいずれかを使用:

を0
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

ここでは返信が遅れています。私の場合、それはまったく違ったものでした。

データベースにストアドプロシージャを追加しようとしました。

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'; 

私はコロン(:)を削除したときに機能しました。コロンをパラメータとして見たとき。

1

私はあなたの質問に記載されているのと同じエラーに直面しています。私はADODB.pasにエラーをトレースしました - >procedure TParameters.AppendParameters; ParameterCollection.Append(Items[I].ParameterObject).
breakpointを使用することで、私のケースではデータベースのDateTimeフィールドを埋めるパラメータでエラーが発生しました。 value:= ''問題を解決しました(私はvarnullでも試しましたが、データベースにNullを送信するのではなく、クエリに1 - varnullの整数値を送ります)。

PS:知っているのは「遅い遅刻」ですが、誰かが同じエラーで到達する可能性があります。

+0

そのような問題はありましたが、NULLを送信しました(私の答えは答えます) – BennyBechDk

+0

今は同じ問題が発生していることがあります。時々起こることもありますし、TParameters.AppendParametersまで追跡することもできます。問題の原因となっていたパラメータに値NULLが割り当てられていることに気付きました。未割り当てに変更すると問題が解決したようです。しかし、本当に私に迷惑をかけるのは、エラーがたまにしか発生しないという事実です。 –

0

私は同じ問題を抱えていましたが、動的コマンド(たとえば、Updateステートメント)を使用しました。
一部のパラメータはNULLにすることができます。
私はそれを働かせることができる唯一の方法は、parameter.DataTypeを設定していた:= ftStringとparameter.Size:= 1とをは設定していません。

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

上記の例外メッセージを検索中にこのスレッドが見つかりました。私のケースでは、原因はSQLのコメント/ * foo * /を私のquery.sql.textに埋め込む試みでした。

(私は私のプロファイラーウィンドウに浮かぶ過去に行くコメントを見るために便利だっただろうと思った。)

とにかく - Delphi7はその1を憎みました。

+0

デルファイ2010で私と同じです。私は " - foo"というコメントを追加していました。 –

0

今日は、ParamCheck := Falseを持つTADOQueryでこのエラーが発生しましたが、SQLにコロンはありません。

どういうわけか私のためにこれを引き起こしていた()TWebBrowser.ExecWBにOLECMDEXECOPT_DODEFAULTパラメータを渡す:

pvaIn := EmptyParam; 
pvaOut := EmptyParam; 
TWebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER, pvaIn, pvaOut); 
:これは、問題を示していない

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

は、これが問題を示してい

0

クエリの単一の二重引用符も、私が今経験したものからこのエラーを引き起こす可能性があります。私はあなたではありませんすべてのパラメータを歌う...

1

私はちょうどこのエラーが発生しました。私はTAdoQueryコンポーネントを使用して2003 MS Accessデータベースに書き込むためにDelphi 7を使用しています。 (古いコード)私のクエリはMS Accessで直接うまくいきましたが、DelphiではTAdoQueryオブジェクトで失敗します。私のエラーは日付/時刻の値からコロン(元のポスターに謝罪)から来ました。

私が理解しているように、Jet SQLの日付/時刻形式は#mm/dd/yyyy hh:nn:ss#です(左パディングは不要です)。

TAdoQuery.ParamCheckプロパティがTrueの場合、この形式は失敗します。 a)ParamCheckをFalseに設定するか、b) "mm/dd/yyyy hh:nn:ss"という別の日付/時刻形式を使用します(二重引用符で囲みます)。

私はこれらのオプションの両方をテストし、どちらも機能しました。

二重引用符で囲まれた日付/時刻形式はJetの日付/時刻形式ではありませんが、Accessはこれらの日付/時刻形式に柔軟性があります。また、BDE/LocalSQL/Paradox(Delphi 7のネイティブSQLとデータベースエンジン)の日付/時刻形式(上記のように二重引用符を使用)と関係があると思われます。パーサは、おそらく引用符付きの文字列を無視するように設計されています(二重引用符はBDE LocalSQLの文字列値区切り文字です)が、他の非日付/時刻フォーマットでは多少ぶつかります。

SQL Serverでは、単一引用符を使用して文字列を区切るため、SQL Serverテーブルに書き込むときには二重引用符ではなく機能します(テストされません)。あるいは、DelphiのTAdoQueryオブジェクトがまだまだつまずくでしょう。その場合、ParamCheckをオフにすることは唯一の選択肢かもしれません。コード内のParamCheckプロパティ値を切り替える予定の場合は、現在のSQLの解析を計画していない場合は、SQLプロパティが有効になる前に空であることを確認して処理時間を節約します。

0

SQLで時刻値を使用してQuotedStr()でラップするのを忘れると、このエラーが発生する可能性があります。

0

同じエラーが発生しました。ストアドプロシージャのパラメータがvarchar(max)として宣言されたためです。それをvarchar(4000)にして、エラーが消えました。

関連する問題