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