MySQL数据导入程序

作者:无名 - 数据库 -

  • 下载源 126.1 kb

介绍

我需要将 sql server 中的数据导入到 mysql。 我第一次尝试使用 mysql workbench,但遇到了一些问题。 所以我编写了一个工具来将表模式和数据复制到 mysql。 你可以在这里下载。

背景

我已经对 sql server 和access数据库进行了测试。 不支持所有数据类型。 你可以修改应用程序以支持其他数据类型和数据库( 就像甲骨文)。

必需的组件

如果你没有 mysql odbc驱动程序或者 microsoft access oledb提供程序,你可以在这里下载它们:

  • microsoft access 数据库引擎
  • 选择 version version,选择 version no just start start start"

使用代码

当你单击连接按钮时,你将得到oledb对话框,要求你选择提供程序和连接信息。 在这里你还可以测试连接。 由 editconnectionstring() 函数返回的连接字符串存储在 windows 注册表中。

privatesubbtnconnect_click(byval sender as system.object, byval e as system.eventargs) _handles btnconnect.click

dim sconnectionstring asstring = "provider=sqloledb.1" sconnectionstring = editconnectionstring(sconnectionstring)

if sconnectionstring = ""thenexitsubendif txtconnect.text = sconnectionstring

dim oappregistry asnew appregistry

oappregistry.setregistryvalue("connectionstring", sconnectionstring)

settablecombo()endsub

editconnectionstring 函数使用数据链路activex对象来根据用户输入生成连接字符串。 ease对象的易用性是我为这个应用选择 vb.net的主要原因。

protectedfunctioneditconnectionstring(byval sconnectionstring asstring) asstringtrydim odatalinks asobject = createobject("datalinks")

dim cn asobject = createobject("adodb.connection")

cn.connectionstring = sconnectionstring

odatalinks.hwnd = me.handle

ifnot odatalinks.promptedit(cn) then'user pressed cancel buttonreturn""endif cn.open()

return cn.connectionstring

catch ex as exception

msgbox(ex.message)

return""endtryendfunction

输入mysql服务器信息并单击测试后,连接信息将保存到注册表中,getmysqlconnectionstring() 将创建mysql连接字符串。 用户将看到成功消息框或者错误消息框。

privatesubtxttest_click(sender as system.object, e as system.eventargs) handles txttest.click

dim oappregistry asnew appregistry

oappregistry.setregistryvalue("driver", cbodriver.text)

oappregistry.setregistryvalue("server", txtserver.text)

oappregistry.setregistryvalue("database", txtdatabase.text)

oappregistry.setregistryvalue("user", txtuser.text)

oappregistry.setregistryvalue("password", txtpassword.text)

trydim cnodbc as odbcconnection = new odbcconnection(getmysqlconnectionstring())

cnodbc.open()

cnodbc.close()

catch ex as exception

msgbox(ex.message)

exitsubendtry msgbox("success")endsub

打开表单时,这里 sub 将从注册表中检索连接字符串。 它还将调用 settablecombo() 来填充可用表的列表。

privatesubfrmexport_load(sender as system.object, e as system.eventargs) handlesmybase.load

dim oappregistry asnew appregistry

txtconnect.text = oappregistry.getregistryvalue("connectionstring")

if txtconnect.text lt;gt; ""then settablecombo()

endifdim sdriver asstring = oappregistry.getregistryvalue("driver")

if sdriver = ""then cbodriver.selectedindex = 0else cbodriver.selecteditem = sdriver

endif txtserver.text = oappregistry.getregistryvalue("server")

txtdatabase.text = oappregistry.getregistryvalue("database")

txtuser.text = oappregistry.getregistryvalue("user")

txtpassword.text = oappregistry.getregistryvalue("password")endsub

settablecombo() 以填充可用表的列表。 它使用 getoledbschematable() 函数从oledb连接获取表列表。

subsettablecombo()

cbotable.items.clear()

dim otable as datatable

trydim cnoledb asnew oledbconnection(txtconnect.text)

cnoledb.open()

otable = cnoledb.getoledbschematable(oledbschemaguid.tables, _

newobject() {nothing, nothing, nothing, "table"})

cnoledb.close()

catch ex as exception

msgbox(err.description)

exitsubendtryfor i asinteger = 0to otable.rows.count - 1dim sschema asstring = otable.rows(i)("table_schema") amp; ""dim stablename asstring = otable.rows(i)("table_name") amp; "" cbotable.items.add(stablename)

nextif cbotable.items.countgt; 0then cbotable.selectedindex = 0endifendsub

当单击"复制表格"按钮时,这里 sub 将检查 settablecombo() 是否填充表列表并检查用户是否选择了导出表。 接下来,它将遍历所选表的列表,并为每个表调用 exporttable sub

privatesubbtnexport_click(byval sender as system.object, byval e as system.eventargs) _handles btnexport.click

if cbotable.items.count = 0then msgbox("please connect to the source database.")

exitsubendifif cbotable.checkeditems.count = 0then msgbox("please select tables to copy.")

exitsubendif txtlog.clear()

if cbotable.checkeditems.countgt; 0thendim cnodbc as odbcconnection = new odbcconnection(getmysqlconnectionstring())

cnodbc.open()

dim cn asnew oledbconnection(txtconnect.text)

cn.open()

for i asinteger = 0to cbotable.checkeditems.count - 1dim stable asstring = cbotable.checkeditems(i).tostring

exporttable(stable, cn, cnodbc)

next cnodbc.close()

cn.close()

endifendsub

exporttable 是最重要的sub:

  • 它首先将目标表的记录计数获取到 imysqlreccount 中。
  • 如果有数据并且用户选择了"插入前清空目标表",那么目标表中的所有记录都将被删除。
  • 如果用户选择了"创建目标表( 如果存在则删除),sub 将删除目标表( 如果存在) 并创建新的目标表。 getcolumnstableaccess 函数将用于获取访问的sql,getcolumnstablesqlserver 将用于 sql server。
  • 它首先将源表的记录计数获取到 icount 中。
  • 最后,它为每个源记录生成 insert into 语句并针对目标数据库运行它。
privatesubexporttable(byval stablename asstring, byref cn as oledbconnection, _byref cnodbc as odbcconnection)

dim bmysqltableexists asboolean = falsedim imysqlreccount asinteger = 0trydim omysqlcmd asnew odbccommand("select count(*) from" amp; stablename, cnodbc)

imysqlreccount = integer.parse(omysqlcmd.executescalar().tostring())

bmysqltableexists = truecatch ex as exception

'ignore - asume table dos not existendtryif chkdeletedata.checked and imysqlreccountgt; 0then log("deleteting data from table:" amp; stablename)

openconnections(cn, cnodbc)

dim ssql1 asstring = "delete from" amp; stablename

dim ocmd1 asnew odbccommand(ssql1, cnodbc)

try ocmd1.executenonquery()

catch ex as exception

log(ex.message amp; vbtab amp; "sql:" amp; ssql1)

endtryendifif chkcreatetable.checked thenif bmysqltableexists then log("drop table:" amp; stablename)

dim ocmddrop asnew odbccommand("drop table" amp; padquotes(stablename), cnodbc)

try ocmddrop.executenonquery()

bmysqltableexists = falsecatch ex as exception

log("could not drop table:" amp; stablename amp; "," amp; ex.message amp; vbtab)

endtryendif log("create table:" amp; stablename)

openconnections(cn, cnodbc)

'make create table statementdim sconnectionstring asstring = txtconnect.text.toupper()

dim ssql1 asstring = ""if sconnectionstring.indexof(".ace.oledb") = -1 _

orelse sconnectionstring.indexof(".jet.oledb") = -1 then ssql1 = getcolumnstableaccess(stablename, cn)

else ssql1 = getcolumnstablesqlserver(stablename, cn)

endifdim ocmd1 asnew odbccommand(ssql1, cnodbc)

try ocmd1.executenonquery()

bmysqltableexists = truecatch ex as exception

log(ex.message amp; vbtab amp; "sql:" amp; ssql1)

endtryendifdim ssql asstring = "select count(*) from" amp; padquotes(stablename)

dim cmd asnew oledbcommand(ssql, cn)

dim icount asinteger = integer.parse(cmd.executescalar().tostring())

if icount = 0then'nothing to copy - exitexitsubendifif bmysqltableexists = falsethen log("destination table does not exist:" amp; stablename)

exitsubendif'copy data progressbar1.maximum = icount

lbcount.visible = true log("copying" amp; icount amp; " rows from table:" amp; stablename)

cmd = new oledbcommand("select * from" amp; stablename, cn)

dim dr as oledbdatareader = cmd.executereader()

dim oschemarows as data.datarowcollection = dr.getschematable.rows

dim srow asstringdim i asintegerdim irow asinteger = 0'get headerdim sheader asstring = ""for i = 0to oschemarows.count - 1dim scolumn asstring = oschemarows(i)("columnname")

if i lt;gt; 0then sheader += ","endif sheader += scolumn

nextwhile dr.read()

srow = ""for i = 0to oschemarows.count - 1if srow lt;gt; ""then srow += ","endif srow += getvaluestring(dr.getvalue(i))

next openconnections(cn, cnodbc)

dim ssql1 asstring = "insert into" amp; stablename _

amp; " (" amp; sheader amp; ") values (" amp; srow amp; ")"dim ocmd1 asnew odbccommand(ssql1, cnodbc)

try ocmd1.executenonquery()

catch ex as exception

log(ex.message amp; vbtab amp; "sql:" amp; ssql1)

endtry irow += 1 progressbar1.value = irow

lbcount.text = irow.tostring()

lbcount.refresh()

endwhile dr.close()

progressbar1.value = 0 lbcount.visible = false lbcount.text = "" log("finished processing" amp; stablename)endsub

openconnections sub 经常被调用,以防数据库连接被关闭。

privatesubopenconnections(byref cn as oledbconnection, byref cnodbc as odbcconnection)

if cn.state lt;gt; connectionstate.open then cn.open()

endifif cnodbc.state lt;gt; connectionstate.open then cnodbc.open()

endifendsub

getmysqlconnectionstring 函数将基于用户信息创建mysql连接字符串。

function getmysqlconnectionstring() asstringreturn"driver={" amp; cbodriver.text amp; "};option=3" amp; _

";server=" amp; txtserver.text amp; _

";port=;database=" amp; txtdatabase.text amp; _

";user=" amp; txtuser.text amp; _

";password=" amp; txtpassword.text amp; ";"endfunction

log sub 将向用户显示进度日志。

privatesub log(s asstring)

txtlog.text += s amp; vbcrlf

txtlog.refresh()endsub

exporttable 函数使用 getvaluestring 函数生成 insert into 语句。

privatefunctiongetvaluestring(byval obj asobject) asstringif (isdbnull(obj)) thenreturn"null"selectcase obj.gettype.fullname

case"system.boolean"if (obj = true) thenreturn"1"elsereturn"0"endifcase"system.string"dim str asstring = obj

return"'" + str.replace("'", "''") + "'"case"system.datetime"return"str_to_date('" + obj.tostring() + "','%m/%d/%y %r')"case"system.drawing.image"return"null"case"system.drawing.bitmap"return"null"case"system.byte[]"return"0x" + gethexstring(obj)

caseelsereturn obj.tostring()

endselectendfunction

gethexstring 函数将二进制数据编码为十六进制字符串。 这里函数由 getvaluestring 调用。

privatefunction gethexstring(byref bytes() asbyte) asstringdim sb asnew system.text.stringbuilder

dim b asbytedim i asinteger = 0foreach b in bytes

i += 1 sb.append(b.tostring("x2"))

if igt; 10thenreturn sb.tostring()

endifnextreturn sb.tostring()endfunction

getcolumnstablesqlserver 函数使用 sql server information_schema.columns 系统视图来创建 create table 语句。

privatefunction getcolumnstablesqlserver(byval stablename asstring, _byref cn as oledbconnection) asstringdim sb asnew system.text.stringbuilder()

sb.append("create table" amp; stablename amp; " (" amp; vbcrlf)

dim ssql asstring = "select * from information_schema.columns _

where table_name = '"
amp; padquotes(stablename) amp; "'"dim cmd asnew oledbcommand(ssql, cn)

dim dr as oledbdatareader = cmd.executereader()

dim i asinteger = 0while dr.read

dim scolumn asstring = dr.getvalue(dr.getordinal("column_name")).tostring()

dim sdatatype asstring = dr.getvalue(dr.getordinal("data_type")).tostring()

dim ballowdbnull asboolean = dr.getstring(dr.getordinal("is_nullable")) = "yes"dim scolumnsize asstring = dr.getvalue(dr.getordinal_

("character_maximum_length")).tostring()

'sql server to mysql data type converterselectcase lcase(sdatatype)

case"money" : sdatatype = "decimal"case"ntext" : sdatatype = "text"case"smalldatetime" : sdatatype = "datetime"endselectif sdatatype = "decimal"orelse sdatatype = "numeric"thendim sprecision asstring = dr.getvalue(dr.getordinal_

("numeric_precision")).tostring() amp; ""dim sscale asstring = dr.getvalue(dr.getordinal("numeric_scale")).tostring() amp; "" sdatatype += "(" amp; sprecision amp; "," amp; sscale amp; ")"elseif sdatatype = "text"orelse sdatatype = "image"then scolumnsize = ""endifif igt; 0then sb.append(",")

sb.append(vbcrlf)

endif sb.append(padcolumnname(scolumn))

sb.append("" amp; sdatatype)

if scolumnsize lt;gt; ""then sb.append("(" amp; scolumnsize amp; ")")

endifif ballowdbnull then sb.append(" null")

else sb.append(" not null")

endif i += 1endwhile sb.append(")")

dr.close()

if i = 0thenreturn""elsereturn sb.tostring()

endifendfunction

getcolumnstableaccess 函数使用 oledbdatareader.getschematable.rows 为 ms access 创建 create table 语句。

privatefunction getcolumnstableaccess(byval stablename asstring, _

byref cn as oledbconnection) asstringdim sb asnew system.text.stringbuilder()

sb.append("create table" amp; padcolumnname(stablename) amp; " (" amp; vbcrlf)

dim ssql asstring = "select * from" amp; padcolumnname(stablename) amp; " where 0=1"dim cmd asnew oledbcommand(ssql, cn)

dim dr as oledbdatareader = cmd.executereader()

dim oschemarows as data.datarowcollection = dr.getschematable.rows

dim skeycolumns asstring = ""dim i asinteger = 0for icol asinteger = 0to oschemarows.count - 1dim scolumn asstring = oschemarows(icol).item("columnname").tostring() amp; ""dim scolumnsize asstring = oschemarows(icol).item("columnsize").tostring() amp; ""dim sdatatype asstring = oschemarows(icol).item("datatype").fullname.tostring()

dim ballowdbnull asboolean = oschemarows(icol).item("allowdbnull") 'does not always workif igt; 0then sb.append(",")

sb.append(vbcrlf)

endif sb.append(padcolumnname(scolumn))

sb.append("" amp; padaccessdatatype(sdatatype, scolumnsize))

if ballowdbnull then sb.append(" null")

else sb.append(" not null")

endif i += 1next sb.append(")")

dr.close()

if i = 0thenreturn""elsereturn sb.tostring()

endifendfunction

padaccessdatatype 函数为访问 vs mysql数据类型创建映射。

privatefunction padaccessdatatype(byval sdatatype asstring, byval scolumnsize asstring) asstring sdatatype = replace(sdatatype, "system.", "")

selectcase lcase(sdatatype)

case"string" : sdatatype = "varchar"case"int16" : sdatatype = "smallint"case"int32" : sdatatype = "int"case"int64" : sdatatype = "bigint"endselectif scolumnsize lt;gt; ""thenreturn sdatatype amp; "(" amp; scolumnsize amp; ")"elsereturn sdatatype

endifendfunction

padquotes helper 函数将单引号替换为双引号。

publicfunction padquotes(byval s asstring) asstringif s = ""thenreturn""endifreturn (s amp; "").replace("'", "''")endfunction

padcolumnname helpr函数将字符串封装到mysql引号中。

publicfunction padcolumnname(byval stable asstring) asstringreturn"`" amp; stable amp; "`"endfunction

下面是 appregistry.vb 模块的代码。

imports microsoft.win32publicclass appregistry

dim sregkey asstring = "softwarekrupitsky labscopytable"dim sregkey64 asstring = "softwarewow6432nodekrupitsky labscopytable"

setregistryvalue sub 将一个值保存到 windows 注册表中。

publicsub setregistryvalue(byval skey asstring, byval svalue asstring)

'update registrytrydim okey as registrykey = registry.localmachine.opensubkey(sregkey, true)

if okey isnothingthen okey = registry.localmachine.createsubkey(sregkey)

endififnot okey isnothingthen okey.setvalue(skey, svalue)

endifcatch ex as exception

msgbox("update registry failed:" amp; ex.message,, "deleteblankpages")

endtryendsub

getregvalue 从 windows 注册表获取值。

privatefunction getregvalue(byval sfolder asstring, byval skey asstring) asstringdim okey as registrykey = registry.localmachine.opensubkey(sfolder, false)

dim svalue asstring = ""ifnot okey isnothingthen svalue = okey.getvalue(skey)

okey.close()

endifreturn svalue

endfunctionendclass

我希望有人会发现。



文章标签:数据imp导入data-importer数据导入

该篇内容就是由IT人知识库(原文链接:http://www.itpeo.net/12720/4623041.html)小编为各位整理





rfedfre

将 C# 连接到 MySQL

下载演示 127.6 kb下载源 15.43 kb介绍本文的目的是在一步一步地展示如何使用 c# 连接/网络来使用和连接 ...

rfedfre

消息管理器

下载数据库查询- 711下载源代码 3.08介绍正如你所知道的,在internet上的java ( netbeans ) ...

从头开始编写MySQL存储引擎

介绍本文总结了我在编写新的mysql存储引擎("") 时所学到的东西。 mysql引擎存储是负责实际存储磁盘上数据并提供 ...

rfedfre

了解 Amazon Web Services

介绍亚马逊作为全球最大的在线零售商,也被称为云计算浪潮的先驱。 它为 amazon ec2和s3提供了第一个 infra ...

rfedfre

RaptorDB key-value 存储

key-value 存储下载源 v1 23.48下载 raptordb_ v1.1. zip 28.06 kb下载 r ...

MongoDB基础知识

介绍以前,我听说 mongodb,我开始搜索搜索引擎来了解它的作用域。 我在各种网站和书籍上发现大量的支持材料。 然后, ...

改进搜索框的简单 Pattern 匹配技术

下载 wordsearch 3.16介绍难怪大家都喜欢谷歌搜索引擎和搜索框建议。 智能友好的搜索匹配建议使它成为一个出色 ...

rfedfre

SqlProcedure提高数据库性能,消除错误并减少代码

下载工具包源 17.0 kb下载源 114.1 kb下载演示项目 330.3 kb内容摘要文件背景信息的陷阱。解决方案失 ...

rfedfre

.NET 存储过程包装器&类型数据集生成器

下载源文件 44.4 kb下载演示文件 21.9 kb这是什么on是一个小工具,可以为 sql server 上的选定存 ...

rfedfre

DBLayer向导V 1.0

下载演示项目 35.5 kb下载源 37.3 kb介绍这是dblayer向导的第一个版本。 它是文件格式中生成n 层结构 ...

mysqlhotcopy工具不再使用

mysql团队正在考虑不再使用mysqlhotcopy工具,一些背景,下面是来自mysql手册 :mysqlhotcop ...

rfedfre

OLE DB使用者使用基本 c++

lt;--下载链接 --gt; !下载源文件 170 kb下载northwind数据库 603 kb介绍本文是系列ole ...

rfedfre

可视化SQL查询设计器

下载演示项目 47.7 kb下载源( c# ) 83.7 kb下载源( vb ) 79.8 kb介绍本文描述了 quer ...

创建oledb数据提供程序

lt;--下载链接 --gt; !下载源文件 99 kblt;--将你的html其余部分添加到 --gt; !介绍ole ...

在OLE数据库数据源,中,避免单行注释

我知道,这对文章来说太小了。 我只是不能把它的html给小费- 我看到所有标签和其他的预览。 所以,如果你不同意这是文章 ...

原始OLEDB类库

下载源 43 kb概述原始oledb的讨论很少,而且对于很多人来说,与com一起工作是一个噩梦。 无论如何,如果不能在原 ...

rfedfre

在 C# 中,SharpHSQL编写一个SQL引擎

下载演示项目 96 kb介绍.net c# 如果你没有被新的微软计划销售,那么你已经在没有网络连接的多维数据集中了。! ...

带有保存点的System.Data.SQLite的嵌套事务

下载源 1.3 kb下载演示 14.9 mb介绍sqlite本质上不允许嵌套事务。 但是,它允许使用中间保留点标记事务, ...

如何编写 Pl/PgSQL 函数( 针对 PostgreSQL 8.3 )

介绍这是在 pl/pgsql 中编写基本函数的介绍。 在postgresql中,术语"函数"与 sql server 中 ...

rfedfre

在使用本机Web服务的sqlanywhere服务器上,使用Web启用数据

介绍可以将服务器数据公开到 intranet/internet,因为本机 web服务 可以在数据库本身创建服务。 在它的 ...