1

Also ich Extjs oben auf Rails 2.3.3 gegen eine SQL Server DB laufen. Ich bin in der Lage, Daten aus der DB zu ziehen und anzuzeigen, aber ich kann nicht erstellen, aktualisieren oder zerstören.Rails, Extjs und SQL Server

Seltsamerweise wirft es keine Konsole oder andere Fehler auf versuchte Updates oder löscht - es scheitert einfach.

Beim Erstellen wird ein InvalidStatement-Fehler ausgelöst, der wahrscheinlich damit zusammenhängt, dass neuen Zeilen keine passende ID zugewiesen wird. Ihnen wird eine Null-ID zugewiesen, und natürlich ist dies nicht als Identitätswert zulässig.

Hat jemand etwas Ähnliches gefunden? Irgendwelche Ideen zu Workarounds für die Probleme beim Erstellen, Aktualisieren oder Zerstören mit Extjs + SqlServer?

Danke!

UPDATE:

Auto-Zuwachs auf dem ID-Feld der Tabelle in Frage gestellt ist. Der genaue Fehler Ich bin immer wieder ausgehändigt:

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 ... 

Beachten Sie, dass, wenn ich den Debugger Pop öffnen und manuell in der ID hinzufügen, es funktioniert gut ...

UPDATE2:

On-Update/destroy wird die anfängliche POST-Anfrage mit den richtigen (modifizierten) Felddaten erstellt und eine erfolgreiche Antwort wird angezeigt. Die Aktualisierungsdaten werden jedoch nicht in der nachfolgenden GET-Anforderung wiedergegeben.

Digging in den Protokollen, so finden wir die SQL auf Update generiert das folgende Problem hat:

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 

Ein ähnliches Problem ist die Anfragen zerstören plagen.

Was geht hier vor? Wie/warum wird die ID zwischen dem Ziehen des entsprechenden Datensatzes und dem Ausführen der Operation auf Null gesetzt?

Hinweis, dass dies das Verhalten, auch wenn ich diese Operation in dem Debugger manuell durchführen, dh

(rdb:63) Administratiors.find(2).destroy 

wählt die entsprechende Reihe auf ID basiert, aber versucht dann, die Zeile aus der Tabelle, deren ID zu löschen ist Null. Was natürlich nicht ...

UPDATE3:

OK, so dass der einzige Weg, die ich gefunden habe, den Löschvorgang zu erhalten ist, zu arbeiten, um meine eigene SQL zu rollen. Ersetzen von @ admin.destroy mit

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 

führt die Operation wie erwartet aus.

Update4:

Dies funktioniert auch:

Administrators.delete(params[:id]) 

UPDATE5:

Okay, so funktioniert nun CRUD zwischen ExtJS und SQL-Server.Aber es ist eine hässliche Hack (die Update-Operation vor allem) und ich würde einen Einblick lieben, wie dies zu tun, sauber:

# 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 

Irgendwelche Gedanken darüber, wie dies zu bereinigen? Oder noch einmal, warum es nicht von Anfang an funktionieren würde? :)

BUMP:

Wirklich? Jemand muss dies versucht zu haben ...

+0

Haben Sie eine Kopie der Ausnahme Joe? Stellen Sie außerdem sicher, dass die ID-Spalte in SQL Server als automatisch inkrementierendes Identitätsfeld eingerichtet ist. Ist dies nicht der Fall, könnte dies Ihr Problem sein. – wgpubs

+0

Es ist definitiv auf automatisch inkrementieren ... –

+0

Man ... all diese Workarounds * sollte nicht * benötigt werden. Persönlich habe ich noch nie eine Rails-App an eine SQL Server-Datenbank angeschlossen, vielleicht ist es der Verbindungsanbieter? Wie sieht Ihre Einstellung aus Neugier aus? Läuft Ihre Rails-App auch auf einer Windows-Box? – wgpubs

Antwort

1

Dies ist keine große Antwort auf diese Frage, aber ich denke, es ist das Endergebnis:

  • Sie MS SQL, ExtJS und Rails nicht verwenden, es sei denn, Sie fühle mich wie brennende Zeit und Geld, um sie dazu zu bringen zusammenzuarbeiten. Versuchen Sie stattdessen MySQL oder PostGRE.