yidabu 2007-4-27 19:36
D的数据库接口DDBI
D的数据库接口DDBI知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070427点击下面网址查看原文:http://www.d-programming-language-china.org by: ideage from: http://ideage.javaeye.com/blog/34553 所有的程序都可能访问数据库。为了让D兼容其他语言开发的数据库接口,并为开发者提供统一的访问形式,DDBI应运而生。 DDBI 包含几个核心的 类,包装了数据库的基本操作。 Row 包含了多个列的一个行。允许使用索引和列名访问行的数据。 Database 提供了一个抽象的数据库封装,包含了连接,执行Sql语句,返回行的函数。 Result 管理一个从数据库返回的结果集,返回多个Row。 statement 实现了动态参数构建sql语句的类,可以执行sql语句。 例子: 代码 [Copy to clipboard] [ - ]CODE: import dbi.sqlite.SqliteDatabase; import std.stdio; void main() { SqliteDatabase db = new SqliteDatabase(); db.connect("test.db"); Row[] rows = db.queryFetchAll("SELECT * FROM names"); foreach (Row row; rows) { writefln("name: %s\nzip: %s\n", row["name"], row["zip"]); } db.close(); } 经过我的测试,sqlite兼容性最好。其次是mysql。现在我就一直在用Sqlite。目前的版本还很低,她的论坛也一直在讨论Row的新版本。 网站http://dsource.org/projects/ddbi 论坛http://www.dsource.org/forums/viewforum.php?f=60 SVN http://svn.dsource.org/projects/ddbi/trunk/ ideage 2006-12-26 10:30( 本文出处: http://www.d-programming-language-china.org ) 代码 [Copy to clipboard] [ - ]CODE: module testdbi; import dbi.all; import dbi.mysql.all; import std.stdio; import std.c.stdio; import std.file; void main(char[][] args) { // PgDatabase db = new PgDatabase(); MysqlDatabase db = new MysqlDatabase(); db.connect("dbname=test","test1","abc"); writefln("\ndump ..."); Row[] rows; try{ rows = db.queryFetchAll("select ID,CITY from sample2"); } catch(Object e) { printf("SysEROR: %.*s\n", e.toString()); } foreach (Row row; rows) { writefln("ID: %s CITY: %s", row["ID"], row["CITY"]); } db.close(); writefln("\npress ENTER key to continue"); std.c.stdio.getchar(); } 闹海金蛟 2007-02-24 17:57 你是怎么编译的DDBI的呀,为什么我编译时会出现错误提示呢? 闹海金蛟 2007-02-24 18:08 错误提示: :: Symbol Undefined _D3dbi5mysql13MysqlDatabase13MysqlDatabase7__ClassZ :: Symbol Undefined _D3dbi5mysql13MysqlDatabase13MysqlDatabase5_ctorMFZC3dbi5mysql13MysqlDatabase13MysqlDatabase :: Symbol Undefined _D3dbi8Database8Database13queryFetchAllMFAaZAC3dbi3Row3Row :: Symbol Undefined _D3dbi3Row3Row7opIndexMFAaZAa :: === Build finished: 4 errors, 0 warnings === ideage 2007-02-25 12:10 用implib 生成一个libmysql.lib 闹海金蛟 2007-02-26 09:00 刚刚接触D,能说得详细一点吗?( 本文出处: http://www.d-programming-language-china.org ) tomqyp 2007-02-28 00:01 用implib 生成一个libmysql.lib后 objs\MysqlDatabase.obj(MysqlDatabase) Error 42: Symbol Undefined _mysql_real_connect objs\MysqlDatabase.obj(MysqlDatabase) Error 42: Symbol Undefined _mysql_errno ............. 后来在mysqlclient.lib找到这些函数,可mysqlclient.lib是coff格式的 请教一下你怎么编译出来的呢 ideage 2007-02-28 23:18 1. implib /s libmysql.lib libmysql.dll 使用加S的开关. 2.下载最新版本的DDBI. 3. dmd -run builddbi.d mssql 就可以了. tomqyp 2007-03-02 03:00 谢谢 终于编译出来了 不地运行时 提示 Access Violation 这个是mysql的问题吗 tomqyp 2007-03-02 03:18 刚在DDBI论坛上看到你Access Violation问题的贴子了,不过我英文不好看不大明折,能说说是怎么解决的吗?( 本文出处: http://www.d-programming-language-china.org ) ideage 2007-03-02 11:34 和数据库的数据有关系,如果是空格数据或者是空就会发生.使用writefln就没有问题,用printf就错误. 当时的版本已经修复了我的问题. 最近不使用DDBI了. 不如用C访问,封装DLL方便. ideage 2007-03-02 17:24 下载个2.4版本的.别用Tango.再试试. tomqyp 2007-03-02 17:35 跟你的情况有点不同,我的在调用mysql_fetch_row时就Access Violation了( 本文出处: http://www.d-programming-language-china.org ) tomqyp 2007-03-02 17:40 闹海金蛟你用用build.exe编译试试,或者tango带了一个工具jake应该跟build差不多,我用dmd编译也有你说的情况。( 本文出处: http://www.d-programming-language-china.org ) 闹海金蛟 2007-03-02 18:35 D:\tags\0.2.4>build buildme.d Error: 4invalid UTF-8 sequence 这是2.4版 闹海金蛟 2007-03-02 18:39 :: Symbol Undefined _D3dbi5mysql13MysqlDatabase13MysqlDatabase7__ClassZ :: Symbol Undefined _D3dbi5mysql13MysqlDatabase13MysqlDatabase5_ctorMFZC3dbi5mysql13MysqlDatabase13MysqlDatabase :: Symbol Undefined _D3dbi8Database8Database13queryFetchAllMFAaZAC3dbi3Row3Row :: Symbol Undefined _D3dbi3Row3Row7opIndexMFAaZAa :: === Build finished: 4 errors, 0 warnings === 这是在codeblocks里面编译的结果,请问第一页说的用libmysql.lib怎么加到里面( 本文出处: http://www.d-programming-language-china.org ) tomqyp 2007-03-02 23:25 我MSN很少用,加进libmysql.lib用-I你的路径\libmysql.lib codeblocks里 可能是Project->Build option->Linker setting 这里设置 ideage 2007-03-02 23:31 1.修改一下sc.ini 例如我的是: [Version] version=7.51 Build 020 [Environment] LIB="%@P%\..\lib";\dm\lib DFLAGS="-I%@P%\..\src\phobos;D:\D\dmd\import" LINKCMD=%@P%\..\..\dm\bin\link.exe 2.先编译库. 例如编译sqlite,使用implib和sqlite3.dll生成一个 sqllite3.lib 使用 dmd -run builddbi.d sqlite 编译生成dbi.lib 3.再编译应用程序.引用dbi.lib,sqllite3.lib dmd test.d dbi.lib sqllite3.lib -I..( 本文出处: http://www.d-programming-language-china.org ) 闹海金蛟 2007-03-03 09:14 我的sc.ini [Version] version=7.51 Build 020 [Environment] LIB="%@P%\..\lib";\dm\lib;D:\ProgramFiles\D\lib DFLAGS="-I%@P%\..\src\phobos;D:\ProgramFiles\D\OpenSource" LINKCMD=%@P%\..\..\dm\bin\link.exe 其中,libmysql.lib libmysql.dll sqlite3.lib sqlite3.dll都是在D:\ProgramFiles\D\lib这个目录下,D:\ProgramFiles\D\OpenSource下有dbi(2.4)tango等目录, 我可以成功生成libmysql.lib sqlite3.lib文件,但 dmd -run buildme.d sqlite 编译生成dbi.lib (buildme.d是不是就是你写的builddbi.d?)时,会提示 D:\tags\0.2.4\trunk>dmd -run buildme.d sqlite3 Error: 4invalid UTF-8 sequence 我已经用了2.4版的dbi了. 而在codeblocks里面,我也已经把sqlite3.lib libmysql.lib都引进来了,并且加了一句import dbi.all;因为sqlite3的例子说是没有定义row,codeblocks提示如下 :: Symbol Undefined _D3dbi6sqlite14SqliteDatabase14SqliteDatabase7__ClassZ :: Symbol Undefined _D3dbi6sqlite14SqliteDatabase14SqliteDatabase5_ctorMFZC3dbi6sqlite14SqliteDatabase14SqliteDatabase :: Symbol Undefined _D3dbi8Database8Database13queryFetchAllMFAaZAC3dbi3Row3Row :: Symbol Undefined _D3dbi3Row3Row7opIndexMFAaZAa :: === Build finished: 4 errors, 0 warnings === 跟mysql的错误差不多嘛. (既然sc.ini已经指定了dbi的路径,codeblock里面应该不用先编译dbi.lib吧?可以直接引用dbi里面的东西嘛?)( 本文出处: http://www.d-programming-language-china.org ) ideage 2007-03-03 15:18 D:\tags\0.2.4\trunk>dmd -run buildme.d sqlite3 不对. 应该 D:\ProgramFiles\D\OpenSource>dmd buildme.d sqlite 没有3.把tags下的文件复制到opensource下.再试试. tomqyp 2007-03-03 23:03 ideage我编译通过了,但是执行程序时出现Access Violation 我参照你在DDBI论坛里的办法,找到是调用mysql_fetch_row函数时就会Access Violation 但是不知道是什么原因( 本文出处: http://www.d-programming-language-china.org ) ideage 2007-03-03 23:54 to tomqyp: 原因可能是: 1.和数据库的数据有关系,数据可能是空. 2.printf和writefln有BUG. 闹海金蛟 2007-03-06 19:31 D:\tags\0.2.4>dmd -run buildme.d sqlite Error: 4invalid UTF-8 sequence 続行するには何かキーを押してください . . . D:\tags\0.2.4> tomqyp 2007-03-06 22:24 你用的是tango还是phobos看看buildme所用到的一些库是不是在中文目录里面( lastupdate:20070427 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台