そのため、SQLServerDBに対してRails2.3.3上でExtjsを実行しています。DBからデータをプルして表示することはできますが、作成、更新、または破棄することはできません。
奇妙なことに、更新や削除を試みてもコンソールやその他のエラーはスローされません。単に失敗するだけです。
作成時に、InvalidStatementエラーがスローされます。これは、新しい行に適切なIDが割り当てられていないことに関連している可能性があります。null IDが割り当てられます。もちろん、ID値としては許可されていません。
誰かが似たようなものに遭遇したことがありますか?Extjs + SqlServerを使用した作成、更新、または破棄に関する問題の回避策に関するアイデアはありますか?
ありがとう!
アップデート:
自動インクリメントは、問題のテーブルのIDフィールドに設定されます。私が返される特定のエラー:
ActiveRecord::StatementInvalid (DVI::DatabaseError: 37000 (339) [ODBC SQL Server Driver][SQL Server] DEFAULT or NULL are not allowed as explicit identity values. INSERT INTO [table] ([username], [fullname], [ID], [password], [superuser]) VALUES('testing', 'testing', NULL, 'testing', 1)):
# ... ruby exceptions mostly springing from the sqlserver adapter ...
デバッガーを開いてIDを手動で追加すると、正常に機能することに注意してください...
UPDATE2:
更新/破棄時に、最初のPOSTリクエストは適切な(変更された)フィールドデータで構築され、成功した応答が表示されます。ただし、更新データは後続のGET要求には反映されません。
ログを調べてみると、更新時に生成されたSQLには次の問題があることがわかります。
Administrators Load (0.0ms) SELECT * FROM [Administrators] WHERE ([Administrators].[id] = '2')
EXECUTE (0.0ms) BEGIN TRANSACTION
Administrators Update (0.0ms) UPDATE [Administrators] SET [superuser] = 1 WHERE [id] = NULL
同様の問題は、破棄要求を悩ませています。
何が起きてる?適切なレコードをプルしてから操作を実行するまでの間に、IDがnullに設定されるのはなぜですか?
これは、デバッガーでこの操作を手動で実行した場合でも動作することに注意してください。
(rdb:63) Administratiors.find(2).destroy
IDに基づいて適切な行を選択しますが、IDがNULLであるテーブルから行を削除しようとします。もちろん失敗します...
UPDATE3:
さて、削除操作を機能させるために私が見つけた唯一の方法は、自分のSQLをロールすることです。@admin.destroyを
sql = ActiveRecord::Base.connection()
sql.begin_db_transaction
sql.execute("SELECT * FROM Administrators WHERE ([Administrators].[id] = #{params[:id]})");
sql.delete("DELETE FROM Administrators WHERE ([Administrators].[id] = #{params[:id]})");
sql.commit_db_transaction
期待どおりに操作を実行します。
UPDATE4:
これも機能します:
Administrators.delete(params[:id])
UPDATE5:
了解しました。これで、CRUDはExtjsとSQLサーバーの間で機能します。しかし、これは醜いハック(特に更新操作)であり、これをよりクリーンに行う方法についての洞察が欲しいです。
# POST /administrators
def create
@administrator = Administrators.new(params[:administrators])
@administrator.ID = Administrators.all.length+1
respond_to do |format|
format.html
format.ext_json {render :json => @administrator.to_ext_json(:success => @administrator.save!)}
end
end
# PUT /administrators/1
def update
attrs_to_update = ""
params[:administrators].each {|k,v| attrs_to_update += "#{k} = \'#{v}\', "}
attrs_to_update = attrs_to_update.strip.chomp(",")
sql = ActiveRecord::Base.connection()
sql.begin_db_transaction
sql.execute("SELECT * FROM Administrators WHERE ([Administrators].[id] = #{params[:id]})");
sql.execute("UPDATE Administrators SET #{attrs_to_update} WHERE ([Administrators].[id] = #{params[:id]})");
sql.commit_db_transaction
render :json => @administrator.to_ext_json(:success => @administrator.update_attributes!(params[:administrators]))
end
# DELETE /administrators/1
def destroy
Administrators.delete(params[:id])
head :ok
end
これをクリーンアップする方法について何か考えはありますか?それとも、そもそもなぜそれが箱から出して機能しないのでしょうか?:)
バンプ:
本当に?誰かがこれを試してみる必要があります...