因此,我在Rails 2.3.3上面運行Extjs,並在SQL Server數據庫上運行。我可以從數據庫中提取數據並顯示它,但我無法創建,更新或銷燬。Rails,Extjs和SQL Server
奇怪的是,它沒有在試圖更新或刪除時拋出控制檯或任何其他錯誤 - 它只是失敗。
在創建時,會引發InvalidStatement錯誤,這可能與新行沒有分配適當的ID有關。他們得到一個空ID,當然它不允許作爲身份值。
有沒有人遇到過類似的東西?有關使用Extjs + SqlServer創建,更新或銷燬問題的解決方法的任何想法?
謝謝!
UPDATE:
自動增量設置上有問題的表的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:
上更新/ destroy,最初的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表刪除行一片空白。這當然失敗...
UPDATE3:
好了,我發現得到刪除操作的唯一方法是推出自己的SQL。用
替換@ admin.destroysql = 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
如何清除這件事有什麼想法?或者再說爲什麼它不會在第一時間開箱即用? :)
BUMP:
真的嗎?是得有人已經嘗試過這種...
你有一個異常喬的副本嗎?此外,請確保SQL Server中的Id列設置爲自動遞增身份字段...如果不是,那可能是您的問題。 – wgpubs 2009-08-19 17:57:53
它絕對設置爲自動遞增... – 2009-08-19 21:03:12
男人......所有這些解決方法*不應該被需要。就我個人而言,我從來沒有將Rails應用程序連接到SQL Server數據庫,所以也許它的連接提供者?出於好奇,你的設置是什麼樣子的?您的Rails應用程序是否也在Windows上運行? – wgpubs 2009-08-24 21:40:17