Ruby on Rails
HowtoConnettersiASQLServer

Queste istruzioni sono pertinenti alla connessione da un computer Windows. Se avete bisogno di connettervi da un computer non Windows, seguite queste istruzioni: HowtoConnettersiAMicrosoftSQLServerDaRailsSuLinux. For OSX using iODBC see HowtoConnettersiAMicrosoftSQLServerDaRailsSuOSX.

Prendete i sorgenti dell’ultima distribuzione di Ruby-DBI da: http://rubyforge.org/projects/ruby-dbi/ e copiate il file:

src/lib/dbd_ado/ADO.rb

in:

X:/ruby/lib/ruby/site_ruby/1.8/DBD/ADO/ADO.rb 

(avrete bisogno di creare la directory ADO).

Poi semplicemente impostate il vostro file railsapp/config/database.yml

Qui c’è il mio come riferimento:

development:
  adapter: sqlserver
  database: database_name
  host: DBI:ADO:Provider=SQLOLEDB;Data Source=server_name;Initial Catalog=database_name;User Id=user_name;Password=your_pw_here;
  username: user_name
  password: your_pw_here

E dovrebbe essere fatta!

Nota Bene: Sulle ultime versioni dovrebbe essere qualcosa di simile a questo:

development:
  adapter: sqlserver
  database: database_name
  host: server_name
  username: user_name
  password: your_pw_here

Se il database server è in esecuzione sulla stessa macchina di Rails, potete utilizzare il punto (‘.’) come nome host.

Nota Bene: Utilizzate questo se il vostro SQL Server è in esecuzione su una porta diversa da quella standard:

development:
  adapter: sqlserver
  database: database_name
  host: server_name,5555
  username: user_name
  password: your_pw_here

Fare in modo che i task di Rake per i databases funzionino(yawn)

Aggiungete '<Drive>\<ProgramFolder>\Microsoft SQL Server\MSSQL\Upgrade' alla vostra variabile d’ambiente PATH – questo rende accessibili scptxfr.exe etc. a Rake.

Rendere tutto minuscolo (di RonLusk)

Poichè i nostri SQL Servers sono pieni di nomi di campi con maiuscole e minuscole, Ho giocato un pò con sqlserver_adapter.rb (trovato in – x:\Ruby\lib\ruby\gems\1.8\gems\activerecord-1.10.1\lib\activerecord\connection_adapters\sqlserver_adapter.rb)_ per rendere tutti minuscoli i nomi delle colonne. Nel metodo columns(table_name, name=nil), ed ho modificato


  SELECT COLUMN_NAME as...

in

  SELECT LOWER(COLUMN_NAME) as...

(intorno alla linea 178), e nel metodo privato select(sql, name, @connection) che ha una linea

  record[col] = row[col]

l’ho fatta diventare

  record[col.downcase] = row[col]

Ora tutti gli attributi appaiono minuscoli, e non ricevo più i messaggi “that’s a constant!” (è una costante!) da ruby o dai miei occhi.
Nota Bene: Ho anche dovuto modificare il metodo cast_to_time per lavorare con le date che sono precedenti al 1970, ma è un caso speciale per questo database, forse.

Evitare il problema \NoMethodError

Dovete modificare il file x:\Ruby\lib\ruby\gems\1.8\gems\activerecord-1.10.1\lib\active_record\connection_adapters\sqlserver_adapter.rb altrimenti continuerete sempre a ricevere un errore \NoMethodError quando provate a fare qualcosa di semplice come una SELECT su una tabella del vostro database.

I dettagli della modifica sono qui – http://dev.rubyonrails.org/ticket/1160 – dovrete tagliare e incollare il codice nel file sopracitato sqlserver_adapter.rb.

Questo è stato risolto nelle ultime versioni di activerecord.

Prime esperienze con SQLServer 2005 Beta 2

La modifica maggiore (a parte quella menzionata precedentemente) era quella di modificare il file sqlserver_adapter.rb per forzarlo ad usare il nuovo nome provider ‘SQLNCLI’ invece di ‘SQLOLEDB’. Una cosa differente rispetto a quello detto prima è che non specifico più la stringa di connessione nel parametro host del file database.yml, specifico solamente il nome della macchina che ospita il database server. Ho provato a specificare la stringa di connessione nell’host e non sembra funzionare. Quantomeno ora sono pronto all’opera ora. :)

Io ho utilizzato un approccio differente nel file database.yml, ho aggiunto un provider:

development:
adapter: sqlserver
database: database
username: user
password: pwd
host: .\SQLEXPRESS
mode: DBI:ADO
provider: SQLNCLI

e nel file sqlserver_adapter.rb ho aggiunto
provider    = config[:provider] ? config[:provider].to_s : ‘SQLOLEDB

ed ho modificato la linea 39 in:
driver_url = “DBI:ADO:Provider=#{provider};Data Source=#{host};Initial Catalog=#{database};User Id=#{username};Password=#{password};”

e sta funzionando bene.

Altre prime esperienze con SQL Server 2005 versione finale

Il task sql server di rails 1.0 utilizza un eseguile “scptxfr.exe” che non è distribuito con la versione 2005. Comunque, se avete un 7.0/2000 installato da qualche parte, sono stato in grado di utilizzare una versione precedente di “scptxfr.exe” (con le sue dipendenze sqlresld.dll e Resources\1033\scptxfr.dll) con il mio SQL Server 2005 (li ho messi in rails_app/db/tools così da non metterli da qualche parte nelle directory sotto Programmi) ed ora rails 1.0/SQL Server 2005 final funzionano graziosamente

Oltre al “scptxfr.exe”, non ho fatto alcuna altra modifica (a parte installare ADO.rb).

Come fare per utilizzare la Trusted Security

Andate nel file sqlserver_adapter.rb, e modificate:


conn = DBI.connect("DBI:ADO:Provider=SQLOLEDB;Data Source=#{host};Initial Catalog=#{database};User Id=#{username};Password=#{password};")

togliete: User Id=#{username};Password=#{password};
aggiungete: Integrated Security=SSPI;


      conn = DBI.connect("DBI:ADO:Provider=SQLOLEDB;Data Source=#{host};Initial Catalog=#{database};Integrated Security=SSPI")

Ovviamente, avete bisogno di assicurarvi che l’account dell’utente con cui sta girando webbrick, Apache, IIS, etc. abbia i privilegi Windows in quel particolare database.

Idealmente, sarebbe carino fare una modifica per permettere di inserire qualcosa del genere nel database.yml:

development
  adapter: sqlserver
  database: nomomysql
  host: nomoora
  trusted_connection: true
  ...and any other extended OLEDB flags to pass to this driver as well

e fare in modo che sqlserver_adapter.rb costruisca correttamente la stringa di connessione appropriata.

Come risolvere db_schema_dump e le stored procedures

Se ricevete errori come:

DBI::DatabaseError: Count
    OLE error code:8000FFFF in Microsoft OLE DB Provider for SQL Server
      ITransaction::Commit or ITransaction::Abort was called, and object is in a
 zombie state.
    HRESULT error code:0x80020009
      Exception occurred.: EXEC sp_helpindex MyTable

Avrete bisogno di disabilitare la funzionalità DBI AutoCommit. Alla fine del file environment.rb potete aggiungere:

ActiveRecord::Base.connection.instance_variable_get("@connection")["AutoCommit"] = false

Questione relativa alla soluzione precedente

Grazie per aver inviato questa soluzione, funziona!

Comunque, questa impostazione ha conseguenze negative con altre operazioni che necessitano di commitare? Se fosse così, qual’è il codice che devo aggiungere ai miei programmi ruby?

Come risolvere l’errore “OLE error code:800A0E78”

Quando chiamate rake db:schema:dump su un database che contiene tabelle senza alcun indice otterrete questo tipo di errore:

# Could not dump table "Table" because of following DBI::DatabaseError
#   EOF
    OLE error code:800A0E78 in ADODB.Recordset
      Operation is not allowed when the object is closed.
    HRESULT error code:0x80020009
      Exception occurred.

La soluzione, come dice un messaggio del newsgroup:


Anche io ho riscontrato questo errore sulle tabelle senza indici (su tabelle di relazione create da versioni precedenti di Rails).
Per questo ho creato un indice univoco sulle sue chiavi e l’errore è sparito.

Saluti,
Karel

(Messaggio originale qui)