1

所以我在 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

关于如何清理这个的任何想法?或者为什么它一开始就不能开箱即用?:)

撞:

真的吗?一定有人试过这个...

4

1 回答 1

1

这不是这个问题的好答案,但我认为这是底线:

  • 不要使用 MS SQL、Extjs 和 Rails,除非你想浪费时间和金钱试图让他们合作。请改用 MySQL 或 PostGRE。
于 2009-08-27T15:52:32.437 回答