在VB.NET中怎么写这个行大容量数据导入到SQL数据库的代码(每次导入的数据量都至少在10万条以上),请大侠帮忙

dreamice01 2008-06-17 10:44:42
WEB页面上一个文档选择对话框,一个导入按钮。由用户在本地计算机选择导入文档,点击按钮实现数据导入功能。

考虑到每次用户都是用一个EXCEL文档导入数据,每个EXCEL文档会有多个工作表,因此,想通过由用户一次选择文档,导入一个EXCEL文档的全部数据的功能。

但在以下代码中,无法实现这种功能,而如果把两个参数:文档名与工作表名全部固定,就可以顺利导入,请问,那个导入的STRING怎么写,怎么用连接字符把它们给连起来。

Private Sub dataimport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dataimport.Click

Dim strPath As String = File1.PostedFile.FileName ‘由用户选择所在的文件路径
Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & "; Extended Properties=Excel 8.0;"

Dim olecn As New OleDb.OleDbConnection

olecn.ConnectionString = sConnectionString

olecn.Open()
'Console.WriteLine("数据表已经连接上"),获取excel表

Dim tblname As DataTable = olecn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})

'获取sheet名,其中(0)(1)...(N): 按名称排列的表单元素

Dim k As Integer, l As Integer

Dim tablename As String = ""
Dim TABLEEXCEL As New DataSet

Dim table_name(tblname.Rows.Count - 1) As String

For k = 0 To tblname.Rows.Count - 1

tablename = tblname.Rows(k)(2).ToString().Trim

table_name(k) = "[" & tablename.Replace(" ' ", " ") & "]"

Dim sqlcn As SqlClient.SqlConnection = New SqlClient.SqlConnection("workstation id=WANGQIANG;packet size=4096;user id=sa;" & _
"password=120979120979;data source=WANGQIANG;persist security info=False;initial catalog=assessonline")
sqlcn.Open()

' Dim sqlstr As String = "EXEC master..xp_cmdshell 'bcp assessonline.dbo.basedist_end in c:\三张大表.xls -c -S wangqiang -U sa -P 120979120979'" ’用BCP工具,老提示说字符长度不够,不想改表结构,不用这条语句

Dim sqlstr As String = "insert into basedist_end(contract_id, contract_no, product_sort, client, saledepartment, consign_cost,consign_amount, kaohe_term, dist_type, contract_type)" & _
"SELECT contract_id, contract_no, product_sort, client, saledepartment, consign_cost,consign_amount, kaohe_term, dist_type, contract_type" & _
" FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=" & strPath &"', table_name(k))"

Dim sqlexport As SqlClient.SqlCommand = New SqlClient.SqlCommand(sqlstr, sqlcn)
sqlexport.ExecuteReader()
Next k
sqlcn.Close()

Response.Write(" <script> alert('恭喜,所有数据导入成功!') </script> ")



End Sub
...全文
547 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamice01 2008-07-02
  • 打赏
  • 举报
回复
多谢,我一会试一下
阿牛138588 2008-07-02
  • 打赏
  • 举报
回复
读取大数据请使用datareader
一次读入10万行,效率不理想之外,可能内存或者连接超进等情况是较正常的。但使用datareader可解决此类问题
oo渣渣oo 2008-06-25
  • 打赏
  • 举报
回复
以前写的一个简单文档,给你参考一下:
---------------------


如何实现带参数的DTS包的创建过程:

1.在DTS中创建1个全局变量:@FileName.

为便于调试,可以给变量赋一个默认值.

2、创建Text File (Source) 和SQL Server连接,并创建数据转换任务,设置好数据转换的对应关系.

这一步大家都知道,不用多说.

3.创建动态属性任务,
点击"添加"
打开树形表"连接"
选中输入的文件(Text Source)
在右边的列表中选择DataSource项,点击"设置"

4.选择源类型为"全局变量"

5.在变量处理选择定义好的变量"@FileName"

6.确定

7.动态属性设置好以后,在动态属性任务和Text Source之间建立一个"成功时"的工作流

8.保存DTS包即可.


现在即可在命令窗口中测试做好的DTS包:

dtsrun /s "99.170.8.32" /U "UserID" /P "PWD" /N "DTS_Name" /A "@FileName"="D:\ssmchdtap.del"



oo渣渣oo 2008-06-25
  • 打赏
  • 举报
回复
如果你的Excel文件格式是一样的,我倒是做过这种导入,给你提供一个思路:

我也是VS2003+SQL2000

1、在SQL上新建DTS包,这个DTS包是带参数的,参数就是文件名。
具体方法:在创建DTS包时选择“包属性”-“全局变量”,增加一个“@FileName”,类型是String,值可以给个初值,就是调试用的Excel文件的全路径。
2、建立DTS流程时用一个“动态属性任务”来描述@FileName全局变量
3、其他的数据库连接、数据表的导入转换这些就你自己搞了
4、在程序里用命令行方式引用DTS包就可以导入数据了。
生成命令行的示例:

strCmd = "dtsrun " & _
" /S " & ControlChars.Quote & _SQLName & ControlChars.Quote & _
" /U " & ControlChars.Quote & _SQLUser & ControlChars.Quote & _
" /P " & ControlChars.Quote & _SQLPass & ControlChars.Quote & _
" /N " & ControlChars.Quote & "Load_SSMCHDTAP" & ControlChars.Quote & _
" /A " & ControlChars.Quote & "@FileName" & ControlChars.Quote & _
"=" & ControlChars.Quote & strFile & ControlChars.Quote


_DtsCode = Shell(strCmd, AppWinStyle.NormalFocus, True)
If _DtsCode <> 0 Then _Err = "上载商户资料文件时失败."
cpp2017 2008-06-25
  • 打赏
  • 举报
回复
1.先上传.至于4MB限制可以修改web.config的配置 <httpRuntime maxRequestLength=""/>来实现

2.循环工作表.

这种做法可实现,效率不是很高,
如果要高效,可以采取activex控件上传文件至数据库服务器(这里开个server程序),然后用数据库的导入方法来做.
cpp2017 2008-06-25
  • 打赏
  • 举报
回复
1.先上传.至于4MB限制可以修改web.config的配置 <httpRuntime maxRequestLength=""/>来实现

2.循环工作表.

这种做法可实现,效率不是很高,
如果要高效,可以采取activex控件上传文件至数据库服务器(这里开个server程序),然后用数据库的导入方法来做.
o1230 2008-06-25
  • 打赏
  • 举报
回复
mark
dreamice01 2008-06-24
  • 打赏
  • 举报
回复
可以了,改一下WEB.CONFIG就可以了,扩大上传的最大文件限制!

dreamice01 2008-06-23
  • 打赏
  • 举报
回复

TO:ylk7256 (大嘴猫)和Yangbin990 兄,

你们的这个建议有一个问题:

好像按上传到服务器的方法,每次都只能上传的文件大小不能超过4M

能否有大文件上传的程序的写作办法。


破咖啡罐子 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 dreamice01 的回复:]

TO:ylk7256 (大嘴猫)和Yangbin990 兄,

你们的这个建议有一个问题:

好像按上传到服务器的方法,每次都只能上传的文件大小不能超过4M

能否有大文件上传的程序的写作办法。
[/Quote]

那就只有FTP了……
daisy8675 2008-06-20
  • 打赏
  • 举报
回复
先 mark了,昨天你发给我的留言看不见下面的话
dreamice01 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ylk7256 的回复:]
我认为这个问题分2步来解决
1.要用户把文件上传到服务器,
2.服务器再来导入数据

至于数据量大的问题,可以从系统架构上来解决,比如在服务器上写个服务检查上传来的文件在后台来导入数据,而不是通过web来解决。
[/Quote]

兄弟,好建议!

有没关于用代码实现文件上传到服务器实例,发个我学习一下
  • 打赏
  • 举报
回复
我认为这个问题分2步来解决
1.要用户把文件上传到服务器,
2.服务器再来导入数据

至于数据量大的问题,可以从系统架构上来解决,比如在服务器上写个服务检查上传来的文件在后台来导入数据,而不是通过web来解决。
dreamice01 2008-06-20
  • 打赏
  • 举报
回复
谢谢两位大侠!!

这些能实现数据的远程导入吗?

我也就是用这些代码和方法折腾了一个多星期,始终无法实现在用户电脑上远程导入服务器的功能。

现在只能在服务器电脑上共享一个文件夹,让用户把文档拷到服务器的共享文件夹来实现


昨天试验成功了换文档存储位置的功能,但无法实现换工作表名的功能,这样一来,如果用OPENROWSET或OPENDATASOURCE函数均只能一次导入25000条不到的数据量。

而如果固定文档存储位置,用OPENROWSET或OPENDATASOURCE函数一次可导入60000条的数据量。但这样用户操作的灵活性就大打折扣了

有没有更好地办法来着?

最好是VB.NET代码,C#的看得有点费劲,没学过,呵呵
破咖啡罐子 2008-06-20
  • 打赏
  • 举报
回复
我用来查询excel的连接字符串:
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileName & " ;Extended Properties=Excel 8.0;"
获得所有SHEET名称:
Public Function GetSheetNames() As ArrayList
Dim con As New OleDbConnection
con.ConnectionString = strCon
con.Open()
GetSheetNames = New ArrayList
Dim cmd As OleDb.OleDbCommand = con.CreateCommand()
Dim temp As DataTable = New DataTable
temp = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
con.Close()

For i As Integer = 0 To temp.Rows.Count - 1
Dim strSheetName As String = temp.Rows(i).Item(2).ToString.Replace("'", "")
If strSheetName.EndsWith("$") Then _
GetSheetNames.Add(strSheetName.Substring(0, strSheetName.Length - 1))
Next
Return GetSheetNames
End Function
新鲜鱼排 2008-06-20
  • 打赏
  • 举报
回复
public class CopyData
{
string _sourceConnectionString;
string _destinationConnectionString;

public CopyData(string sourceConnectionString,
string destinationConnectionString)
{
_sourceConnectionString =
sourceConnectionString;
_destinationConnectionString =
destinationConnectionString;
}

public void CopyTable(string table)
{
using (SqlConnection source =
new SqlConnection(_sourceConnectionString))
{
string sql = string.Format("SELECT * FROM [{0}]", table);

SqlCommand command = new SqlCommand(sql, source);

source.Open();
IDataReader dr = command.ExecuteReader();

using (SqlBulkCopy copy =
new SqlBulkCopy(_destinationConnectionString))
{
copy.DestinationTableName = table;
copy.WriteToServer(dr);
}
}
}
}
Refer to:
http://davidhayden.com/blog/dave/archive/2006/01/13/2692.aspxSqlBulkCopy - Copy Table Data Between SQL Servers at High Speeds


How to import data from Excel to SQL Server
破咖啡罐子 2008-06-20
  • 打赏
  • 举报
回复
Oracle数据库可以用VB.NET 调用Oracle提供的sqlloader命令来处理,SQLSERVER不熟,你可以找找是否有接近的命令。
新鲜鱼排 2008-06-20
  • 打赏
  • 举报
回复
顶起来看看~~~~~
dreamice01 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 daisy8675 的回复:]
先 mark了,昨天你发给我的留言看不见下面的话
[/Quote]

多谢兄弟帮忙!!
dreamice01 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jimmy_jpy 的回复:]
成批量导入的话,可以导入,前提必须是sql2005,vs2005的环境,我做过的,一次性把数据采集到本地,你在google里收集批量导入数据 sql就可以找到方法了,楼主好运!
[/Quote]

我的是SQL2000 和VS2003,看来环境跟你说的不一样。这个可以吗?我都试了一星期多了,但都无功而返
加载更多回复(10)
net的最近面试经典试题ASP.NET面试题集合 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 4.C#的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进多次重载以适应不同的需要 Override 是进基类函数的重。为了适应需要。 6.如果在一个B/S结构的系统需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进处理? 答 : this.Server.Transfer 7.编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8.编程实现一个冒泡排序算法? 答: int [] array = new int ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#索引器的实现过程,是否只能根据数字进索引? 答:不是。可以用任意类型。 10.求以下表达式的值,出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using Sy

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧