|
本帖最后由 hyefeifei 于 2016-5-16 19:27 编辑
关于ado这个话题,曾试讲了一次,因效果不甚理想,致半途而废,自己水平有限固是主因,但ADO本身难讲,且用sql数据库的朋友相对不多,不能不说也是原因,此次再讲,不知结果如何,且讲且看吧,如果反响多些,或许多讲些。当然讲的过程,也是与网友交流学习的过程,希望大家多批评指正。
此次采取以问题为驱动的方式来讲,闲话少叙,进入正题。
一、如何把excel的数据写入数据库(1)
例表:(取自本版网友提问贴)
程序代码:
Sub InsertFltab()
Dim cmd As Object
Dim arr
Dim i As Long
Connect "Test"
Conn.Open
arr = ThisWorkbook.Worksheets("Fltab").Range("a2:e29")
Set cmd = CreateObject("adodb.command")
With cmd
.CommandText = "INSERT INTO fltab values(?,?,?,?,?)"
Set .activeconnection = Conn
For i = 1 To UBound(arr)
cmd.Execute Parameters:=Array(arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 5)), _
Options:=adCmdText + adExecuteNoRecords
Next
End With
End Sub
|
Connect "Test" → 为了不妨碍主要代码,把固定的连接数据库代码做成了单独的程序。附件中会有完整代码。它的意思是连接Test数据库,此前在此数据库上已经建了Fltab表,表的结构如图:
Conn.Open→因为在Connect程序中有Conn.close,所以这里要把它打开,另外,Conn在模块顶部声明为:Public Conn as object,各位打开附件一看就明白了。
arr = ThisWorkbook.Worksheets("Fltab").Range("a2:e29")→这句就不用讲了吧。
Set cmd = CreateObject("adodb.command")→可以说,在ado中,从来不用command对象,也能完成所有任务,但有时候使用它会简化程序。这里我使用了后期引用,纯属习惯。
CommandText = "INSERT INTO fltab values(?,?,?,?,?)"→command的commandtext属性设置命令文本,这个属性是必须的,没命令内容,也就无所谓执行命令了。
INSERT INTO fltab values(?,?,?,?,?)一句,完整应为:
INSERT INTO fltab (ZY编号,序号,部件,零件,工序) values(?,?,?,?,?)
这里把字段名省略了,如果你不是插入所有字段的值,比如你只想插入序号,工序这两个字段的值,其他字段都是空值,就不能省了,你必须告诉ado你插入的值对应哪个字段。
Set .activeconnection = Conn→这个属性设置一个活动连接对象,以便与数据库通信
cmd.Execute Parameters:=Array(arr(i, 1), arr(i, 2), arr(i, 3), arr(i, 4), arr(i, 5)),Options:=adCmdText + adExecuteNoRecords
Execute方法执行commandtext属性设置的命令,它有三个参数,咱们一个一个来讲:
①RecordsAffected,顾名思义,它返回的是你执行命令,影响了多少条记录。在这里,如果我们使用它,须先声明一个长整形的变量 dim affs as long,代码如下:
cmd.Execute RecordsAffected:=affs,Parameters:=Array(arr(i, 1), arr(i, 2),arr(i, 3), arr(i, 4), arr(i, 5)),Options:=adCmdText + adExecuteNoRecords
|
在这里,它返回的始终是1,因为我们每次插入了一条记录。
②Parameters,它接受一个数组,这个数组每个值,对应前面的问号。
③Options,这个参数是一个位掩码形的参数,各位只须记住adCmdText +
adExecuteNoRecords 这个组合就可以了,adCmdText是说.CommandText属性的内容是sql语句,adExecuteNoRecords是说Execute方法不要返回记录。其他组合基本不必使用。
位掩码:这里提到位掩码参数,精确解说各位可百度,这里举例说明一下:
比如说一个对象有abcd四个类型,可用1,2,3,4 表示;又有三种颜色rgb(红绿蓝),可用1,2,3表示,那么我们可以用2个参数 参数甲=2,参数乙=3,表示b型蓝色,但是我们有没有可能使用一个参数来表示b型蓝色呢?当然可以,我们可用 参数丙=2+3来表示,但这里有一个问题,比如,我们要表示a型红色,a型为1,红色为1,我们用 参数丙=1+1 表示,但1+1为2,这里2表示的是b型,也表示绿色,这怎么办?答案在于如何设计参数的值,这里,我们这样设计参数 abcd四个类型 用 2的0次方,2的1次方,2的2次方,2的3次方表示abcd,rgb三种颜色,用2的4次方,2的5次方,2的6次方表示,这样 abcd对应1,2,4,8,rgb对应16,32,64,当我们如此设置了参数值,我们无论如何组合参数,都不会有重复,各位可以试试看。现在,我们要表示a型红色,就可以用 参数丙=1+16来表示,如果我们要表示b型黄色呢?稍懂颜色的人都知道,黄色为红+绿,所以我们可以用 参数丙=2+16+32来表示,2为b型,16为红色,32为绿色。
说回Options,它可以是下面常量的组合:
adCmdText | 1 | 用SQL语句给CommandText赋值 | adCmdTable | 2 | 用表名给CommandText赋值 | adCmdStoredProc | 4 | 用存储过程名CommandText赋值 | adCmdUnknown | 8 | 指出在CommandText中命令的类型未知 | adAsyncExecute | 16 | 异步地执行操作 | adAsyncFetch | 32 | 异步地获得记录 | adAsyncFetchNonBlocking | 64 | 异步地获得记录,不阻碍随后的操作 | adExecuteNoRecords | 128 | 指出CommandText不返回记录 |
也许有的朋友注意到,我用的是后期引用,使用的却是adcmdtext这样的常量,实际上,我是把程序中使用的常量,都用 public const adCmdText as long=1这种方式做了声明,毕竟adCmdText这种常量用的久了可以记住,而1234这些数字,再怎么用也难以记住。但如果比如你在asp中用ado的话,那就只能用数字了,记得我在坛里发过ado常量列表,可位可以找找看。
好了,各位运行以上程序,向数据库插入数据后,进到数据库,查看fltab表,会发现表如图所示:
大家看“ZY编号”一列,很显然有错误,为什么会发生错误,如何解决呢?加一条语句就可了,答案在下一讲,有兴趣可先百度一下,我们下次继续讲如何把excel的数据写入数据库。
本讲附件:
再讲ADO1.rar
(27.66 KB, 下载次数: 959)
|
|
评分
-
9
查看全部评分
-
|