web-dev-qa-db-ja.com

「複数ステップの操作でエラーが発生しました。各ステータス値を確認してください。」 SQL Server2008でADO)を使用するとエラーが発生します

SQL2000ボックスをSQL2008に移行中です。しかし、問題が発生しました。 UNIONを持つクエリを使用して結果セット(行かどうか)が返されるとき。コードの後半で、新しい行を追加してフィールドを割り当てようとしますが、UNIONが使用されたため、フィールドに値を割り当てようとすると、Multiple-step operation generated errors. Check each status value.エラーが発生します。 Windows XP&Windows 7で次のコードを試したところ、同じ結果が得られました。ただし、接続文字列を変更してSQL 2000ボックスを指すようにすると、エラーは発生しません。もっと。

次の例は、私たちが抱えている問題を示しています。

var c = new ADODB.Connection();
var cmd = new ADODB.Command();
var rs = new ADODB.Recordset();
object recordsAffected;

c.Open("Provider=SQLOLEDB;Server=*****;Database=*****;User Id=*****;Password=*****;");

cmd.ActiveConnection = c;
cmd.CommandType = ADODB.CommandTypeEnum.adCmdText;
cmd.CommandText = "create table testing2008 (id int)";
cmd.Execute(out recordsAffected);

try {
    cmd.CommandText = "select * from testing2008 union select * from testing2008";

    rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
    rs.Open(cmd, Type.Missing, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockBatchOptimistic, -1);

    rs.AddNew();
    rs.Fields["id"].Value = 0; //throws exception
    rs.Save();
}
catch (Exception ex) {
    MessageBox.Show(ex.ToString());
}
finally {
    cmd.CommandText = "drop table testing2008";
    cmd.Execute(out recordsAffected);
    c.Close();
}
7
vocero

この問題を投稿してから、問題を解決するためにフィールドの属性がバインドされていない(つまり、属性:basecatalog、basetable、basecolumnが空である)ユニオンを実行すると、次の値を強制する必要があることがわかりました。これらの属性は、レコードセットをxml(adPersistXML)に保存することにより、xmlを変更し、xmlからレコードセットを再度開きます。これによりフィールドがリバウンドし、続行することができました。これが最も効率的な解決策ではない可能性があることはわかっていますが、これは古いアプリ用であり、SQLステートメントを書き直したくありませんでした。主なエラーのようですMultiple-step operation generated errors. Check each status value.は、値がフィールドに割り当てられたときにエラーが発生した場合に関連しています。

7
vocero

以下のリンクは、このエラーメッセージが発生する可能性のある6つのシナリオの詳細を示す記事です。

シナリオ1-データベースにデータを挿入しようとするとエラーが発生します

シナリオ2-ADO接続を開こうとするとエラーが発生する

シナリオ3-フィールド名にスペースがあるAccessへのデータの挿入中にエラーが発生しました

シナリオ4-adLockBatchOptimisticを使用すると、Accessへのデータの挿入中にエラーが発生します

シナリオ5-Jet.OLEDB.3.51またはODBCドライバー(Jetではない)を使用している場合、Accessへのデータの挿入中にエラーが発生します.OLEDB.4.0)

シナリオ6-コマンドオブジェクトとパラメータを使用するとエラーが発生する

http://www.adopenstatic.com/faq/80040e21.asp

同じ問題に直面している可能性のある他の人に役立つことを願っています。

9
EdsonF

タイプの不一致です、試してみてください

rs.Fields["id"].Value = "0";

または、必ずバリアントを値に割り当ててください。

7
Olix

私が考えることができる2つのこと...あなたの「ID」列がゼロ(0)を受け入れることを確認してください。また、adUseClientカーソルを使用しないことでこの問題を一時的に停止しました(サーバーを試してください)。

多くの場合、これは型の不一致であり、NULLをNULL以外の列に詰め込もうとしたり、設計されているよりも多くの文字を列に書き込もうとしたりします。

お役に立てれば。 -フレド

3
Freddo

私は別のシナリオを見つけました:

メモリのみのadodb.recordsetの新しいレコードにadLongVarCharフィールドの値を設定しようとしたとき。私の場合、渡した文字列に埋め込みUnicode文字が含まれていたため、エラーがトリガーされました。

1
J Cloud

Table> field typeと一致しない値でフィールドを挿入/更新しようとすると、このエラーが発生していました。

たとえば、データベーステーブル>フィールドは

char(1)

しかし、私は挿入/更新しようとしていました

"Apple"

レコードに。

入力した値を"a"に変更すると、機能しました。

0
Ravi Ram