乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 25|回复: 1

[讨论]怎样提高VB+SQL数据处理速度

[复制链接]

34

主题

70

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
206
发表于 2008-4-22 07:06:00 | 显示全部楼层 |阅读模式
我用VB将CAD图形中的图元信息写入到SQL中,当数据量大的时候感觉特慢,请问有什么方法优化吗?下面是我的代码:
Option Explicit
Dim acadApp As AcadApplication     
Dim acadDoc As AcadDocument      
'Dim acaddoc As AcadModelSpace
Const LB_ITEMFROMPOINT = &H1A9
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hWnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, lParam As Any) As Long
Private Sub Command1_Click()
'On Error Resume Next
    Set acadApp = GetObject(, ".Application.16")
    If Err Then
      MsgBox "AUTOCAD图形软件未打开!"
      End
    End If
   
    If Err Then
        Err.Clear
        ' 创建一个新的AutoCAD应用程序对象
        Set acadApp = CreateObject("AutoCAD.Application.16")
        
        If Err Then
            MsgBox Err.Description
            Exit Sub
        End If
    End If
   
    ' 显示AutoCAD应用程序
    acadApp.Visible = True
    Set acadDoc = acadApp.ActiveDocument
    Dim cn As New ADODB.Connection
    acadDoc.SendCommand "zoom" & vbCr & "e" & vbCr
Frame1.Visible = False
Frame2.Visible = False
Command1.Visible = False
Command2.Visible = False
Line2.Visible = False
Line3.Visible = False
Line1.Visible = False
Dim gdp As New ADODB.Recordset
Dim gdpp As New ADODB.Recordset
Dim gdeo As New ADODB.Recordset
Dim gdpv As New ADODB.Recordset
Dim gdv33 As New ADODB.Recordset
Dim gdv3 As New ADODB.Recordset
Dim gdlp As New ADODB.Recordset
Dim gg01 As New ADODB.Recordset
Dim gg03 As New ADODB.Recordset
Dim tdsyz As String, tdzl As String, qsxz As String, sjyt As String
Dim sqllj As String, gdv3lj As String, gg01lj As String, gg03lj As String, gdplj As String
Dim gdlplj, gdpvlj As String
Dim ftype(0 To 2) As Integer
Dim fdata(0 To 2) As Variant
Dim gdsx As Variant
Dim maxvid, maxvidd As Long, vid As Long, eoid As Long, pid As Long
Dim maxga01 As String, newga01 As String
Dim maxpid As Long, newpid As Long, maxvn As Long, newvn As Long
Dim zdpx(), zdpxgd(), t() As Variant '宗地排序数组
Dim jfmj As Double '街坊面积
Dim ltime As String
Dim djh, zdh, jfh As String
Dim zds As Integer '宗地数
sjyt = Trim(Text7.Text)
tdsyz = Trim(Text6.Text)
qsxz = Trim(Text8.Text)

ltime = Date + Time
ftype(0) = 0: fdata(0) = "LWPOLYLINE"
ftype(1) = 8: fdata(1) = "界址线"
ftype(2) = 70: fdata(2) = 1
'ftype(2) = 70: fdata(2) = 1
Dim ddzb() As Double '顶点坐标
Dim dds, mode, jzds As Integer
Dim zb As Variant
Dim i As Integer
sqllj = "provider=sqloledb.1;password=" & Text4.Text & " ;persist security info=true;user;initial catalog=" & Text2.Text & " ;data source=" & Text1.Text & ""
cn.Open sqllj
jfh = Trim(Text5.Text)
   gdv3lj = "select maxvid=max(vid) from gdv3"
  gdv3.Open gdv3lj, cn, adOpenForwardOnly, adLockBatchOptimistic
  Do While Not gdv3.EOF
    maxvid = gdv3.Fields("maxvid")
    gdv3.MoveNext
  Loop
gdv3.Close
gdplj = "select maxpid=max(pid), js=count(pid) from gdp"
gdp.Open gdplj, cn, adOpenForwardOnly, adLockBatchOptimistic
If Not gdp.EOF Then
If gdp.Fields("js") > 0 Then
maxpid = gdp.Fields("maxpid")
Else
maxpid = 0
End If
End If
gdp.Close
gg01.Open "select maxga01=max(ga01)from gg01 where ga01 like '200%'", cn, adOpenForwardOnly, adLockBatchOptimistic
If Not gg01.EOF Then
   'If gg01.Fields("maxga01")  Null Then
    maxga01 = gg01.Fields("maxga01")
  ' Else
  ' maxga01 = "2007320506100000"
  ' End If
   
End If
  gg01.Close
  
   newga01 = pdga01(maxga01)
  gdeo.Open "select * from gdeo where description like  " & jfh & " ", cn, adOpenForwardOnly, adLockBatchOptimistic
If Not gdeo.EOF Then
    eoid = gdeo.Fields("eoid")
    Else
    MsgBox "数据库中没有本街坊信息、请查实!“"
    End
  End If
gdeo.Close
   gdv3lj = "select maxvn=max(vn) , js =count(vn)from gdv3 where eoid=" & eoid & " and vt='100' and vid in (select pvid from gdpv where pid in (select lpid from  gdlp where isvirtual=0))"
  gdv3.Open gdv3lj, cn, adOpenForwardOnly, adLockBatchOptimistic
  If Not gdv3.EOF Then
   If gdv3.Fields("js") > 0 Then
    maxvn = gdv3.Fields("maxvn")
    End If
    'gdv3.MoveNext
  End If
gdv3.Close
i = 0
On Error Resume Next
   Dim xzj As AcadSelectionSet
   If Not IsNull(acadDoc.SelectionSets.Item("st")) Then
     Set xzj = acadDoc.SelectionSets.Item("st")
     xzj.Delete
     End If
  Set xzj = acadDoc.SelectionSets.Add("st") '新建选择集
  'MsgBox xzj.Name
  xzj.Select acSelectionSetAll, , , ftype, fdata '选择宗地
  ReDim zdpxgd(xzj.count - 1, 3)
  'ReDim zdpxgd(xzj.Count - 1, 1)
  ReDim t(xzj.count - 1, 3)
  If xzj.count = 0 Then
   MsgBox "没有界址线!"
   End
Else
  Dim ty As AcadEntity
  For Each ty In xzj
   If ty.Close = True Then
  dds = (UBound(ty.Coordinates) + 1) / 2
  zb = ty.Coordinates
  jfmj = ty.Area
    ReDim ddzb(dds * 3 - 1)
    ReDim sjzb(dds - 1, 1)
    For i = 0 To dds - 1
    'MsgBox ty.Coordinates(2 * i)
    ddzb(3 * i) = zb(2 * i)
    ddzb(3 * i + 1) = zb(2 * i + 1)
    ddzb(3 * i + 2) = 0
    sjzb(i, 0) = zb(2 * i)
    sjzb(i, 1) = zb(2 * i + 1)
    Next i
gdsx = tqjfh(ddzb)
zdh = gdsx(0)
tdzl = gdsx(1)
If zdh  "" Then
jfh = Trim(Text5.Text)
djh = jfh + zdh
'newpid = maxpid + 1
zdpxgd(zds, 0) = zdh
zdpxgd(zds, 1) = ddzb
zdpxgd(zds, 2) = jfmj
zdpxgd(zds, 3) = tdzl
zds = zds + 1
End If
Else
MsgBox "本宗地界址线没有封闭!请检查!"
End If
  Next
  End If
  '以上提取宗地号和宗地界址线坐标表。
  '以下对宗地号由大到小排序。
  Dim sd, sdd, j, ii As Integer
For i = 1 To zds - 1
  For j = i - 1 To zds - 1
   sd = Val(zdpxgd(i - 1, 0))
   sdd = Val(zdpxgd(j, 0))
  If sd > sdd Then
    t(i, 0) = zdpxgd(i - 1, 0)
    t(i, 1) = zdpxgd(i - 1, 1)
    t(i, 2) = zdpxgd(i - 1, 2)
    t(i, 3) = zdpxgd(i - 1, 3)
    zdpxgd(i - 1, 0) = zdpxgd(j, 0)
    zdpxgd(i - 1, 1) = zdpxgd(j, 1)
    zdpxgd(i - 1, 2) = zdpxgd(j, 2)
    zdpxgd(i - 1, 3) = zdpxgd(j, 3)
    zdpxgd(j, 0) = t(i, 0)
    zdpxgd(j, 1) = t(i, 1)
    zdpxgd(j, 2) = t(i, 2)
    zdpxgd(j, 3) = t(i, 3)
    End If
Next j
Next i
  '宗地号由小到大排序完毕。
' newga01 = pdga01(maxga01)
'新增宗地数据开始上传
Bar1.Top = 1300
  Bar1.Width = 2500
  Bar1.Left = 1000
  Bar1.Min = 0
  Bar1.Max = zds
For ii = 0 To zds - 1
  'newpid = maxpid + 1
Bar1.Value = ii
  
  djh = jfh + zdpxgd(ii, 0)
  gdplj = "select * from gdp where pid in (select ga33 from gg01 where ga18 = '" & djh & "' )"
  gdp.Open gdplj, cn, adOpenDynamic, adLockPessimistic
  If gdp.EOF Then
  'cn.Execute "set identity_insert gdp on"
  'cn.Execute "insert into gdp  values( " & newpid & ", '100' ,'" & zdpxgd(ii, 0) & " '," & eoid & " ,0,0,0,0.0,0.0,0,0.0, 0,'" & ltime & " '," & zdpxgd(ii, 2) & ",1)"
  cn.Execute "insert into gdp  values( '100' ,'" & zdpxgd(ii, 0) & " '," & eoid & " ,0,0,0,0.0,0.0,0,0.0, 0,'" & ltime & " '," & zdpxgd(ii, 2) & ",1)"
  gdpp.Open "select maxpid=max(pid) from gdp ", cn, adOpenDynamic, adLockPessimistic
  If Not gdpp.EOF Then
     newpid = gdpp.Fields("maxpid")
  End If
  gdpp.Close
  cn.Execute "insert into gdlp values(" & newpid & ",'" & sjyt & "','" & tdsyz & "','" & newga01 & "',1,0,0.0,0.0,1)"
  'cn.Execute "insert into gg01 values( '" & newga01 & " ','0','','','" & Left(djh, 6) & " ','" & Mid(djh, 7, 3) & " ','" & Mid(djh, 10, 3) & " ','" & zdh & " ','" & ltime & " ','002','','','','','','','','','','','','" & djh & " ',' ',' ',' ','0','0',' ',' ',' ',' ','Y',0,0,'',0," & maxpid + 1 & ",' Y ',0,0,0,'" & jmj & "',0,'','0',0)"
  gg01.Open "select * from gg01", cn, adOpenDynamic, adLockPessimistic
' If gg01 Then
   gg01.AddNew
    gg01.Fields("ga01") = newga01
    gg01.Fields("ga02") = "0"
    gg01.Fields("ga03") = tdsyz
    gg01.Fields("ga031") = Left(djh, 6)
    gg01.Fields("ga032") = Mid(djh, 7, 3)
    gg01.Fields("ga033") = Mid(djh, 10, 3)
    gg01.Fields("ga034") = zdpxgd(ii, 0)
    gg01.Fields("ga04") = ""
    gg01.Fields("ga05") = ltime
    gg01.Fields("ga051") = "002"
    gg01.Fields("ga06") = ""
    gg01.Fields("ga07") = ""
    gg01.Fields("ga08") = zdpxgd(ii, 3)
    gg01.Fields("ga09") = ""
    'gg01.Fields("ga10") = ""
    gg01.Fields("ga11") = ""
    gg01.Fields("ga12") = ""
    gg01.Fields("ga13") = ""
    gg01.Fields("ga14") = ""
    gg01.Fields("ga15") = ""
    gg01.Fields("ga16") = "1"
    gg01.Fields("ga17") = ""
    gg01.Fields("ga18") = Left(djh, 6) + Mid(djh, 7, 3) + Mid(djh, 10, 3) + zdpxgd(ii, 0)
    gg01.Fields("ga19") = ""
    gg01.Fields("ga21") = Null
    gg01.Fields("ga22") = Null
    gg01.Fields("ga23") = 0
    gg01.Fields("ga24") = Val(sjyt)
    gg01.Fields("ga25") = ""
    gg01.Fields("ga251") = ""
    gg01.Fields("ga26") = ""
    gg01.Fields("ga27") = ""
    gg01.Fields("ga28") = "Y"
    gg01.Fields("ga29") = ""
    gg01.Fields("ga30") = 0
    gg01.Fields("ga31") = ""
    gg01.Fields("ga32") = "N"
    gg01.Fields("ga33") = newpid
    gg01.Fields("ga34") = "Y"
    gg01.Fields("ga35") = Null
    gg01.Fields("ga36") = Null
    gg01.Fields("ga37") = Null
    gg01.Fields("ga221") = zdpxgd(ii, 2)
    gg01.Fields("ga222") = Null
    gg01.Fields("ga38") = Null
    gg01.Fields("ga39") = Null
    gg01.Fields("ga381") = Null
   gg01.Update
   gg01.MoveNext
  'End If
   
  gg01.Close
  
  zb = zdpxgd(ii, 1)
jzds = (pdws(zb) + 1) / 3
  For i = 0 To jzds - 1
' For i = 0 To zdpxgd(ii, 1).cone
  gdv3lj = "select * from gdv3 where x=" & zb(3 * i + 1) & " and y= " & zb(3 * i) & " and vt=100"
  gdv3.Open gdv3lj, cn, adOpenForwardOnly, adLockBatchOptimistic
  
  If Not gdv3.EOF Then
    vid = gdv3.Fields("vid")
    newvn = gdv3.Fields("vn")
  Else
     vid = maxvid + 1
     newvn = maxvn + 1
     maxvn = maxvn + 1
      cn.Execute "set identity_insert gdv3 on"
      cn.Execute "insert into gdv3  values ( " & eoid & ",' " & newvn & "'," & zb(3 * i + 1) & "," & zb(3 * i) & ",0,2,1,1,0,'" & ltime & "',100)"
  End If
   gdv33.Open "select maxvid=max(vid) from gdv3 ", cn, adOpenForwardOnly, adLockBatchOptimistic
   If Not gdv33.EOF Then
     maxvidd = gdv33.Fields("maxvid")
     If maxvidd > maxvid Then
        vid = maxvidd
     End If
     maxvid = maxvidd
     End If
     gdv33.Close
   
   ' cn.Execute "set identity_insert gdeov on"
      
    cn.Execute "insert into gdpv  values (" & newpid & "," & i + 1 & "," & vid & ")"
    cn.Execute "insert into gg03 values (" & newga01 & "," & i + 1 & "," & i + 1 & " ," & newvn & ",null,4,null,null,2,3,null)"
  ' maxvid = maxvid + 1
   'maxvn = maxvn + 1
  gdv3.Close
  Next
  
  maxpid = maxpid + 1
  newga01 = pdga01(newga01)
   'MsgBox ty.ObjectName
   End If 'If gdp.EOF Then
   gdp.Close
  Next
  MsgBox "数据上传完毕!"
  End
  End
   
   
   
   
End Sub
Function tqjfh(xxzb) As Variant  '提取宗地号、土地坐落
On Error Resume Next
Dim jfh(0 To 1) As String
  Dim zjxzj As AcadSelectionSet
     If Not IsNull(acadDoc.SelectionSets.Item("zjst")) Then
     Set zjxzj = acadDoc.SelectionSets.Item("zjst")
     zjxzj.Delete
     End If
  Set zjxzj = acadDoc.SelectionSets.Add("zjst") '新建选择集
  Dim ftype As Variant, fdata As Variant
  Call creatssetfilter(ftype, fdata, 0, "Text", 8, "宗地注记,土地座落")
  'ReDim gpCode(0 To 1) As Integer
    ''gpCode(0) = 0
    ''gpCode(1) = 8
   '' ReDim dataValue(0 To 1) As Variant
    ''dataValue(0) = "TEXT"
   '' dataValue(1) = "宗地注记"
   
   '' Dim groupCode As Variant, dataCode As Variant
   '' groupCode = gpCode
   '' dataCode = dataValue
   
    zjxzj.SelectByPolygon acSelectionSetWindowPolygon, xxzb, ftype, fdata
    If zjxzj.count = 0 Then
     MsgBox "没有宗地号,请检查!"
    ' End
     Else
     
    'zjxzj.SelectByPolygon acSelectionSetWindowPolygon, pointsArray, groupCode, dataCode
    If zjxzj.Item(0).Layer = "宗地注记" Then
       jfh(0) = zjxzj.Item(0).TextString  '
       jfh(1) = zjxzj.Item(1).TextString
       Else
       jfh(1) = zjxzj.Item(0).TextString  '
       jfh(0) = zjxzj.Item(1).TextString
       End If
      
  End If
  
  '以上提取街坊坐标和街坊号
tqjfh = jfh
zjxzj.Delete
End Function
Function pdga01(maxga01) As String '判断调查表号
Dim hm As String
hm = Val(Str$(Right(maxga01, 6)) + 1)
Select Case Len(hm)
  Case 1: hm = "00000" + hm
  Case 2: hm = "0000" + hm
  Case 3: hm = "000" + hm
  Case 4: hm = "00" + hm
  Case 5: hm = "0" + hm
  End Select
pdga01 = Left(maxga01, 10) + hm
End Function
Function pdws(mArray As Variant) As Integer
Dim i As Integer
Dim Ret As Integer
Dim ErrF As Boolean
Dim arrayrange As Integer
ErrF = False
On Error GoTo ErrHandle
'判断代入的参数是否为数组
If Not IsArray(mArray) Then
pdws = -1
Exit Function
End If
'VB中数组最大为60
For i = 1 To 60
'用UBound函数判断某一维的上界,如果大数组的实际维数时产生超出范围错误,
' 此时我们通过Resume Next 来捕捉错这个错误
Ret = UBound(mArray, i)
If ErrF Then Exit For
Next i
'最后返回
arrayrange = Ret
Exit Function
ErrHandle:
'Ret = i - 1
'ErrF = True
'Resume Next
pdws = Ret
End Function
Private Sub CommandButton2_Click()
End
End Sub
Private Sub Command2_Click()
End
End Sub
Public Sub creatssetfilter(ByRef filtertype As Variant, ByRef filterdata As Variant, ParamArray filter()) '选择集过滤器
If UBound(filter) Mod 2 = 0 Then
MsgBox "filter 参数无效"
  Exit Sub
End If
Dim ftype() As Integer
Dim ftada() As Variant
Dim count As Integer
count = (UBound(filter) + 1) / 2
ReDim ftype(count - 1)
ReDim fdata(count - 1)
Dim i As Integer
For i = 0 To count - 1
  ftype(i) = filter(2 * i)
  fdata(i) = filter(2 * i + 1)
  Next i
  filtertype = ftype
  filterdata = fdata
End Sub
回复

使用道具 举报

15

主题

52

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2008-4-27 19:15:00 | 显示全部楼层
不了解,帮顶
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-4 22:08 , Processed in 0.877829 second(s), 56 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表