- 浏览: 23776 次
- 性别:
- 来自: 东莞
最新评论
-
flythink:
oledb是不是更容易弄一些? 纯猜测
MS ODBC for DMD 2.053 -
hqs7636:
8错,继续完善一下。。。
MS ODBC for DMD 2.053 -
rocex:
lz的这个工具好用,可以随时在1.x和2.x上切换。
DEx ...
D2/Phobos与D2/Tango一键切换编译环境设置 -
Colorful:
链接是这个 : http://code.google.com/ ...
Windows D编程类封装初步学习并请教 -
betty_betty2008:
哥们:链接打不开
Windows D编程类封装初步学习并请教
东拼西凑,终于在dmd2.053下成功连接上了ODBC 数据库(ACCESS)。代码还很不完善,慢慢再补。参数化查询函数(如bind)还没有,通过连接字符串和变量来组成查询语句进行查询是可以的,中文以及字段值为转义字符嵌套的字符串也支持。
所需的sql头文件来自D bindings--win32包。
已知问题:不建立DSN直接用字符串连接还不行,不知道是什么原因,个人XP下和公司WIN7下都试过,看来是非权限问题,不知API调用上有什么问题。有人知道的话,麻烦告诉俺,谢谢了。
类封装只有一个文件odbcutil.d,先看一段客户代码:
odbcutiltest.d
odbcutil.d
所需的sql头文件来自D bindings--win32包。
已知问题:不建立DSN直接用字符串连接还不行,不知道是什么原因,个人XP下和公司WIN7下都试过,看来是非权限问题,不知API调用上有什么问题。有人知道的话,麻烦告诉俺,谢谢了。
类封装只有一个文件odbcutil.d,先看一段客户代码:
odbcutiltest.d
module odbcutiltest; import std.stdio; import std.string; import std.conv; import odbcutil; int main() { Odbc odbc=new Odbc; //connect ODBC without setting up a DSN does not work at current. //odbc.connect("Driver= {Microsoft Access Driver(*.mdb)};DBQ=C:/Personnal/language/DLang/dbi_7zfromWeb/dbiallsamples/db1.mdb;"); //dsn :odbcartist;table :artists.mdb;user id="",passwd="" odbc.connect("odbcartist","",""); if(!odbc.isOpen) throw new Exception("ODBC connection failed.exit."); auto table=odbc.fetchAll("select * from artists"); foreach(row;table) { foreach(column;row) { writef("%s\t",column); } write("\n"); } writeln("Read table successfully."); writeln("Insert a new record..."); write("Please enter artist ID:"); string id=chomp(readln); write("Please enter artist Name:"); string name=chomp(readln); string sql="insert into artists values("~id~",'"~name~"');"; int changed=odbc.executeNonQuery(sql); writefln("%d row affected.",changed); writeln("Done"); readln; return 0; }
odbcutil.d
//Orignial c++ implementation DBUtil.h //By 小E QQ592646022 //ported by Sam Hu //at Donguan,2011-5-20 15:04 module odbcutil; import std.stdio; import std.string; import std.conv; import std.c.string; import std.array; import win32.sql; import win32.sqlext; import win32.sqltypes; class Odbc { private: SQLHANDLE hEnv; SQLHANDLE hDbc; SQLHANDLE hStmt; SQLRETURN retCode; SQLINTEGER retErro; SQLINTEGER row; SQLSMALLINT col; bool bState; char* pszUName; char* pszUPassword; char* pszDSN; public: this() { bState=false; //row=col=0; retCode=SQLAllocHandle(SQL_HANDLE_ENV,cast(SQLHANDLE)null,&hEnv); if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return; } retCode=SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,cast(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER); if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLFreeHandle( SQL_HANDLE_DBC, hEnv ); return; } retCode=SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc); if((retCode!=SQL_SUCCESS)&& (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLFreeHandle( SQL_HANDLE_DBC, hEnv ); return; } } ~this() { close(); } bool connect(string dsn,string username,string passwd) { if(bState==false) { retCode=SQLConnect(hDbc,cast(SQLCHAR*)dsn.ptr,SQL_NTS,cast(SQLCHAR*) username.ptr,SQL_NTS,cast(SQLCHAR*)passwd.ptr,SQL_NTS); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLFreeHandle( SQL_HANDLE_DBC, hDbc ); return false; } retCode=SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLDisconnect( hDbc ); SQLFreeHandle( SQL_HANDLE_DBC, hDbc); return false; } } bState=true; return true; } //@@@bug:connect ODBC without DSN failed ,but I don't know why.If anybody know about it, //@@@kindly let me know with thanks!!!! bool connect(string connectionString) { SQLCHAR connStrOut[256]; SQLSMALLINT connStrOutLen; if(bState==false) { retCode=SQLDriverConnect(hDbc, null, cast(SQLCHAR*)connectionString.ptr, SQL_NTS, cast(ubyte*)connStrOut, connStrOut.length, &connStrOutLen, SQL_DRIVER_COMPLETE); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLFreeHandle( SQL_HANDLE_DBC, hDbc ); return false; } retCode=SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); SQLDisconnect( hDbc ); SQLFreeHandle( SQL_HANDLE_DBC, hDbc); return false; } } bState=true; return true; } /* string escape (string str) { char[] result; size_t count = 0; result.length = str.length * 2; for (size_t i = 0; i < str.length; i++) { switch (str[i]) { case '"': case '\'': case '\\': result[count++] = '\\'; break; default: break; } result[count++] = str[i]; } result.length = count; return std.conv.to!string(result); } */ int executeQuery(const char* pszSql) { if(pszSql is null ) return 0; writefln("hStmt=%s",cast(int)hStmt); retCode=SQLExecDirect(hStmt,cast(SQLCHAR*)pszSql,SQL_NTS); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return -1; } retCode=SQLNumResultCols(hStmt,&col); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return -1; } row=0; while(SQL_NO_DATA!=SQLFetch(hStmt)) { row++; } SQLCancel(hStmt); return rowCount; } int executeQuery(string sql) { return executeQuery(sql.ptr); } int executeNonQuery(const char* pszSql) { row=0; if(pszSql is null ) return 0; retCode=SQLExecDirect(hStmt,cast(SQLCHAR*)pszSql,SQL_NTS); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return -1; } retCode=SQLRowCount(hStmt,&row); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return -1; } retCode=SQLNumResultCols(hStmt,&col); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return -1; } SQLCancel(hStmt); return row; } int executeNonQuery(string sql) { return executeNonQuery(sql.ptr); } string[][] fetchAll(const char* pszSql) { string[][] v; if(pszSql is null ) return null; retCode=SQLExecDirect(hStmt,cast(SQLCHAR*)pszSql,SQL_NTS); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return null; } retCode=SQLNumResultCols(hStmt,&col); if((retCode != SQL_SUCCESS) && (retCode != SQL_SUCCESS_WITH_INFO)) { throw new Exception(format("Erro AllocHandle with retCode: %d",retCode)); return null; } row=0; SQLINTEGER colLen = 0; SQLSMALLINT buf_len = 0; SQLINTEGER colType = 0; while(true) { char sz_buf[256]; char* pszBuf; SQLINTEGER buflen; string[] rowData =new string[col+1]; if(SQLFetch(hStmt)==SQL_NO_DATA) { break; } for(int i=1;i<=colCount;i++) { SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_NAME, sz_buf.ptr, 256, &buf_len, cast(void*)0); SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_TYPE, cast(void*)0, 0, cast(short*)0, &colType); SQLColAttribute(hStmt, cast(ushort)i, SQL_DESC_LENGTH, null, 0, cast(short*)0, &colLen); pszBuf=(new char[colLen+1]).ptr; pszBuf[0]='\0'; SQLGetData(hStmt,cast(ushort)i,SQL_C_CHAR,pszBuf,50,cast(int*)&buflen); rowData[i-1]=to!string(pszBuf); } v~=rowData; row++; } SQLCancel(hStmt); return v; } string[][] fetchAll(string sql) { return fetchAll(sql.ptr); } bool close() { if(bState) { SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC,hDbc); SQLFreeHandle(SQL_HANDLE_ENV,hEnv); bState=false; } return true; } bool isOpen() { return bState; } int rowCount() { return row; } int colCount() { return col; } }
发表评论
-
D2 下win32 api 中文框架备忘
2011-07-28 17:49 1001隔一段时间就忘了怎么在D2下win32 SDK框架里使用中文, ... -
截屏、闪屏(Timer)、输入窗口--DFL for D2.053
2011-05-16 17:41 1225这个小练习用D2.053+DFL完成了以下功能: 1.截屏(C ... -
SDK写的一个画树(花)程序
2009-11-23 17:53 1048[img]C:\Documents and Settings\ ... -
json for D2.034
2009-10-13 19:54 690作者:Jeremie Pelletier 链接: [url] ... -
D2 中使用VC的Windows资源文件
2009-09-15 15:26 1182终于试成功了。总结一下: 一.在*.RC里包含window ... -
windows vfw.lib
2009-09-07 20:06 1269上传到这里,因为有时候改变工作地点后另一台机上没有。:P -
Windows D编程类封装初步学习并请教
2009-09-01 18:37 1176首先把要请教的问题写在最顶部: 1。事件最好的包装方法是怎样的 ... -
再学SQLite3 API
2009-08-21 17:48 2191这次进一步看了看SQLigte3 的API,不用上次写的类包装 ... -
"D"iving Into the D Programming Language
2009-08-04 16:23 1540"D"iving Into the D P ... -
练习:boost.timer 转D2
2009-07-21 12:32 1258中间解决了好几个问题,尚有几个问题没解决,已在NG上提问。备忘 ... -
Sqlite3 C++类库Sharplite 转D
2009-07-17 16:32 1595这是一份作业,因为所有创作的部分都是前人的。 材料:1.sql ... -
D2 反射和defineEum! 练习
2009-07-16 14:21 829备忘: module DioApp; imp ... -
D2 std.stream 文件读写小练习
2009-07-13 19:12 1700笔记要点: 1。个人工具包samsTools 工具之一Prom ... -
DFL for DMD2.031
2009-07-10 16:33 840从NG里要到的,俺测过了,OK 的啦. 原贴原下载地址链接: ... -
D2/Phobos与D2/Tango一键切换编译环境设置
2009-05-08 18:01 1125一。适合谁: 象俺一样,反反复复搭不起D编译环境的小菜 二。不 ... -
(翻译)Phobos 2.029 R部 std.random
2009-04-27 14:58 1249std.random ... -
(翻译)Phobos 2.029 P部 std.process
2009-04-23 11:57 1106std.process ... -
(翻译)Phobos 2.029 P部 std.path
2009-04-23 10:52 1283std.path ...
相关推荐
NULL 博文链接:https://godspeedhu.iteye.com/blog/423419
D语言编译器DMD 2.065已经发布了,D语言经过近年来的努力终于取得不错的成绩!这个版本包含了大量问题修复和改进,真是值得敬佩
编译器源代码之:DMD(D语言)dmd.2.026。vc6编译通过
Dynamic Mode Decomposition (DMD).zip
用于控制sim显微镜中的dmd部分。 此代码可以控制dmd产生规则的图形。以控制显微镜光源形状
Schematic-FLD3 DMD Board DLP TI
D语言是结合了C#、Java和 C++以及PHP、Python等动态语言的特性于一身,且不依赖于虚拟机, 而是作为可执行程序单独来运行的,这样它的效率非常高。
用于了解DMD的文档。 dmd可以用于结构光超分辨显微镜。
DMD2-master_DMD_源码.zip
快照数据的动态模态分解,获得基模态和对应的特征值,包括频率和增长率,以及数据后处理。
Arduino dmd library for matrix display
Hi3798CV200硬件HDK 海思网络机顶盒方案硬件开发资料 硬件版本号:CV2DMD 包含原理图和PCB(PCB包含PADS和ALLEGRO两个版本)
动态模式分解的matlab 代码,有注释
数字微镜DMD编程,包括设置帧频、画面大小和积分时间等参数
数据决策与模型工具模板 (DMD spreadsheets),用于决策分析一整套的工具表格,涵盖经济、营销、人力资源等
Dynamic_Mode_Decomposition_DMD_源码.zip
DMD回归模型PPT课件.pptx
本资源为Visual D 1.0.1-beta1安装包,或者亦可以直接去GitHub下载其他的版本的安装包.https://github.com/dlang/visuald/releases
DMD芯片显示原理详解.doc
installer, 适用于各种系统的dmd安装程序 安装程序这里存储库宿主用于构建DMD安装程序和软件包的脚本。要下载现成的安装安装程序或者包,请访问 dlang.org 下载页面。要了解有关安装脚本的更多信息,请访问 install....