Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共11 条记录, 每页显示 10 条, 页签: [1] [2]
[浏览完整版]

标题:完整的数据转换文档

1楼
狐狸爸爸 发表于:2009/3/13 15:13:00

数据转换函数


在程序开发的过程中,我们经常需要将某一类型的数据转换为其它数据类型后使用。
为此Visual Basic提供了以下转换函数:

示例

Dim s As String = "123.12"
Output.Show(Cdate(
"1999-12-31"))
Output.Show(CInt(s))
Output.Show(CDbl(s) +
100
)

 

2楼
狐狸爸爸 发表于:2009/3/13 15:13:00

带判断的转换


显然任何类型的数据,都可以转换为字符型。
但是对于其它类型的数据,却有转换失败的可能,例如:


Dim
s As String = "abc"
Dim
v As Long = 123
Return
CLng(s) +
v


如果在命令窗口执行上面的代码,会出现错误提示:字符串"abc"无法转转位长整数。
为了解决这个问题,我们可以采用另一种转换方法。

除了String(字符)类型外,所有的基本数据类型,都有一个TryParse方法,用于将其它类型的数据转换为本类型的数据。


语法


Type
.TryParse(Value,Variant)


说明

Type:   目标数据类型,例如Date、Integer、Long、Double等等。
Value:  要进行转换的数据。
V
ariant: 用于存放转换结果的变量,变量的类型必须和Type指定的类型一致。

如果转换成功,则将转换结果存储在变量Variant中,并返回True,否则返回False。


例如:


Dim
s As string = "123.1"
Dim
d As Double
Double
.TryParse(s, d) '将变量s的内容转换为数值,并存放在变量d中
Output.Show(d +
100)
'输出结果是223.1

再例如:

Dim d As Date '变量d用于存储转换结果
If
Date.TryParse("1999/12/31", d) Then '如果转换成功
    Output.Show(d)
'输出转换结果
Else

    Output.Show(
"无效日期格式") '给出错误提示
End
If

3楼
狐狸爸爸 发表于:2009/3/13 15:13:00

最直接的转换


前面已经讲到,使用转换函数转换数据类型,在转换失败的情况下,会出现错误提示。
使用TryParse方法,可以避免错误提示,但是代码略显繁琐。

Visual Basic提供了一个Val函数,用于将字符转换为数值,即使转换失败,也不会报错,而是返回0。


例如:


Dim
s1 As String = "abc"
Dim
s2 As String = "123.12"
Output.Show(Val(s1) +
100) '等于100
Output.Show(Val(s2) +
100)
'等于232.12


虽然变量s1是无法转换为数值的,但是在命令窗口执行上面的代码,却不会有任何错误提示,因为Val函数将s1被转换为0了。

4楼
狐狸爸爸 发表于:2009/3/13 15:21:00

日期列的一个意外


大多数时候,我们可以直接使用日期列的值。
例如假定当前表有一个日期列,可以在名称窗口正常执行下面的代码:


Dim
m As Integer = CurrentTable.Current("日期").Month
Dim
d As Date = CurrentTable.Current("日期").AddYears(360)


但是如果你在命令窗口执行下面的代码,却会出现错误提示:


Dim
t As TimeSpan
t =
Date.Today - CurrentTable.Current("日期")
OutPut.Show(
"距今天数:" & t.TotalDays)


要使上面的代码正确执行,可以修改为:


Dim
t As TimeSpan
t =
Date.Today - CDate(CurrentTable.Current("日期"))
OutPut.Show(
"距今天数:"
& t.TotalDays)


上面的代码用CDate将列中的值转换为日期,你也许会奇怪,本来就是日期,何来转换之说,这是因为我们从某列取值的时候,不管列类型如何,得到的始终是一个Object类型的值,但是Visual Basic会自动判断真实的值类型,所以我们直接使用即可。唯一的例外就是上面这个例子:日期之间相减的时候,用CDate函数明确地转换一下。


除了用CDdate转换外,还可以:


Dim
t As TimeSpan
Dim
d As Date = CDate(CurrentTable.Current("日期"))
t =
Date.Today - d
OutPut.Show(
"距今天数:"
& t.TotalDays)

5楼
狐狸爸爸 发表于:2009/3/13 15:23:00

变量的作用范围


在代码的任何位置,我们都可以用Dim语句定义变量,但是不同位置定义的变量,其作用范围是不同的。
变量的作用范围原理如下:如果在流程语句之内定义的,则只在该流程语句之内以及嵌套的字流程语句内有效,如果在流程语句之外定义的,则在该段代码的任何位置有效。

为说明上述原理,我们哟内一些例子说明,这些代码本身没有意义,甚至显得非常冗余,但是可以很好地说明问题:


示例一


下面的代码能够正常执行:


Dim
m As Integer 'm在流程语句之外,在任何位置可以使用
If
m > 0 Then
    Dim
n As integer 'n在流程语句之内定义,只能在本流程内使用
    n =
1 '使用n
    m = n +
1 '使用m和n
End If

m = m *
2
'使用m


示例二


下面的会报错,问题出在最后一行代码,因为变量n是在If语句内定义的,不能在If语句之外使用:


Dim
m As Integer 'm在流程语句之外,在任何位置可以使用
If
m > 0 Then
    Dim
n As integer 'n在流程语句之内定义,只能在本流程内使用
    n =
1 '使用n
    m = n +
1 '使用m和n
End If

m = m *
2 '使用m
n = n *
2 '这会导致代码出错,因为变量n不能在流程外使用


示例三


不同的流程语句内,可以定义同名的变量,例如在下面的代码中,我们在四个地方定义了名称为n的变量:


Dim
m As Integer = 5
If
m > 0 Then
    Dim
n As Integer
    n =
1
Else
    Dim
n As Integer
    n =
10
End
If
Select Case
m
    Case
1,3,5,7,8
       
Dim n As Integer = 1
        m = n

    Case
2,4,6,8,10
       
Dim n As Integer = 1
        m =
2
End Select

Messagebox.Show(IIF(m =
1,"奇数","偶数"
))

实际使用的时候,如果某一个变量需要在不同的流程中使用,应该直接在流程外定义,如果某个变量只在流程内使用,那么就应该在该流程内定义。


示例四


在流程语句之内定义的变量,可以在子流程内使用,例如下面的代码中,变量n是在If语句中定义的,在嵌套的子流程Select Case语句中也使用了该变量:

Dim m As Integer = 1
If
m > 0 Then
    Dim
n As Integer
    n =
1
   
Select Case m
       
Case 1,3,5,7,8
            n =
1
       
Case 2,4,6,8,10
            n =
2
   
End Select
    Messagebox.Show(IIF(n =
1,"奇数","偶数"))
End If


示例五


流程内和流程外,不能有同名的变量,例如下面的代码会出现错误,这是因为变量n同时在流程内和流程外定义了:

Dim m As integer
Dim
n As Integer
If
n > 0 Then
    Dim n As integer
    m =
1
End If

6楼
狐狸爸爸 发表于:2009/3/13 15:24:00

再谈空值


我们前面已经提到过,空值用Nothing表示。例如需要删除订单表某行客户列的内容,可以:


Tables(
"订单").Rows(1)("客户") = Nothing



DataTables(
"订单").DataRows(1)("客户") = Nothing


如果要判断某一列的内容为空,可以:


If Tables(
"订单").Rows(1).IsNull("客户") Then
 
'代码
End If



If DataTables(
"订单").DataRows(1).IsNull("客户") Then
  '代码

End If


你也许会感到奇怪,为什么要用IsNull判断,而不能用下面的方法判断呢:


If Tables(
"订单").Rows(1)("客户") Is Nothing Then
  '代码

End If


这是因为即使某列的值为空,其返回的值也不会是Nothing。
在某列内容为空的时候,会根据不同的列类型,返回不同的值,规则如下:


字符列:""
数值列:0
逻辑列:False
日期列:#0001-01-01 0:00:00#

7楼
i52117 发表于:2009/3/13 15:27:00
谢谢狐狸爸爸
8楼
kylin 发表于:2009/3/13 16:38:00

收到

9楼
菜鸟foxtable 发表于:2009/3/14 8:42:00
收藏
10楼
林中侠 发表于:2009/3/14 8:45:00

写入帮助中

共11 条记录, 每页显示 10 条, 页签: [1] [2]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .03906 s, 2 queries.