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
Aggiungete '<Drive>\<ProgramFolder>\Microsoft SQL Server\MSSQL\Upgrade' alla vostra variabile d’ambiente PATH – questo rende accessibili scptxfr.exe etc. a Rake.
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...
SELECT LOWER(COLUMN_NAME) as...
select(sql, name, @connection) che ha una linea
record[col] = row[col]
record[col.downcase] = row[col]
cast_to_time per lavorare con le date che sono precedenti al 1970, ma è un caso speciale per questo database, forse.
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.
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
sqlserver_adapter.rb ho aggiuntoprovider = config[:provider] ? config[:provider].to_s : ‘SQLOLEDB’
driver_url = “DBI:ADO:Provider=#{provider};Data Source=#{host};Initial Catalog=#{database};User Id=#{username};Password=#{password};”
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).
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.
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
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?
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)