以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  完整的数据转换文档  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=2084)

--  作者:狐狸爸爸
--  发布时间:2009/3/13 15:13:00
--  可否实现在线EXCEL功能,不让EXCEL到外飞

数据转换函数


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

  • CStr
    转换为字符串(String)。
     
  • CDate
    转换为日期(Date)。
     
  • CDbl
    转换为双精度小数(Double)。
     
  • CInt
    转换为整数(Integer)。
     
  • CLng
    转换为长整数(Long)。
     
  • CSng
    转换为单精度小数(Single)。
     
  • CDec
    转换为高精度小数(Decimal)。
     
  • Cbyte
    转换为微整数(Byte)。
     
  • CShort
    换为短整数(Short)。

示例

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

 


--  作者:狐狸爸爸
--  发布时间: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


--  作者:狐狸爸爸
--  发布时间: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了。


--  作者:狐狸爸爸
--  发布时间: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)


--  作者:狐狸爸爸
--  发布时间: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


--  作者:狐狸爸爸
--  发布时间: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#


--  作者:i52117
--  发布时间:2009/3/13 15:27:00
--  
谢谢狐狸爸爸
--  作者:kylin
--  发布时间:2009/3/13 16:38:00
--  

收到


--  作者:菜鸟foxtable
--  发布时间:2009/3/14 8:42:00
--  
收藏
--  作者:林中侠
--  发布时间:2009/3/14 8:45:00
--  

写入帮助中