2011-06-13 63 views
11

我正尝试使用Windows身份验证连接到Microsoft SQl Server 2008数据库。 我已经下载了MS SQL Server的JDBC驱动程序,并将其添加到我的CLASSPATH中。使用Clojure连接到Microsoft SQL Server

以下是我的clojure代码。无论我做什么,我得到java.sql.SQLException中:找到了JDBC没有合适的驱动程序:SQLSERVER

(ns Test) 
(def db {:classname "com.microsoft.jdbc.sqlserver.SQLServerDriver" 
       :subprotocol "sqlserver" 
       :subname "server_name" 
       :DatabaseName "database_name" 
       :integratedSecurity true 
}) 

(use 'clojure.contrib.sql) 
(with-connection db 
     (with-query-results rs ["SELECT * FROM sys.objects"] (prn rs))) 

我核实,我对数据库的访问,我的类路径是正确的,我有正确的JDBC版本下载。有人能帮助我吗?

在此先感谢

+0

会发生什么情况是代码被转换为Java? – krzysz00 2011-06-13 13:05:56

回答

8

找到了解决办法

(use 'clojure.contrib.sql) 
    (def db {:classname "com.microsoft.sqlserver.jdbc.SQLServerDriver" 
        :subprotocol "sqlserver" 
        :subname "//server-name:port;database=database-name;user=sql-authentication-user-name;password=password" 
    }) 

    ;Add Classpath to your C:\Program Files\Java\JDBC\sqljdbc_3.0\enu\sqljdbc4.jar 
    ;Below code demos how to execute a simple sql select query and print it to console 
    ;This query will print all the user tables in your MS SQL Server Database 
    (with-connection db 
      (with-query-results rs ["select * from sys.objects where type = 'U'"] 
       (doseq [row rs] (println (:name row))) 
    )) 

还更新了维基http://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples#Microsoft_SQL_Server

希望这会帮助别人

+1

请注意,clojure.contrib.sql已停用(截至2011年中),并由clojure.java.jdbc取代,如Alexey的答案所示。 – 2016-07-31 01:44:23

10

连接到数据库

在后面软件版本(Cl ojure 1.6+,Microsoft SQL Server 2012和SQL Server的Microsoft JDBC驱动程序4.0)Ash发布的代码仅适用于这些修改。我也根据我目前对Clojure代码样式指导的知识对其进行了更新。

(require '[clojure.java.jdbc :as jdbc]) 
;; you can optionally specify :host and :port to override the defaults 
;; of "127.0.0.1" and 1433 respectively: 
(def db-spec {:dbtype "mssql" 
       :dbname "database-name" 
       :user "sql-authentication-user-name" 
       :password "password"}) 

(let [rows (jdbc/query db-spec 
         ["select * from sys.objects where type = 'U'"])] 
    (doseq [row rows] (println (:name row))))) 

在同一台计算机上有多个SQL Server实例的情况下,你可以指定实例名称作为:host像这样的部分(本例中是SQL Server Express的对同一默认实例名机):

:host "localhost\\sqlexpress" 

配置Leiningen

为了让Leiningen与微软的JDBC驱动程序正常工作,合并与project.clj defproject如下:

:dependencies [[org.clojure/java.jdbc "0.6.1"] 
       [com.microsoft.sqlserver/mssql-jdbc "6.3.6.jre8-preview"]] 
+0

我需要手动将类路径添加到'project.clj'中,如下所示:':resource-paths [“C:/ Program Files/Java/JDBC/sqljdbc_4.1/enu/sqljdbc41.jar”]' – jocull 2014-12-07 13:56:03

+0

其他注意事项':subname'中的前导'//'很重要。没有它,JDBC连接字符串以令人困惑的方式破坏。 – jocull 2014-12-07 13:56:44

+0

@jocull感谢在':subname'中强调'//'的重要性。关于这个项目。不知何故,在我的情况下,它是工作,而无需手动添加类路径。 – Alexey 2014-12-07 19:23:53