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。