1

因此,我在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.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 

如何清除這件事有什麼想法?或者再說爲什麼它不會在第一時間開箱即用? :)

BUMP:

真的嗎?是得有人已經嘗試過這種...

+0

你有一個異常喬的副本嗎?此外,請確保SQL Server中的Id列設置爲自動遞增身份字段...如果不是,那可能是您的問題。 – wgpubs 2009-08-19 17:57:53

+0

它絕對設置爲自動遞增... – 2009-08-19 21:03:12

+0

男人......所有這些解決方法*不應該被需要。就我個人而言,我從來沒有將Rails應用程序連接到SQL Server數據庫,所以也許它的連接提供者?出於好奇,你的設置是什麼樣子的?您的Rails應用程序是否也在Windows上運行? – wgpubs 2009-08-24 21:40:17

回答

1

這是不是一個偉大的回答這個問題,但我認爲這是底線:

  • 不要使用MS SQL,ExtJS的和Rails,除非你感覺像燃燒時間和金錢試圖讓他們合作。嘗試使用MySQL或PostGRE。