VB程序员博客

VB程序开发

Archive for 03月, 2009

一级菜鸟请教:
我知道的vb连接数据库的方法有两种:
1.通过设置数据源
2.写代码
我想通过写代码做。在公共模块写,怎么写?写完在需要的界面调用的代码?
很菜的问题,不要见笑啊,各位
希望越傻瓜越好

'连接SQL数据库为例
'公共模块的代码如下
Public adoCon As New ADODB.Connection      '定义一个数据连接
Public CnnStr As String

Public Sub Main()          '定义一个公共主函数,用于连接数据库
CnnStr = " Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;pwd=SA的密码;Initial Catalog=数据库名;Data Source=计算机名或IP地址 "
adoCon.Open (CnnStr)     
End Sub
'其中User ID=sa是SQL安装后就有的,这个你不用改。而pwd=SA的密码SQL安装后是空的,如果你没有改过密码,这句就不用写了。
'计算机名或IP地址,就是你安装了SQL的计算机名或IP.如果是本机就写.(是一点哦)就可以。

'下面读取数据库中指定数据表的内容
'在窗口中添加一个DataGrid控件和一个Adodc控件
Private Sub Form_Load()
Main                        '调用Main涵数打开数据库
Adodc1.ConnectionString = CnnStr            '连接数据库
Adodc1.RecordSource = "select * from 数据表名"  '使用SQL语句查询数据表的内容
Set DataGrid1.DataSource = Adodc1              '设DateGrid与Adodc连接
End Sub

Public Function cnstr() As String
  cnstr = "Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;Initial Catalog=db_Csell"
End Function
Public Function Cnn() As ADODB.Connection    '定义函数
Set Cnn = New ADODB.Connection
  '返回一个数据库连接
Cnn.Open "Driver={SQL Server};Server=(local);Database=2;Uid=sa;Pwd="
End Function

请问这一段代码跟楼上的代码是一样的吗?
还有在adodc1中的connectionstring属性设置的是一样的吗?是什么意思呢?

dim conn as new adodb.connection
'连接ACCESS数据库,假设数据库在程序所在目录下test.mdb
with conn
    If .State = adStateOpen Then .Close
    .ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & " est.mdb;Mode=ReadWrite;Persist Security Info=False"
    .Open
End With

'连接MS SQL Server2000或2005
With conn
    If .State = adStateOpen Then .Close
    .ConnectionString = "driver=SQL Server;server=计算机名或IP地址;uid=SA;pwd=SA的密码;database=数据库名"
    .CommandTimeout = 120
    .Open
End With


有个问题!我要双击一个datagridview的第一行的时候,会出现一个form,这个form上面也有个datagridview并且绑定了excel数据!然后,双击第2行,要那个form又出现,但是datagridview上显示的是不同的数据,一直双击第3行,第4行,第5行,都会出现那个form,但datagridview上显示不同的数据!我是用的这个方法,做了5个form(我是新手,方法很笨,呵呵),每次点datagridview上不同的行的时候,就会分别出现!但这个方法好麻烦。因为这5个form都是一样的!只是每次打开的路径(红字显示的)不同罢了~!我想要只做一个form可以出现5次而显示不同的数据基于不同的数据路径~!!诚恳谢谢大家了!!很急~

Dim str As String
        Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection
        Dim fName As String
        fName = "c:SCOR2 ConfigurationLevel 2-Source.xls"
        con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fName & ";Extended Properties=""Excel 8.0;HDR=YES;"""
        con.Open()
        str = "select [No] from  [sheet1$] where predecessor like '%,%'"

5行分别打开5个form:

Private Sub DataGridView1_CellMouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick
        If e.RowIndex = 0 Then
            MessageBox.Show("this row is column name ,it can not be edited ,please select the other row")
        Else
            If e.RowIndex = 1 Then

                Form5.ShowDialog()
                Form5.Close()
            Else
                If e.RowIndex = 2 Then

                    Form4.ShowDialog()
                    Form4.Close()
                Else
                    If e.RowIndex = 3 Then

                        Form6.ShowDialog()
                        Form6.Close()
                    Else
                        If e.RowIndex = 4 Then

                            Form7.ShowDialog()
                            Form7.Close()
                        Else
                            If e.RowIndex = 5 Then

                                Form8.ShowDialog()
                                Form8.Close()

                            End If
                        End If
                    End If
                End If
            End If
        End If
    End Sub

定义个全局变量lineindex
Private Sub DataGridView1_CellMouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDoubleClick
        If e.RowIndex = 0 Then
            MessageBox.Show("this row is column name ,it can not be edited ,please select the other row")
        Else
          lineindex=e.RowIndex
          form.show
        End If
    End Sub

将fname设置为数组,分别存为相应的excel文件路径
在form加载的时候设置文件名为fname(lineindex)

怎样将fname设置为数组存为相应的路径?
谢谢你啊!我初学有些东西还不怎么懂!

一个简单的办法,2个form,1主,另一个显示数据
public id as integer '记录点击的列
public function con(fname,sqlstr) ’连接数据库
Dim str As String
        Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection
        Dim fName As String
        fName = "c:SCOR2 ConfigurationLevel 2-Source.xls"
        con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fName & ";Extended Properties=""Excel 8.0;HDR=YES;"""
        con.Open()
        sqlstr = "select [No] from  [sheet1$] where predecessor like '%,%'"
end sub
然后加主窗体的datagridview_click加
id=得到当前id
数据窗体的form_load
select case id
case 1
    con(连接字符串,要执行的sql)
case 2
……
end select
然后把数据集挂到datagridview上。
另外补充一点,要及时关闭con

谢谢了哈~搞出来了。
我是定了个全局变量:
Public ExcelPath As String ' ExcelPath to open several files at different location
然后分别一个一个的传下去,这样貌似简单些。
If e.RowIndex = 1 Then
                Dim Frm As Form5 = New Form5()
                Frm.ExcelPath = "c:SCOR2 ConfigurationLevel 2-Plan.xls"  ' ExcelPath to open several files at different location
                Frm.ShowDialog()
            Else
                If e.RowIndex = 2 Then

                    Dim Frm As Form5 = New Form5()
                    Frm.ExcelPath = "c:SCOR2 ConfigurationLevel 2-Source.xls"
                    Frm.ShowDialog()
           
            …
            …
     


在程序运行时,我想对很多控件数组进行移动和自由拉伸。比如,点击它之后,它周围能出现8个点,我就能在8个方向上进行拉伸。有没有高手能帮我写个子程序或类似的东西,因为我要对image控件进行位伸,而有些控件是没有句柄的,所以,在子程序里不能有句柄。前面有个高手写了个,但有句柄就不行了。最后点击之后它周周围能出现8个点,那样给人一种能自由拉伸的感觉。我说的是VB6

VB的菜单,'工具'里面有添加控件集,自己去欣赏下那个代码,就可以了

帮你顶了

请高手指点啊,一楼说的不行。


前几天分析一个程序的时候。
发现这个算法很诡异。 有点像ASCII 的算法
但是经过一段时间比对后。 觉得有点不对劲
所以发上来 给大家一起研究下

初步是这样的
这是加密的
1=D
D=W
W=j
j=}
}=1
12=DG=W=jq=}'
123=DG}
1234=DG}L
12345=DG}Lq

a=t
ab=tw
abc=twN
abcd=twN|
abcde=twN|B

反过来解密的话是这样的
解密
1=}
2=~
12=}|
123=}|H
1234=}|H{
12345=}|H{X

a=N
ab=NM
abc=NMx
abcd=NMxL
abcde=NMxL)

真是难理解。 如果分多的话。。 我全部给出来。 帮忙分析下这个算法

最简单的循环移动(ROT)算法,加密为 +19,解密为 -19。

不懂  帮顶……

哇 2楼的真厉害
最简单的循环移动(ROT)算法,加密为 +19,解密为 -19。

这个我是研究了  1个星期 才弄出来的..

还能更详细点么?

顶一下

1)字符个数不变
2)每个字符的映射固定
3)再比较一下变换前后的 Ascii 值就知道了。

只要能做到一一对应,不出现一对多,或多对一的情况,你就可以任意得设一个对应表.
其实就是密码字典.

这个也是被加密过的
谁能解出来?
EF$Fm`u0j6($s31('s:EDF4 ii21W15E3d12WP#132j6)$w41R_q

破解要么是知道算法、密文求密码,要么知道明文、密文猜(无密码的)算法。
只有密文 Mission Impossible。

这个ROT的算法应该只要 解密的数字就行了吧?
谁能解出这个字符串的  我给人民币!!

算了。  我觉得我的帖子没什么意义
麻烦斑竹把这帖子删除掉
谢谢了


我想在grid上画图以实现程序的一些需要,比如画一些圆,折线等,效果类似于下面网址的那个效果,
http://zst.starlott.com/3d/jb.html
有没有办法实现,我想了很久了,好像vsgrid不提供在表格上画图的功能,我倒是想了一个办法,这个办法可能速度不行,还没实验呢,就是先在一个和表格一样大小的picture里画需要的图然后再根据表格把picture里的图分成一个一个的块,然后分别赋给相对应的单元格里。

顶一下,希望高手能发表一点意见

有没试过,在表格外画,用shape+line

是乎不该用表格来做这个,试试直接在窗体上画

呵呵,我也在想是否应该自己画了,正在考虑中。。。

我有一个思路,就是截获控件的WM_PAINT消息,先让控件本身绘制完,然后再绘制自己的图形,为了防止控件自动刷新,在完成绘图后需要明确指出控件的客户区为有效状态。如果嫌麻烦,那只能按你自己的思路进行了。


VB WebBrowser作编辑器,如何令ENTER换行而不是换段?
默认是ENTER换段的。
谢谢。

高手

高手来吧.

html里面换行: <br>
或者
<P> </P>

把web browser中接收的字符串, 替换

行不通.
换段它的HTML会是 <p> </p>,而换行是 <br>。
这个问题如果只是将其HTML输出的话,是可以用替换的方法解决的。
但是它有一个问题:如果是用按ENTER键来调用过程处理,那它就会在处理后留下一个 <p> </p>,并且下次处理前时不能消除。
求大虾帮忙。

LZ 想做什么    html编辑器?    问题说清楚点可以吗    可能是拦截enter按钮按后转换为 <br>什么的    可是你说的不清楚啊  http://www.vb110.com/  不错  有好多技术文章  有空可以去看下

作编辑器,有意思!加一个Timer定时检查,如果有替换掉。


在vb中 用Ado控件连接一个oracle 数据库
在ado属性页 填写命令文件(sql)
select * from mytable where enrolldate > 2008/01/01

显示错误ora-00932 不一致的数据类型,要求date得到的却是number

将语句改为select * from mytable where enrolldate > '2008/01/01'

显示错误ora-01861:文字与格式字符串不匹配

将语句改为select * from mytable where enrolldate > #2008/01/01#

显示错误ora-00911:无效字符

将语句改为select * from mytable where enrolldate > cdate(2008/01/01)

显示错误ora-00911:"cdate":无效的标识符

在英文状态下输入单引号
select * from mytable where enrolldate >'2008-01-01'
同样显示错误ora-01861:文字与格式字符串不匹配

表中的 enrolldate 是什么格式?

在pl/sql developer 中
用select * from mytable where enrolldate >'2008-01-01'
可以查询出来
不知道为什么ADo控件中却不行

日期格式

select * from mytable where enrolldate >'2008-01-01' '要在英文状态下输入单引号

我已经解决了.
select * from mytable where enrolldate >= to_date('2008-01-01','yyyy-mm-dd')


在VB6中用WebBrowser控件编辑WORD文件
将DOC文件嵌入WebBrowser控件进行编辑,,这时候有的工具栏按钮失效了,用VBA把工具栏的各个按钮的ENABLE值改为TRUE还是不行。。这是为什么呢。。

引用 1 楼 vansoft 的回复:
为什么用它呢?

微软有个开源的控件啊.

微软有个开源的控件???


VB6 + ado +ACCESS 做了个小程序,数据库连接给的也是网络文件夹的路径(应该没问题)
可是,情况是只有安装了VB软件的电脑可以使用,为什么呢?
开始报警少插件(.ocx),后来把system下的相关文件拷过去,结果不报警了
就是datagrid中没有数据显示,应该是没连上数据库,请高手指点怎么解决这个问题,谢谢

打包安装
用SetupFactory等工具

打包安装
用SetupFactory等工具

要把数据库共享吧,不共享应该不行的,你试试看。

谢谢楼上三位的意见,我已经尝试了,VB5.0,6.0都点上了,在别的机器商安装后还是报警
Class not registered
Looking for object with CLSID:{00000010-0000-0010-8000-00AA006D2EA4}

还有
Run-time eeror '713'
Class not registered
Looking for object with CLSID:{00000010-0000-0010-8000-00AA006D2EA4}

谁知道怎么回事吗?谢谢指点啊

在出错的机器上安装mdac2.8mdactype.exe试试,网上有下载的

在出错的机器上安装mdac2.8mdactype.exe试试,网上有下载的

制作个安装包不就行了

谢谢大家了
我的问题用2楼的
打包安装
用SetupFactory等工具
解决了

还是谢谢所有人哈


各位大哥,小弟最近用API函数调试串口,想做一个按输入的16进制字符串输出也是16进制的工具,使用Writefile写串口,但发现只能输入ASIIC范围内的字符串,试验时发现在“00”-“7F”没有问题,但超出7F就输出不正常,发现是受到ASIIC转换的限制,想问Writefile 是否能够向串口写入输出非ASIIC的字符,应该如何调整,附上部分代码请教,谢谢!
Public Declare Function WriteFile Lib "kernel32" _
    (ByVal hFile As Long, ByRef lpBuffer As Any, _
    ByVal nNumberOfBytesToWrite As Long, _
    ByRef lpNumberOfBytesWritten As Long, _
    ByRef lpOverlapped As Any) As Long 'OVERLAPPED) As Long

Private Sub cmdSend_Click()
    Dim sSend As String
    Dim lenBuf As Long          '存放将要写入串口的数据长度
    Dim NumberWritten As Long  '用来记录写入的字节长度
    Dim sSendchr As String
    Dim sSendchrTEMP As Long
    NumberWritten = 0
    sSend = Trim$(txtInput.Text) '输入的16进制字符串数
    lenBuf = Len(sSend) - 1
    sSendchrTEMP = CInt("&H" & sSend) '字符串转换为16进制数
    sSendchr = Chr(sSendchrTEMP)  '取得ASIIC值
    PurgeComm nSendHand, PURGE_RXABORT Or PURGE_RXCLEAR  '清空缓冲区
    If WriteFile(nSendHand, ByVal sSendchr, lenBuf, NumberWritten, ByVal 0&) <= 0 Then
        MsgBox "向串口写数据发生错误!"
    End If
    Exit Sub
err:
    MsgBox err.Description
End Sub

好像没有地方可以修改这个值,Chr函数只能获取0-127的ASIIC,一旦输入Chr(128或以上)输出的字符都是“?”,无法还原到ASIIC了。

用 ChrW()

不用字符串的方式,改用字节数组的方式发送就没这问题。也就是WriteFile中的Byval sSendChr这个参数改成字节数组或整形数组。

用ChrW还是不行,超过128的还是出现“?”

谢谢 “三楼的狼”,问题已经解决,加分