知识若不分享 实在没有意义 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语句。
例子:
代码
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 )
代码
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为大家提供一个学习交流各种知识的平台