所以我在 Rails 2.3.3 之上针对 SQL Server DB 运行 Extjs。我能够从数据库中提取数据并显示它,但我无法创建、更新或销毁。
奇怪的是,它不会在尝试更新或删除时抛出控制台或任何其他错误——它只是失败了。
在创建时,会抛出 InvalidStatement 错误,这可能与未为新行分配适当 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,它可以正常工作...
更新2:
在更新/销毁时,初始 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 的行。哪个当然失败...
更新3:
好的,所以我发现让删除操作起作用的唯一方法是滚动我自己的 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
按预期执行操作。
更新4:
这也有效:
Administrators.delete(params[:id])
更新5:
好的,现在 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
关于如何清理这个的任何想法?或者为什么它一开始就不能开箱即用?:)
撞:
真的吗?一定有人试过这个...