免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 22922 | 回复: 8
打印 上一主题 下一主题

[转帖]ESQL/C的数据类型 [复制链接]

论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-09 01:16 |只看该作者 |倒序浏览
ESQL/C的数据类型  

一、
1、SQL与C数据类型的对应
简单类型
SQL         C
CHAR(n)           char(n+1)
CHARCTER(n)       char *
SMALLINT          short int
INTERGER
INT          long int
SMALLFLOAT
REAL          float
FLOAT
DOUBLE PRECISIONdouble
SERIAL           long int
DATE           long int
复杂类型
SQL           C
DECIMAL
DEC NUMERIC          dec_t or struct decimal
MONEY          dec_t or struct decimal
DATETIME          dtime_t or struct dtime
INREVER              intrvl_t or struct intrvl
VARCHAR              varchar or string

2、数据类型转换

转换类型  转换后
FLOAT  DECIMAL(16)
SMALLFLOAT  DECIMAL(8)
INTERGER  DECIMAL(10,0)
SAMLLINT  DECIMAL(5,0)  


二、数据类型的转换函数
(一)有关CHAR类型的函数
1、以空值结尾的串的操作函数
rdownshift(char *s)          把一个字符串中的所有字母转换成小写形式。
rupshift(char *s)             把一个字符串中的所有字母转换成大写形式。
stcat(char *s, char *dest)      把一个字符串同另一个字符串相连接。
stcmpr(char *s1, char *s2)     比较两个字符串。
stcopy(char *from, char *to)   把一个字符串拷贝到另一个字符串。
stleng(char *string)           统计字符串的长度。

2、定长串的操作函数
bycmpr(char byte1, byte2, rpt len)   比较两组连续的字节内存块。
bycopy(char *from, char *to, int len) 把一块内存的内容拷贝到另一块内存。
byfill(char *to, int len, char ch)      用字符填充指定的内存块。
byleng(char from, int count)         统计有效字符的数目。有效字符是指字符串去除了末尾空格所剩的字符。

3、字符串操作函数
ldchar(char *from, int num, char *to)   拷贝定长串到空值结尾的串。
stchar(char *from, char *to, int num)   拷贝空值结尾的串到定长串。

4、字符串函数简单数值转换
rstod(char *str, double *dblval) 把以空值结束的字符串转换成C的double型
rstoi(char *str, int *intval)     把以空值结束的字符串转换成C的int类型。
rstol(char *str, long *lngval)   把以空值结束的字符串转换成C的long类型。


(二)DATE类型的函数
1、创建内部日期
rdefmtdate(long *jdate, char *frmt char *str)  生成具有确定格式的日期字符串。(str字符串和fmt必须按月、日、年的同一顺序)
返回代码:
      0操作成功。
  -1204在str参数中有非法的月份。
  -1206在str参数中有非法的日期。
  -1209由于str中没有包含年、月、日各部分间的定界符,str的长
度必须准确定义为6或8个字节长。
  -1212fmt中没有包含年、月、日部分。
fmt和str的有效组合
  fmt                str
  “mmddyy”          “DEC 25th 1997”
  “mmm.dd.yyyy”     “dec 25 1997”
  “mmm.dd.yyyy”     “DEC-25-1997”
  “mmm.dd.yyyy”     “12251997”
  “mmm.dd.yyyy”     “12/25/1997”
  “yy/mm/dd”        “97/12/25”
  “yy/mm/dd”        “1997,December, 25th"
  “yy/mm/dd”        “In the year 1997, the month of December, its 25th day”
  “dd-mm-yy”        “This 25th day of December, 1997”
rmdyjul(short mdy[3], long *jdate) 用三个短整数生成一个内部日期这三个整数是有关年、月、日的数字值。(年必须以完整的形式表达)
返回代码:
      0操作成功。
  -1204在mdy[2]中有非法年份。
  -1205在mdy[1]中有非法月份。
  -1206在mdy[0]中有非法日期。

rstrdate(char *str, long *jdate) 将一个字符串日期转换成一内部格式的日期。
rtoday(long *jdate)           从系统日期创建一个内部日期值。

2、从内部日期转换成其他类型
rfmtdate(ling jdate, char *fmt, char *str) 从内部格式的日期类型值创建格式化的字符串。
返回代码:
      0操作成功。
  -1210内部日期不能被转换成月-日-年格式。
  -1211程序存储溢出,即存储分配错误。

rjulmdy(long jdate, short mdy[3]) 从一个内部日期生成一个含有3个短整数的数组对应内部日期的月、日、年。

rdatestr(long jdate, char *str) 从一个内部日期值创建缺省的日期字符串。

rdayofweek(long jdate) 给定一内部格式表示的日期,此函数返回所对应的星期中的某一天。

rleapyear(int year) 用来判断给定的年份是否为闰年。
返回值:
   TRUE(1)     是闰年
   FALSE(0)    不是闰年


(三)简单数值类型的格式化函数
rfmtdouble(double dbval, char *fmt, char *str) 将双精度格式化为指定的模板格式。
rfmtlong(double longval, char *fmt, char *str) 将长整型值格式化为指定的模板格式。
可以构成格式模板串的字符:
*以星号代替空格。
&以0代替空格。
#代表一个数字或空格的位置。
<左调整,显示一个逗号,仅当左边有数字时才显示。
.显示一个小数点,一个格式模板串只能有一个小数点。
-显示负号,当数字为负的时候显示。
+显示正号,当数字为正的时候显示。
(显示一个负号,同(一起显示负值。
)显示一个负号,同)一起显示负值。
$显示美元符号。


(四)处理空值的数值类型函数
risnull(int type, char *cvar)  检查C变量是否为空值。
rsetnull(int type, char *cvar) 给C变量置空值。

(五)其他函数
typalign(int pos, int type) 返回一具有指定数据类型变量的下一个位置。
rtypmsize(int sqltype, int sqllen) 返回你必须分配在存储单元中的指定的C或RDSQLD的字节数。
rtyname(int sqltype) 返回一包含指定RDSQL类型名的以空结尾的串。
rtypwidth(int sqltype, intsqllen) 返回一具有RDSQL类型的值转换为一字符类型时避免截取所需的最小字符数。


ESQL/C数据类型的进一步说明

一、DECIMAL数据类型的使用
1、DECIMAL函数——把C的数据类型转换为DECIMAL值
deccvasc(char *from, int len, dec_t *to) 把ASCII字符串转换成DECIMAL值。
返回值:
0转换成功
-1200数字太大,上溢。
-1201数字太小,下溢。
-1213存在非数值字符。
-1216存在错误指数。
注意事项:
(1)字符串的前导空格被忽略。
(2)字符串可以有前导符号“+”或“-”。
(3)字符串可以包含e或E的指数形式,指数前可带符号“+”或“-”。

deccvint(int from, dec_t *to)     把C的整数转化成DECIMAL值。
deccvlong(long from, dec_t *to)  把C的长整数转化成DECIMAL值。
deccvdbl(double from, dec_t *to) 把C的双精度值转化成DECIMAL值。


2、DECIMAL函数——把DECIMAL值转换成字符型
dectoasc(dec_t *from, char *to, int len, int rt) 把DECIMAL值转换成ASCII字符串。
说明:
len串缓冲区字节的最大长度。
rt表示十进制小数右边十进制的位数。
注意事项:
(1)rt=-1,则十进制位的个数有*from的十进制值决定。
(2)如果此数不适合长度len的字符串,则该函数将这个数转换为指数表示的形式。如果仍不适合,则串用“*”号填满。如果数的长度短于串长,则右对齐且左部用空格填充。

dececvt(dec_t *from, int ndgt, int *decpt, int *sign) 将一十进制数转换成以空格结束的具有指定个数的字符串,且返回此字符串的指针。

decfcvt(dec_t *from, int ndgt, int *decpt, int *sign) 将一十进制数转换成以空格结束、小数点右边具有指定位数的字符串,且返回此字符串的指针。

rfmtdec(dec_t *from, char *format, char *to) 将DECIMAL值转换成格式化的字符串。

3、DECIMAL函数——把DECIMAL值转换成数值型
dectoint(dec_t *from, int *to)&#59;
dectolong(dec_t *from, long *to)&#59;
dectodbl(dec_t *from, double *to)

4、DECIMAL函数——算术运算
decadd(dec_t *op1, dec_t *op2, dec_t *result)&#59;
decsub(dec_t *op1, dec_t *op2, dec_t *result)&#59;
decmul(dec_t *op1, dec_t *op2, dec_t *result)&#59;
decdiv(dec_t *op1, dec_t *op2, dec_t *result)&#59;
返回代码:
0操作成功
-1200操作产生上溢
-1201操作产生下溢
-1202试图用零作除数

5、DECIMAL函数——DECIMAL操作
deccmp(dec_t *dec1, dec_t *dec2)&#59;
返回值:
-1dec1<dec2
0dec1=dec2
1dec1>;dec2
          DECUNKNOW有一个是空值

deccopy(dec_t *dec1, dec_t *dec2)&#59;
decround(dec_t *dec1, int scale)&#59;
dectrunc(dec_t *dec1, int scale)&#59;

二 、DATETIME和INTERVAL使用方式及实例
1、概述
DATETIME数据类型存放时间,时间由以下部分组成:YEAR,MONTH,DAY,HOUR,MINUTE,SECOND和秒的FRACTION(n)。
INTERVAL数据类型存放时间间隔,组成部分同上。

定义宿主变量:
DATETIME   LargestQulifier  TO  SmallQulifier
INTERVAL   LargestQulifier  TO  SmallQulifier
限定词:
YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)
也可以不指明修饰符,直接定义。

2、DATETIME和INTERVAL宏及转换函数
在头文件datetime.h中定义了8个名字和5个宏,可以在操作DATETIME和INTERVAL值时使用它们。
名字
TU_YEAR用于YEAR修饰符域的名字
TU_MONTH
TU_HOUR
TU_DAY
TU_MINUTE
TU_SECOND
TU_FRAC用于开始的fraction修饰符域的名字
TU_Fn用于结束的fraction(n)修饰符域的名字(n=1~5)

TU_LEN(q)
TU_START(q)
TU_END(q)
TU_DTENCODE(s,e)
TU_IENCODE(p,s,e)

3、DATETIME和字符串之间的转换函数
dtcvasc(char *from, dtime_t *to)把ANSI兼容的字符串转换为DATETIME值
dtcvfmtasc(char *from, char *fmt, dtime_t *to) 把格式化的字符串转换为DATETIME值。
dttoasc(char *from, dtime_t *to)
dttofmtasc(char *from, dtime_t *to, int len, char *fmt)
4、操作DATETIME值的函数
dtcurrent(dtime *to) 把当前日期和时间赋给一个DATETIME变量。
dtextent(dtime_t *from, dtime *to) 拷贝DATETIME值,使用的是不同的修饰符。

5、INTERVAL转换函数
incvasc(char *from, intrvl_t *to)把ANSI兼容的字符串转换为INTERVAL值
incvfmtasc(char *from, char *fmt, intrvl_t *to) 把格式化的字符串转换为INTERVAL值。
intoasc(char *from, intrvl_t *to)
intofmtasc(char *from, intrvl_t *to, int len, char *fmt)

6、提供DATETIME和INTERVAL算术操作的函数
rdtaddinv(dec_t *dt, int dg, dec_t *in, int iq, dec_t *sum) 把一个INTERVAL值加到一个DATETIME值上。
rdtsub(det_t *dt2, int dq2, dec_t *dt1, int dq1, dec_t *dt0, int dq0) 求两个DATETIME值的差。

7、DATE类型和DATETIME类型之间的转换
DATE→DATETIME
?&#59;定义一个带有修饰符“year to day”的DATETIME变量
?&#59;使用rfmtdate()函数把DATE值转换为一个字符串,使用的模板是yyyy-mm-dd
?&#59;使用dtcvasc()函数把字符串转换成DATETIME类型变量的值。
?&#59;如果需要的话,可以使用dtextend()函数来调整DATETIME的修饰符。

DATETIME→DATE
?&#59;使用dtextend()函数把DATETIME的修饰符调整为“year to day”。
?&#59;使用dttoasc()函数以模板yyyy-mm-dd创建一个字符串。
?&#59;使用rdefmtdate()函数以模板yyyy-mm-dd把字符串转换为一个DATE值。

8、有关DATETIME和INTERVAL值的其他运算
rinvtodec(dec_t *v, int q, dec_t *dec) 把INTERVAL或DATETIME类型的值转换成DECIMAL类型
redectoinv(dec_t *dec, dec_t *v, int q) 把DECIMAL值转换成INTERVAL或DATETIME类型值




      

论坛徽章:
0
2 [报告]
发表于 2003-01-09 10:35 |只看该作者

[转帖]ESQL/C的数据类型

真好

论坛徽章:
0
3 [报告]
发表于 2003-01-09 10:37 |只看该作者

[转帖]ESQL/C的数据类型

还有更多的关于ESQL/C的内容吗

论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
4 [报告]
发表于 2003-01-09 11:21 |只看该作者

[转帖]ESQL/C的数据类型

我去找些来!

论坛徽章:
0
5 [报告]
发表于 2003-03-31 17:03 |只看该作者

[转帖]ESQL/C的数据类型

不错呀,大梦真不错

论坛徽章:
0
6 [报告]
发表于 2003-05-21 13:23 |只看该作者

[转帖]ESQL/C的数据类型

大梦,可是前辈中的大好人啊!

论坛徽章:
0
7 [报告]
发表于 2004-03-07 19:24 |只看该作者

[转帖]ESQL/C的数据类型

真心感谢大梦前辈!!

论坛徽章:
0
8 [报告]
发表于 2010-03-31 15:53 |只看该作者
感谢LZ。总不用了,关键时候能用上。{:3_189:}

论坛徽章:
0
9 [报告]
发表于 2012-12-06 14:36 |只看该作者
谢谢楼主,真是太好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP