1

そのため、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

これをクリーンアップする方法について何か考えはありますか?それとも、そもそもなぜそれが箱から出して機能しないのでしょうか?:)

バンプ:

本当に?誰かがこれを試してみる必要があります...

4

1 に答える 1

1

これはこの質問に対する良い答えではありませんが、私はそれが最終的な結論だと思います:

  • MS SQL、Extjs、Railsを使用しないでください。ただし、時間とお金をかけて協力させたいと思われる場合を除きます。代わりにMySQLまたはPostGREを試してください。
于 2009-08-27T15:52:32.437 に答える