使用Clojure连接到Microsoft SQL Server

使用Clojure连接到Microsoft SQL Server,sql,sql-server,jdbc,clojure,Sql,Sql Server,Jdbc,Clojure,我正在尝试使用windows身份验证连接到Microsoft SQl Server 2008数据库。 我已经下载了MS SQL Server的JDBC驱动程序,并将其添加到我的类路径中 下面是我的clojure代码。无论我做什么,我都会得到java.sql.SQLException:没有找到适合jdbc:sqlserver的驱动程序 (ns Test) (def db {:classname "com.microsoft.jdbc.sqlserver.SQLServerDriver"

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

下面是我的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版本。有人能帮帮我吗

提前感谢

找到了解决方案

(使用“clojure.contrib.sql”)
(def db{:classname“com.microsoft.sqlserver.jdbc.SQLServerDriver”
:子目录“sqlserver”
:子名称“//服务器名称:端口;数据库=数据库名称;用户=sql身份验证用户名;密码=密码”
})
;将类路径添加到C:\ProgramFiles\Java\JDBC\sqljdbc_3.0\chs\sqljdbc4.jar
;下面的代码演示了如何执行简单的sql select查询并将其打印到控制台
;此查询将打印MS SQL Server数据库中的所有用户表
(带连接数据库)
(查询结果为rs[“从sys.objects中选择*type='U'”)
(doseq[行rs](println(:名称行)))
))
还更新了wiki

希望这将有助于某人连接到数据库 在更高版本的软件(Clojure 1.6+、Microsoft SQL Server 2012和Microsoft JDBC Driver 4.0 for SQL Server)中,Ash发布的代码仅在经过这些修改后才有效。我还根据我目前对Clojure代码样式指南的了解对其进行了更新

(需要“[clojure.java.jdbc:作为jdbc])
;; 您可以选择指定:主机和:端口以覆盖默认值
;; 分别为“127.0.0.1”和1433:
(def db规范{:dbtype“mssql”
:dbname“数据库名称”
:user“sql身份验证用户名”
:password“password”})
(let[行(jdbc/query db规范
[“从sys.objects中选择*,其中类型为'U'”)]
(doseq[行](println(:名称行()())))
在同一台计算机上有多个SQL Server实例的情况下,可以将实例名称指定为
:host
的一部分,如下所示(此示例用于同一台计算机上SQL Server Express的默认实例名称):

配置莱宁根 要使Leiningen与Microsoft JDBC驱动程序正常工作,请将以下内容与project.clj中的defproject合并:

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

前面的答案都是正确的,效果很好。然而,这个职位已经很老了,还有更好的选择。因此,我认为为寻找解决方案的人(就像我一样)更新帖子是有意义的

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

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

代码 雷宁根构型
注意:下载适合您jre版本的mssql jdbc驱动程序,并将其放在leiningen项目的resources文件夹中,或在
:dependencies[]中添加驱动程序的路径
在您的项目中.clj

发生的事情是代码被翻译成Java?只需添加这一点就可以使用
:integratedSecurity true
在Windows上,必须将sqljdbc_auth.dll添加到类路径(例如到/Resources文件夹中)和路径EnvI需要手动将我的类路径添加到
项目.clj
中,就像这样:
:资源路径[“C:/ProgramFiles/Java/JDBC/sqljdbc_4.1/enu/sqljdbc41.jar”]
另请注意,
:subname
中的前导
/
非常重要。没有它,JDBC连接字符串会以一种令人困惑的方式断开。我使用了一种似乎不那么麻烦的方式。我更新了答案,以显示
:dbtype
/
:dbname
如何使事情变得更简单--您不需要类名、子目录或子目录subname--以及使用db connection包装器删除不必要的
(仅当您想在一个连接中运行多个查询时才需要)。驱动程序现在可以从Maven获得,注意clojure.contrib.sql已经停止(从2011年年中开始)并替换为clojure.java.jdbc,如Alexey的回答所示。这是否意味着“将C:\Program Files\java\jdbc\sqljdbc\u 3.0\enu\sqljdbc4.jar添加到类路径中”?
:dependencies [[org.clojure/java.jdbc "0.6.1"]
               [com.microsoft.sqlserver/mssql-jdbc "6.3.6.jre8-preview"]]
(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"]]