ODBC驱动可以搜索“数据库类型 windows ODBC 插件”安装;DSN需要在开始菜单,Windows管理工具中找“ODBC 数据源(32 位)”,此处如果用32位的AHK则用32位的版本添加,不然无法访问。
a := new adodb a.open("DSN=testdb;UID=thinkai;PWD=password;") ;到DSN里面配置了用户名密码则UID PWD不用配置。 ret := a.GetTable("select getdate()") MsgBox % ret.1.1 class adodb { ;static conn __New() ;新建 { this.conn:= ComObjCreate("ADODB.connection") ;初始化COM } open(connect_str) ;打开文件 { try this.conn.Open(connect_str) catch e return e.Message } close() ;关闭文件 { this.conn.Close() } GetTable(sql) { t := [] query := this.conn.Execute(sql) if RegExMatch(sql,"i)^select*") { try { fetchedArray := query.GetRows() ;取出数据(二维数组) colSize := fetchedArray.MaxIndex(1) + 1 ;列最大值 tips:从0开始 所以要+1 rowSize := fetchedArray.MaxIndex(2) + 1 ;行最大值 tips:从0开始 所以要+1 loop, % rowSize { i := (y := A_index) - 1 t[y] := [] loop, % colSize { j := (x := A_index) - 1 t[y][x] := fetchedArray[j,i] ;取出二维数组内值 } } } query.Close() return t } } }
source := "src.xls" ;源文件 target := "[a].[dbo].[test_table]" ;数据库目标表 has_create_tab := 0 ;是否已创建表 xlsdb := new exceldb() ;创建excel adodb连接,获取数据表信息 xlsdb.open(source) sheet := xlsdb.GetTableInfo() ;数据库连接 conn := ComObjCreate("ADODB.connection") conn.Open("driver={SQL Server};server=192.168.8.2;uid=thinkai;pwd=02EdDd68F5CC83__;database=a") ;打开连接 ;遍历有效sheet for k,v in sheet { fields := v if !has_create_tab ;尝试创建表 { f := "" for x,y in v f .= f ? ",[" y "] nvarchar(255) NULL" : "[" y "] nvarchar(255) NULL" try conn.Execute("CREATE TABLE " target " (" f ");") } field := "" ;生成字段串 注意表格里面的字段名称应和数据库中的字段一致 for x,y in v field .= field ? ",[" y "]" : "[" y "]" tmp_result := xlsdb.GetTable("SELECT * FROM [" (InStr(k,"$") ? k : k "$") "];") ;获取单个sheet的全部数据 for row,vaules in tmp_result { tmp_str := "" for k,v in vaules tmp_str .= tmp_str ? ",'" v "'" : "'" v "'" conn.Execute("INSERT INTO " target " VALUES (" tmp_str ")") ;插入语句 } } MsgBox, OK getto(str){ o := [] Loop, Parse, str, `n, `r { IfInString, A_LoopField, `t { t := StrSplit(A_LoopField,"`t") o[t[1]] := t[2] } } return o } class exceldb { ;static conn __New() ;新建 { this.conn:= ComObjCreate("ADODB.connection") ;初始化COM } open(file) ;打开文件 { IfExist % file this.conn.Open("Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" file) ;打开连接 ;this.conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=Yes';Data Source=" file) ;打开连接 2003方式 } close() ;关闭文件 { this.conn.Close() } GetTableInfo() ;获取所有Sheet及字段信息 { ;通过OpenSchema方法获取表信息 rs := this.conn.OpenSchema(20) ;SchemaEnum 参考 http://www.w3school.com.cn/ado/app_schemaenum.asp t := [] rs.MoveFirst() while !rs.EOF { t_name := RegExReplace(rs.("TABLE_NAME").value,"^'*(.*)\$'*$","$1") q := this.conn.Execute("select top 1 * from [" t_name "$]") if (q.Fields(0).Name="F1" && q.Fields.Count=1) ;排除空表格 { rs.MoveNext() continue } t[t_name] := [] for field in q.Fields ;获取按顺序排列的字段 t[t_name].insert(field.Name) q.close() rs.MoveNext() } return t } GetTable(sql) { t := [] query := this.conn.Execute(sql) if RegExMatch(sql,"i)^select*") { fetchedArray := query.GetRows() ;取出数据(二维数组) colSize := fetchedArray.MaxIndex(1) + 1 ;列最大值 tips:从0开始 所以要+1 rowSize := fetchedArray.MaxIndex(2) + 1 ;行最大值 tips:从0开始 所以要+1 loop, % rowSize { i := (y := A_index) - 1 t[y] := [] loop, % colSize { j := (x := A_index) - 1 t[y][x] := fetchedArray[j,i] ;取出二维数组内值 } } query.Close() return t } } }
49 queries in 1.365 seconds |