本人用VB+SQL SERVER2000制作了一个类似于通讯录得个人信息管理系统,制作过程当中出现了两个问题:
1:当数据库的表为空时,与服务器建立连接之后总是出现这样的错误:“28:堆栈空间溢出“。
点调试后,程序停止在:
Public Sub UpdateNameCombo()
    Dim RSNames As ADODB.Recordset  '定义一记录集变量
    '通过连接变量执行存储过程
    Combo1.Clear             ‘程序停止在这里!!!!!!!!!!!!!!!!!!!!!
    Set RSNames = MyConnection.Execute("Exec contactlist")
    Combo1.Clear
    Do Until RSNames.EOF
        Combo1.AddItem RSNames("Name")
        Combo1.ItemData(Combo1.NewIndex) = RSNames("ContactID")
        RSNames.MoveNext
    Loop
   
End Sub
 而如果表中已经有记录时,则可以正常运行。当点击删除按钮将所有记录删除之后,程序自动就退出了。再进时,就出现了错误28。我估计是由于程序中产生了死循环。
2:当表不为空时,点击添加按钮向表中添加记录时,总是出现这样的错误:”实时错误 ’3265‘在对应所需名称或序数的集合中,未找到项目。“ 但实际上,当再次打软件时,记录已经添加到表中了。调试时,程序停止在:
Private Sub Command3_Click()
    
    Dim RSAddNew As ADODB.Recordset
    Set RSAddNew = MyConnection.Execute("Exec contactadd " & "'" & Text1.Text & "'," & "'" & Text2.Text & "'," & "'" & Text3.Text & "'," & "'" & Text4.Text & "'," & "'" & Text6.Text & "'")
    currentID = RSAddNew("TheNewID") '停止在这里!!!!!!!!!!!!!!!!!
    Combo1.AddItem Text1.Text
    Combo1.ItemData(Combo1.NewIndex) = RSAddNew("TheNewID")
    
End Sub还有:T-sql语言是不是严格区分大小写啊???????????????

解决方案 »

  1.   

    (7)form2各控件的事件驱动程序:
    A:调用DisPlayContact子程序来显示combo1下拉表中被选项目的对应记录
    Private Sub Combo1_Click()
        DisPlayContact Combo1.ItemData(Combo1.ListIndex)
    End SubB:调用contacAdd存储过程,添加一条记录至contacts表中,同时记录联系人编号和联系人姓名加入combo1下拉表中。
                                       问题主要存在地!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Private Sub Command3_Click()
    ’联系人添加按钮的驱动程序    
        Dim RSAddNew As ADODB.Recordset
        Set RSAddNew = MyConnection.Execute("Exec contactadd " & "'" & Text1.Text & "'," & "'" & Text2.Text & "'," & "'" & Text3.Text & "'," & "'" & Text4.Text & "'," & "'" & Text6.Text & "'")
        currentID = RSAddNew("TheNewID")
        Combo1.AddItem Text1.Text
        Combo1.ItemData(Combo1.NewIndex) = RSAddNew("TheNewID")
    End SubC:联系人按钮的驱动程序
    Private Sub Command8_Click()
      If currentID = 0 Then
          Command3_Click   '联系人添加按钮
      Else
          MyConnection.Execute ("Exec contactupdate " & currentID & ", " & "'" & Text1.Text & "'," & "'" & Text2.Text & "'," & "'" & Text3.Text & "'," & "'" & Text4.Text & "'," & "'" & Text6.Text & "'")
      
      End If
      UpdateNameCombo
    End SubD:联系人删除按钮的事件驱动程序
    Private Sub Command4_Click()
      If currentID = 0 Then
          Command5_Click    ‘联系人清除按钮
      Else
          MyConnection.Execute "Exec deletecontact " & currentID
          UpdateNameCombo
          DisPlayContact 0
      End If
    End SubE:清除当前窗口信息
    Private Sub Command5_Click()
        currentID = 0
        Text1.Text = ""
        Text2.Text = ""
        Text3.Text = ""
        Text4.Text = ""
        Text6.Text = ""
    End SubF:退出按钮
    Private Sub Command7_Click()   '退出程序
      Unload Me
    End SubG:调用子程序DiaPlayContact显示contacts表中第一条记录,然后调用UpdateNameCombo将contacts表中记录联系人编号和联系人姓名加入combo1下拉表
    Private Sub Form_Load()
        DisPlayContact 0
        UpdateNameCombo
    End Sub
      

  2.   

    还有:T-sql语言是不是严格区分大小写啊???????????????
    //T-sql本身并不区分,要看数据库是不是区分大小写的,这个跟数据库设置有关系!
      

  3.   

    对,是没有字段造成的。
    调试时,程序就停在这里,
    currentID = RSAddNew("TheNewID")
    RSAddNew的定义为,
    Dim RSAddNew As ADODB.Recordset
    Set RSAddNew = MyConnection.Execute("Exec contactadd " & "'" & Text1.Text & "'," & "'" & Text2.Text & "'," & "'" & Text3.Text & "'," & "'" & Text4.Text & "'," & "'" & Text6.Text & "'")
    在调用contactadd存储过程后:有select @@identity as TheNewID
    为什么会没有TheNewId这个字段呢? @@identity是标识列的值嘛,他是随系统自动增加的阿!
    搞不明白!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    CREATE Procedure contactadd
        @name varchar(50),@Address varchar(100),
        @ZipCode varchar(20),@EmailAddress varchar(50),
        @ContactNote varchar(50)
    AS
    begin
        insert into contacts
            (name,Address,ZipCode,EmailAddress,ContactNote)values
            (@name,@Address,@ZipCode,@EmailAddress,@contactNote)
        select @@identity as TheNewID
    end
    return
      

  4.   

    问题2已经被我解决:
    但是不知道到底是为什么~~~哪位高人知道?Private Sub Command3_Click()
        On Error Resume Next   '在添加了该句之后问题解决!!!!!!!!!!!!!!!!!!
        
        Dim RSAddNew As ADODB.Recordset
        Set RSAddNew = MyConnection.Execute("Exec contactadd " & "'" & Text1.Text & "'," & "'" & Text2.Text & "'," & "'" & Text3.Text & "'," & "'" & Text4.Text & "'," & "'" & Text6.Text & "'")
        currentID = RSAddNew("TheNewID") '停止在这里!!!!!!!!!!!!!!!!!
        Combo1.AddItem Text1.Text
        Combo1.ItemData(Combo1.NewIndex) = RSAddNew("TheNewID")
    End Sub那第一个问题怎么解决呢?~~~~~~~~~
    是不是表中至少要有一个记录啊?!!!!!!!!!
      

  5.   

    不管什么数据库在没有设置好的时候读空子段的时候都会出现错误!这和代码本身没有直接联系!你可以加入限制!你可以通过On Error Resume Next 来跳过这个错误,或者当出现某个特定错误的时候在Error方法里跳过
      

  6.   

    to :天堂之石:谢谢你啊,但是
    我在程序停止的地方加了On error Resume Next,但是没有用啊!!!!
    怎么加入限制啊?还有Public Sub UpdateNameCombo()
        On Error Resume Next   '我在这里添加了,但是没有用啊!!!!
        Dim RSNames As ADODB.Recordset  '定义一记录集变量
        '通过连接变量执行存储过程
        Combo1.Clear             ‘程序停止在这里!!如果把这一行去掉,form就被卸载了~~~~郁闷
        Set RSNames = MyConnection.Execute("Exec contactlist")
        Combo1.Clear
        Do Until RSNames.EOF
            Combo1.AddItem RSNames("Name")
            Combo1.ItemData(Combo1.NewIndex) = RSNames("ContactID")
            RSNames.MoveNext
        Loop
       
    End Sub
      

  7.   

    用SQL Sever做个人信息管理,呵呵。有意思。
    只用ACCESS做过类似的东东。
      

  8.   

    我之所以用SQL SERVER做只是因为我们正在学习SQL,书上有个例题就是用SQL server做个人信息管理。我只是拿来做练习而已。现在,我自己已经把问题全部解决~~~~~~~~~~~,唉,这个帖子白发了~~~~~~~~~~~~