.NET 2.0 で小さな Windows フォーム アプリケーションを作成しています。
OdbcDataAdapter には、そのように指定された Insert ステートメントと Update ステートメントがあります。select ステートメントも、このコードの前半で定義されています。
OdbcCommand insertCommand = _connection.CreateCommand();
insertCommand.CommandText = "INSERT INTO myTable (ReportID) VALUES (?ReportId)";
_dataAdapter.InsertCommand = insertCommand;
_dataAdapter.InsertCommand.Parameters.Add(new OdbcParameter { ParameterName = "?ReportID", SourceColumn = "ReportID" });
OdbcCommand updateCommand = _connection.CreateCommand();
updateCommand.CommandText = @"
UPDATE
myTable
SET
ReportID = ?ReportID
WHERE ID = ?ID";
_dataAdapter.UpdateCommand = updateCommand;
_dataAdapter.UpdateCommand.Parameters.Add(new OdbcParameter { ParameterName = "?ID", SourceColumn = "ID"});
_dataAdapter.UpdateCommand.Parameters.Add(new OdbcParameter { ParameterName = "?ReportID", SourceColumn = "ReportID"});
とにかく、ここで問題です。_dataAdapter.Update(_table) を呼び出すと、挿入では機能しますが、更新ではエラーがスローされます。エラー [22018][SYBASE][ODBC Sybase ドライバー][SQL Server] データ型 'NUMERIC' から 'VARCHAR' への暗黙的な変換は許可されていません。CONVERT 関数を使用して、このクエリを実行します。
変数を調べると、これが発生する理由はありません。ReportID は varchar ですが、奇妙な理由により、更新時に数値のように扱われます。なぜこうなった?
アップデート
パラメータを設定していた順序が原因であることがわかりました。他の誰かが動けなくなった場合に備えて、とにかくこれを投稿すると思いました。