1

Donc, je cours Extjs au-dessus de Rails 2.3.3 contre une base de données SQL Server. Je suis capable de tirer des données de la base de données et de l'afficher, mais je suis incapable de créer, mettre à jour ou détruire. Assez curieusement, il ne lance pas de console ou d'autres erreurs sur les tentatives de mises à jour ou de suppressions - il échoue simplement.Rails, Extjs et SQL Server

Lors de la création, une erreur InvalidStatement est renvoyée, probablement liée au fait que les nouvelles lignes ne reçoivent pas d'ID approprié. Ils reçoivent un ID nul, et bien sûr, ce n'est pas autorisé comme valeur d'identité.

Est-ce que quelqu'un a rencontré quelque chose de similaire? Des idées sur les solutions de contournement pour les problèmes sur créer, mettre à jour ou détruire en utilisant Extjs + SqlServer?

Merci!

MISE À JOUR:

Auto-incrément est défini sur le champ ID de la table en question. L'erreur spécifique que je suis en train de revenir remis:

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

Notez que si je pop ouvrir le débogueur et ajouter l'ID manuellement, il fonctionne très bien ...

MAJ2:

Mise à jour à/destroy, la requête POST initiale est construite avec les données de champ correctes (modifiées) et une réponse réussie est affichée. Toutefois, les données de mise à jour ne sont pas reflétées dans la demande GET suivante.

Creuser dans les journaux, nous trouvons le SQL généré sur la mise à jour a la question suivante:

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 

Un problème similaire est qui sévit dans le destroy demandes.

Que se passe-t-il ici? Comment/pourquoi l'identifiant est-il défini sur null entre l'extraction de l'enregistrement approprié et l'exécution de l'opération?

Notez que ceci est le comportement même quand j'effectuer manuellement cette opération dans le débogueur, à savoir,

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

sélectionne la ligne appropriée en fonction de l'ID, mais tente alors de supprimer la ligne de la table dont l'id est NULL. Ce qui bien sûr échoue ...

Update3:

OK, la seule façon que j'ai trouvé pour obtenir l'opération de suppression de travail est de lancer ma propre SQL. Le remplacement de @ admin.destroy par

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 

effectue l'opération comme prévu.

Update4:

Cela fonctionne aussi:

Administrators.delete(params[:id]) 

Mise à jour5:

Bon, maintenant fonctionne CRUD entre Extjs et le serveur SQL.Mais il est une bidouille horrible (l'opération de mise à jour en particulier) et j'aimerais une idée sur la façon de le faire plus proprement:

# 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 

Toute réflexion sur la façon de nettoyer ça? Ou encore pourquoi cela ne fonctionnerait pas hors de la boîte en premier lieu? :)

BUMP:

Vraiment? Quelqu'un doit avoir essayé ...

+0

Avez-vous une copie de l'exception Joe? Assurez-vous également que la colonne Id dans SQL Server est configurée en tant que champ d'identité à incrémentation automatique ... si ce n'est pas le cas, cela peut être votre problème ici. – wgpubs

+0

Il est définitivement configuré pour l'auto-incrémentation ... –

+0

man ... toutes ces solutions de contournement * ne devraient pas être nécessaires. Personnellement, je n'ai jamais connecté une application Rails à une base de données SQL Server alors peut-être que c'est le fournisseur de connexion? Par curiosité, à quoi ressemble votre configuration? Votre application Rails fonctionne-t-elle également sur une machine Windows? – wgpubs

Répondre

1

Ce n'est pas une grande réponse à cette question, mais je pense que c'est la ligne de fond:

  • Ne pas utiliser MS SQL, Extjs et Rails, à moins que vous avoir envie de brûler du temps et de l'argent en essayant de les amener à coopérer. Essayez plutôt MySQL ou PostGRE.