为什么我在使用 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语句,传入相同的参数时,保存到数据库的是正常的。
请高手指点!!!

解决方案 »

  1.   

    --以前写的使用vb调用存储过程,你用这个方式看看还有你的问题吗?Public Sub GetRecordSet()
    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
      

  2.   

    create table t(cid int,cname varchar2(100),cFloat float)create or replace procedure test1(aid in t.cid%type,aname in t.cname%type,afloat in t.cfloat%type)
    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
      

  3.   

    我现在找到出错地方了!
    是由于我的表结构使用的是Number类型,我用的是Number(20,5),而你用的是Float类型。
    但是,我一直未明白为什么Number类型的参数在传入时就保存为整数,而用(CommandType = adCmdText)Insert Into 语句直接插入时却能正常保存!!!
    继续关注!
      

  4.   

    我还不明白呢,为啥呀?用Number(20,5)有问题/
      

  5.   

    我也不知道为什么!
    一直以来我都是在程序中直接用插入命令的(或是用Connection对象直接执行存储过程的字符串的方式执行存储过程的)所以未发现这个问题。现在由于需求的改变,换了这种实现方式,所以才发现的这个问题!有没有高手能给解答一下,为什么会出现这种情况?是ado部分的问题,还是我的使用方法有误,还是Oracle数据库的问题呢
      

  6.   

    注意你这里varPara(i)create table t9(cid int,cname varchar2(100),cFloat number(20,5))create or replace procedure test1(aid in t9.cid%type,aname in t9.cname%type,afloat in t9.cfloat%type)
    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