为什么我在使用 ADODB.Command 执行Oracle存储过程时,传入的是浮点值,保存的却是整数!With objcmd
.ActiveConnection = cnOracle
.CommandType = adCmdStoredProc
.CommandText = strSQL
Debug.Print .Parameters(i).NumericScale '此处,如果是浮点型参数时仍然为0,不解!!!请高手指点
For i=0 to .Parameters.count-1
.Parameters(i) = varPara(i)
Next
Call .Execute '保存成功时,浮点型参数保存时成了整数型了,自动将浮点型的小数部分截掉了,晕倒!!!
End With如果用CommandType = adCmdStoredProc 存储过程中的参数格式都是:[参数_In 表.字段%Type],存储过程里只有一个Insert Into 语句,此时小数保存到数据库里的时成了整数,郁闷!!!
如果用CommandType = adCmdText ,CommandText属性赋值一个Insert Into语句,传入相同的参数时,保存到数据库的是正常的。
请高手指点!!!
.ActiveConnection = cnOracle
.CommandType = adCmdStoredProc
.CommandText = strSQL
Debug.Print .Parameters(i).NumericScale '此处,如果是浮点型参数时仍然为0,不解!!!请高手指点
For i=0 to .Parameters.count-1
.Parameters(i) = varPara(i)
Next
Call .Execute '保存成功时,浮点型参数保存时成了整数型了,自动将浮点型的小数部分截掉了,晕倒!!!
End With如果用CommandType = adCmdStoredProc 存储过程中的参数格式都是:[参数_In 表.字段%Type],存储过程里只有一个Insert Into 语句,此时小数保存到数据库里的时成了整数,郁闷!!!
如果用CommandType = adCmdText ,CommandText属性赋值一个Insert Into语句,传入相同的参数时,保存到数据库的是正常的。
请高手指点!!!
On Error GoTo myErr
Set cnDb = New ADODB.Connection
Set cmd = New ADODB.Command
Set rst = New ADODB.Recordset
cnDb.CursorLocation = adUseClient
cnDb.ConnectionString = "Provider=MSDAORA.1;Password=" + Trim(DataSource_Pass) + ";User ID=aaaa;Data Source=aaa;Persist Security Info=True"
cnDb.Open
cmd.ActiveConnection = cnDb
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_aa.Getdd"
cmd.Parameters.Append cmd.CreateParameter("bDate", adLongVarChar, adParamInputOutput, 30, Format(QuerybDate, "yyyymmdd") + " 00:00:00")
cmd.Parameters.Append cmd.CreateParameter("eDate", adLongVarChar, adParamInputOutput, 30, Format(QueryeDate, "yyyymmdd") + " 23:59:59")
cmd.Parameters.Append cmd.CreateParameter("flag", adNumeric, adParamInputOutput, , 1.0)
Set rst = cmd.Execute
Exit Sub
myErr:
MsgBox Err.Description
End Sub
is
begin
insert into t values(aid,aname,afloat);
end;
/
'忽略你varPara(i)的数据,手动对Parameters赋值,看了测试的代码你应该可以找到问题的答案了
Dim cmd As ADODB.Command
Dim cnDb As ADODB.Connection
Set cnDb = New ADODB.Connection
cnDb.ConnectionString = "Provider=MSDAORA.1;Password=password;User ID=system;Data Source=orcl;Persist Security Info=True"
cnDb.CursorLocation = adUseClient
cnDb.Open
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = cnDb
.CommandType = adCmdStoredProc
.CommandText = "test1"
MsgBox .Parameters.Count'结果为3
.Parameters(0) = 12
.Parameters(1) = "12"
.Parameters(2) = 1.064
.Execute
End With
/
--执行结果
12 12 1.064
是由于我的表结构使用的是Number类型,我用的是Number(20,5),而你用的是Float类型。
但是,我一直未明白为什么Number类型的参数在传入时就保存为整数,而用(CommandType = adCmdText)Insert Into 语句直接插入时却能正常保存!!!
继续关注!
一直以来我都是在程序中直接用插入命令的(或是用Connection对象直接执行存储过程的字符串的方式执行存储过程的)所以未发现这个问题。现在由于需求的改变,换了这种实现方式,所以才发现的这个问题!有没有高手能给解答一下,为什么会出现这种情况?是ado部分的问题,还是我的使用方法有误,还是Oracle数据库的问题呢
is
begin
insert into t9 values(aid,aname,afloat);
end;
/
Dim cmd As ADODB.Command
Dim cnDb As ADODB.Connection
Set cnDb = New ADODB.Connection
cnDb.ConnectionString = "Provider=MSDAORA.1;Password=lidexian;User ID=system;Data Source=orcl;Persist Security Info=True"
cnDb.CursorLocation = adUseClient
cnDb.Open
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = cnDb
.CommandType = adCmdStoredProc
.CommandText = "test1"
MsgBox .Parameters.Count '结果为3
.Parameters(0) = 12
.Parameters(1) = "12"
.Parameters(2) = 1.064
.Execute
End With
/
12 12 1.06400