그래서 SQLServer DB에 대해 레일즈 2.3.3 위에서 Extjs를 실행하고 있습니다. DB에서 데이터를 가져 와서 표시 할 수 있지만 만들거나 업데이트하거나 파기 할 수 없습니다.Rails, Extjs 및 SQL Server
이상하게도 콘솔이나 다른 업데이트 시도 또는 시도 오류가 발생하지 않습니다. 단순히 실패합니다.
생성시 InvalidStatement 오류가 발생합니다. 새 행에 적절한 ID가 할당되지 않았을 가능성과 관련이 있습니다. 그들은 null ID를 할당 받고 있고 물론 ID 값으로 허용되지 않습니다.
아무도 비슷한 문제가 발생 했습니까? Extjs + SqlServer를 사용하여 작성, 업데이트 또는 삭제하는 문제에 대한 해결 방법에 대한 아이디어가 있습니까?
감사합니다.
UPDATE :
자동 증가가 문제의 테이블의 ID 필드에 설정됩니다. 난 특정 오류 다시 넘겨지고 : 나는 디버거를 열고 수동으로 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 ...
주 ...
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가 테이블에서 행을 삭제하려고 시도 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
으로 작업을 수행하십시오.
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 :
정말요? 누군가는
Joe의 예외 사본이 있습니까? 또한 SQL Server의 Id 열이 자동 증분 ID 필드로 설정되어 있는지 확인하십시오. 그렇지 않은 경우 문제가있을 수 있습니다. – wgpubs
확실히 자동 증가로 설정되어 있습니다 ... –
남자 ... 모든 해결 방법 * 필요하지 않습니다. 개인적으로 필자는 Rails 응용 프로그램을 SQL Server 데이터베이스에 연결하지 않았으므로 아마도 연결 제공자일까요? 호기심에서 당신의 설정은 어떻게 생겼습니까? Rails 응용 프로그램이 Windows 상자에서도 실행됩니까? – wgpubs