有如下一个语句:sql = "INSERT INTO 表1(用户编号,用户姓名,工资)" + " values (" & RST.fields("编号") & "," + RST.Fields("姓名") +"," &  Gongzi &" )"用户编号和工资两字段为数值,用户姓名为文本,均为非必填字段。问题如下:
1、当用户编号、工资、用户姓名分别为空白字段时,应如何构造此SQL语句才能保证此SQL语句的正常执行。

解决方案 »

  1.   

    isnull(用户编号,' ') as 用户编号
      

  2.   

    function SQLString(byval v as variant) as string
        if IsNull(v) Then
            SQLString = "NULL"
        else
            SQLString = "'" & v & "'"
        end if
    end ifsql = "INSERT INTO 表1(用户编号,用户姓名,工资)  values (" & _
            SQLString(RST.fields("编号").Value) & "," & _
            SQLString(RST.Fields("姓名").Value) & "," & _
            SQLString(Gongzi) & " )"
      

  3.   

    没留意数据类型的说明
    function SQLString(byval v as variant) as string
        if IsNull(v) Then
            SQLString = "NULL"
        else
            SQLString = "'" & v & "'"
        end if
    end iffunction SQLValue(byval v as variant) as string
        if IsNull(v) Then
            SQLValue= "NULL"
        else
            SQLValue= CStr(v)
        end if
    end ifsql = "INSERT INTO 表1(用户编号,用户姓名,工资)  values (" & _
            SQLValue(RST.fields("编号").Value) & "," & _
            SQLString(RST.Fields("姓名").Value) & "," & _
            SQLValue(Gongzi) & " )"
      

  4.   

    sql=" insert into 表1(用户编号,用户姓名,工资) values("& iif(isnull(rst!编号)=true,"NULL","" & rst!编号 &"") &","& iif(isnull(rst!姓名)=true,"NULL","'"& rst!姓名 &"'") &","& iif(isnull(rst!工资)=true,"NULL",""& rst!工资 &"") &")"
      

  5.   

    楼上两位老师:
    (1)如果rst!姓名字段为空白,即此记录的姓名为空,那isnull(rst!姓名)是=true还是=false?
    (2)TO Tiger_Zhao 当用户编号、用户姓名、工资三个字段为空时,按照你的方法最终生成的SQL是
         sql = "INSERT INTO 表1(用户编号,用户姓名,工资)  values (null,null,null)"
       还是sql = "INSERT INTO 表1(用户编号,用户姓名,工资)  values ('null','null','null')"
        还有存入数据库之后,这三个字段的内容均为NULL,还是均为空白。
      
      

  6.   

    sql = "INSERT INTO 表1(用户编号,用户姓名,工资)  values (null,null,null)"
    NULL
      

  7.   


    请问:用户编号和工资两个数值字段存放的结果也是NULL吗?
      

  8.   

    NULL NULL NULL NULL NULL NULL 
      

  9.   

    insert into 表1(用户编号,用户姓名,工资) values(null,null,null)

    insert into 表1(用户编号,用户姓名,工资) values('','','')

    insert into 表1(用户编号,用户姓名,工资) values('',null,'')
    都不会出错
      

  10.   


    谢谢,大师。
    我还想问一下,如果rst!姓名字段为空白,即此记录的姓名为空,那isnull(rst!姓名)是=true还是=false? 
      

  11.   

    也可以构造SQL语句来解决:
        Dim sql As String
        Dim fName
        Dim n As Long
        
        fName = Array("用户编号", "用户姓名", "工资")    ReDim sqlFields(2) As String
        ReDim sqlValues(2) As String
        
        If Len(Format(rst!编号)) > 0 Then
            sqlFields(n) = fName(0)
            sqlValues(n) = "'" & rst!编号 & "'"
            n = n + 1
        End If
            
        If Len(Format(rst!姓名)) > 0 Then
            sqlFields(n) = fName(1)
            sqlValues(n) = "'" & rst!姓名 & "'"
            n = n + 1
        End If
        
        sqlFields(n) = fName(2)
        sqlValues(n) = rst!工资
       
        ReDim Preserve sqlFields(n)
        ReDim Preserve sqlValues(n)
        
        sql = "INSERT INTO 表1(" & Join(sqlFields, ",") & ") VALUES(" & Join(sqlValues, ",") & ")"
        
        Debug.Print sql
      

  12.   

    用Format(rst!姓名)这样一下,就将rst!姓名的值转换为了字符串,这样就不必纠缠isnull返回什么了...
      

  13.   

    为什么同一条记录的两个字段,姓名和房间号均为文本字段,前者为不允许为空,后者为允许为空。
    现在在ACCESS2003的表中看到这条记录的这两个字段均为空白,也非空格。dim a as boolean
    a = IsNull(RstYh.Fields("姓名").value)  a=true
    a = IsNull(RstYh.Fields("房间号"))      a=false为什么前一个ISNULL结果为TRUE,后一个为FALSE?
      

  14.   

    我还想问一下,如果rst!姓名字段为空白,即此记录的姓名为空,那isnull(rst!姓名)是=true还是=false?
    -----------------------------
    只有当rst!姓名为null时,isnull(rst!姓名)=true
    rst!姓名字段为空白并不一定就rst!姓名为null,你看到的空白,或许是个0长度的字符串,这个要看你以前表中数据的处理方法...
      

  15.   

    你可以试一下:
    dim v
    v=null
    msgbox v & isnull(v)
    v=""
    msgbox v & isnull(v)这二个值你都如你所说的空白,但isnull的结果不一样
      

  16.   

    楼主还是没有分清楚 NULL 和空字符串的区别。
    一个是没工作,一个是工作了没拿到钱,都表现为没收入。
      

  17.   

    我把这两个字段从ACCESS中全部手工清除了。结果还是一个是TRUE,一个是FALSE.真是怪呀。
      

  18.   

    检查表设计,看看有没有默认值存在,根据要求更改设置...
    或者删除这二个字段重建....
    还有或者尝试修复一下access...
      

  19.   

    如果rst!姓名是NULL,那么isnull(rst!姓名)=true
    如果rst!姓名是''(空串),那么isnull(rst!姓名)=false
      

  20.   

    为什么同是文本字段,在ACCESS中均为空白字段,这个字段和VARIAN没有直接的关系,但是在被ISNULL调用后却是两种类类型(如一个是NULL,另一个是空字符串),同为ACCESS表中的空白文本字段,为什么调用之后却发生了变化。请问!!!!
      

  21.   

    综上,请各位大师,各自再提供一下  “当用户编号、工资、用户姓名分别为空白字段时,应如何构造此SQL语句才能保证此SQL语句的正常执行。”这个问题的答案。谢谢大家。
      

  22.   


    你还是概念不清
    access还有许多其它数据库,无论“文本类型”字段还是“数字类型”字段,设计时都可以设置其数据是否允许为null,当一个字段允许其数据为null,并且没有设置其默认值的情况下,那么只要不对这个字段赋值,查询就返回null;用isnull就是true; 如果对这个字段进行了赋值(赋null值除外),返回的数据用isnull就是false。
    你说“你手工清除了数据”,那就要看你怎么清除的了,如果执行update tb set fld=null这样清除,返回的数据必然是null,如果你打开表,用退格键等等键盘方式清除数据,对不起,这个字段不是null,只是个0长度的字符串...
    处理思路上面有几种了,如果你概念不清,依然搞不定....
      

  23.   

    IsNull 函数
          返回 Boolean 值,指出表达式是否不包含任何有效数据 (Null)。语法IsNull(expression)必要的 expression 参数是一个 Variant,其中包含数值表达式或字符串表达式。说明如果 expression 为 Null,则 IsNull 返回 True;否则 IsNull 返回 False。如果 expression 由多个变量组成,则表达式的任何作为变量组成成分的 Null 都会使整个表达式返回 True。Null 值指出 Variant 不包含有效数据。Null 与 Empty 不同,后者指出变量尚未初始化。Null 与长度为零的字符串 (““) 也不同,长度为零的字符串指的是空串。重要 使用 IsNull 函数是为了确定表达式是否包含 Null 值的。在某些情况下,希望表达式取值为 True,比如希望 If Var = Null 和 If Var <> Null 取值为 True,而它们总取值为 False。这是因为任何包含 Null 的表达式本身就是 Null,所以为 False。
      

  24.   

    TO vbman2003:
    1、ACCESS2003的字段设计中,只有文本类型有 允许空字符串, 但这应该不是说允许为NULL吧。数值型字段没有这个选项。
    2、姓名和房间号这两个字段,我全都手工删除了它们的内容,并且这个姓名原先确实是有个人名的。但ISNULL姓名就是TRUE  ISNULL房间号就是FALSE,这如何解释呢。
      

  25.   

    如果你不是用SQL语句创建表,而是在ACCESS环境下用向导创建表,那么你要弄清楚,在字段属性中
    是否"必填字段"对应是否允许null
    是否"允许空字符串"对应是否允许0长度字符串
    二个完全不同的概念,还有默认值的设置等等,这样不同的操作也会造成你说的不同的结果,原因上面说过了,自己仔细看,最简单的解决方法是用format函数,将字符值格式化为字符串来判断,上面有示例....
      

  26.   

    TO:vbman2003
    还有两个问题想请教一下:(1)除了变量=NULL这种情况外,还有什么情况可以使变量的内容为NULL
     (2) 当用SQL在一个数据库中增加了一条记录后,怎样的SQL会使这条记录中的姓名字段为NULL,怎样的SQL语句会使姓名字段为""谢谢。
      

  27.   


    针对文本类型说,如果一个字段设置为允许null,没有设置默认值,在插入一行数据时没有对这个字段进行操作,这个字段的值就是null,如果你设置了默认值,那么这个字段就是默认值,比如默认值是''(当然默认值设置为''需要字段属性允许空字符串)
    如果你在插入数据时对这个字段进行了操作,并且插入非null值,要想使这个字段还原为null值,只有用update语句更新其值为null,如果你想使其值为空字符串,必须字段属性允许空字符串,同样用update语句更新
    以上都是指在程序中调用mdb文件,如果你打开ACCESS环境,用键盘等等手工方法处理数据,可能会有不确定因素,具体这个我没注意过....我的观点是表是用来存贮数据的,不是让用户操作的,最好不要用手工方法去修改数据,这样或许有可能会给程序逻辑带来一些困惑...
      

  28.   

    insert into 表1(用户编号,用户姓名,工资) values(null,null,null)

    insert into 表1(用户编号,用户姓名,工资) values('','','')

    insert into 表1(用户编号,用户姓名,工资) values('',null,'')