|
楼主 |
发表于 2016-4-4 19:44
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 hyefeifei 于 2016-5-16 14:28 编辑
话说上一讲说到,要正确插入数据,必须先用Parameters Pefresh方法向数据库取元数据,然后才可以正确插入数据,但是数据库表是我们创建的,我们自然知道字段信息,所以不必去数据库取,直接告诉ado即可。
全过程如下:
1、创建一个command对象cmd,为cmd的commandtext属性赋值:
Cmd.CommandText ="INSERT INTO Fltab VALUES (?,?,?,?,?) 2、用Cmd的createparameter(创建参数)方法,创建5个参数,对应查询语句的5个问号。
3、把创建的5个参数用参数集合的append方法添加到Parameters(参数集合)中。
4、为5个参数赋值。
5、用execute方法执行命令
见图:
这里第2步创建5个参数,即是告诉ado表的字段信息,这样就不必用refresh方法连数据库去取字段信息了。
简单讲一下createparameter方法: 我把数据库表五个字段的数据类型截给大家看一下: 这里sqlnvarchar对应的是adVarChar,也就是说ADO有自己的一套常数,对应于sql的数据类型,那么,我怎么知道sql的int,nvarchar等对应的ado常数呢?在这里,我把常用的整理放在下面,供各位朋友参考,欲求全的话,可以百度一下:
ADO | SQL Server | adBoolean | bit | adChar
| char | adCurrency
| money smallmoney
| adDBTimeStamp
| datetime smalldatetime
| adDouble
| float | adInteger
| identity int
| adNumeric
| decimal numeric
| adVarWChar
| nvarchar | adWChar
| nchar |
完整程序代码如下:
- Sub InsertAdd()
- Dim cmd As Object
- Dim arr
- Dim i As Long
- Connect "test"
- Conn.Open
- Set cmd = CreateObject("adodb.command")
- arr = ThisWorkbook.Worksheets("Fltab").Range("a2:e29")
- With cmd
- .CommandText = "INSERT INTO Fltab VALUES (?,?,?,?,?)"
- Set .activeconnection = Conn
- '.Parameters.Refresh '由于下面人工定义了参数类型,所以就不必从服务器取参数类型了
- '建议这样做,虽然代码多了些,但执行效率高了。
- .Parameters.append .createparameter(, adVarChar, adParamInput, 30)
- .Parameters.append .createparameter(, adInteger, adParamInput)
- .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
- .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
- .Parameters.append .createparameter(, adVarChar, adParamInput, 20)
- For i = 1 To UBound(arr)
- .Parameters(0) = arr(i, 1)
- .Parameters(1) = arr(i, 2)
- .Parameters(2) = arr(i, 3)
- .Parameters(3) = arr(i, 4)
- .Parameters(4) = arr(i, 5)
- .Execute Options:=adCmdText + adExecuteNoRecords
- Next
- End With
- End Sub[/align]
复制代码
|
这种直接操作数据库的方式虽然没啥问题,但是,我始终感觉,最好还是用select语句,把数据取回本地形成本地临时表,然后再操作数据库比较方便,在这个例子中虽然体现不出这种方式的好处,但你总用临时表,就会越来越觉得临时表方式的方便之处了。那么该如何做呢?
如果有下一讲,那就下一讲再说吧。 |
|
|