使用Clojure连接到Microsoft SQL Server

时间:2011-06-13 12:55:58

标签: sql sql-server jdbc clojure

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

下面是我的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版本。有人可以帮助我。

提前致谢

3 个答案:

答案 0 :(得分:14)

连接数据库

在后来的软件版本(Clojure 1.6 +,Microsoft SQL Server 2012和Microsoft JDBC驱动程序4.0 for SQL Server)中,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与Microsoft JDBC Driver一起正常工作,请将以下内容与project.clj中的defproject合并:

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

答案 1 :(得分:9)

找到解决方案

(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

希望这会帮助某人

答案 2 :(得分:0)

所有先前的答案都是正确的,并且工作正常。但是,该职位已经很老了,还有更好的选择。因此,我认为为正在寻找解决方案的人们更新帖子(像我一样)。

事实证明clojure.java.jdbc 是“稳定的”(不再是“活动的”)。实际上,它已被 seancorfield/next.jdbc取代。

使用next.jdbc非常简单,可以在项目页面https://github.com/seancorfield/next-jdbc中找到更多信息:

代码

(require '[next.jdbc :as jdbc])
(def db {:dbtype "mssql"
         :dbname "database-name"
         :host "host" ;;optional
         :port "port" ;;optional
         :user "sql-authentication-user-name"
         :password "password"})
(def con (jdbc/get-connection db))
(jdbc/execute! con ["select * from sys.objects  where type = 'U'"])

莱宁根配置

:dependencies [[seancorfield/next.jdbc "1.0.10"]]
               [com.microsoft.sqlserver/mssql-jdbc "7.4.1.jre11"]]

注意:下载适合您的jre版本的mssql-jdbc驱动程序,并将其放置在leiningen项目的resources文件夹中,或者在您的:dependencies [<path-here>]中添加该驱动程序的路径project.clj