【问题标题】:.net 4 sql bulk insert on 64bit iis 7.net 4 sql 在 64 位 iis 7 上批量插入
【发布时间】:2011-06-26 22:39:33
【问题描述】:

我需要在 asp.net 应用程序中从 txt/csv 文件导入一些批量数据

直到现在我使用 SqlBulkCopy,但现在在 64 位的 iis7 上它不起作用。有很多关于 jet 无法使用 64 位的帖子。

我读到 iis 可以配置为在 32 位模式下工作,但 id 宁愿通过 64 位保持性能尽可能好。

此外,我从来没有设法让 sqlbulkcopy 使用扩展属性(您可能会在此处看到 https://stackoverflow.com/questions/4305502/net-sqlbulkcopy-with-unicode-chars 或此处 http://forums.asp.net/p/1627034/4184689.aspx#4184689?SqlBulkCopy+DATAFILETYPE+widechar

所以问题是,是否有另一种/更好的方法可以通过 .net 将批量记录导入 mssql?可以在 64 位上正常工作并允许自定义 unicode 和文件类型的东西?

感谢大家的帮助!

【问题讨论】:

    标签: .net iis unicode 64-bit sqlbulkcopy


    【解决方案1】:

    感谢各位的回答。

    虽然看起来最简单的方法是手动。所以我开始自己编写一些代码。如果有人对此感兴趣,我会在这里发布它

    它可能无法涵盖所有​​内容,但它非常灵活。

    它确实使用了我的一些辅助函数等,未在此处列出,因此如果您正在阅读本文并且无法弄清楚某些内容,很高兴详细说明:-)

    Sub ImportFile(ByVal FilePath As String, ByVal RecordType As ObjectType, Optional ByVal HasHeaders As Boolean = True, Optional ByVal RowDelimiter As String = ControlChars.Tab, Optional ByVal CellDelimiter As String = ControlChars.NewLine)
        Dim objReader = New StreamReader(FilePath)
        Dim strContents = objReader.ReadToEnd
        objReader.Close()
        Dim Columns = New List(Of String)
        Dim axName = ObjectType.Account.GetType.Assembly.FullName
        Dim objRecord = Activator.CreateInstance(axName, RecordType.ToString).Unwrap
        Dim dcx = DBContext()
        dcx.EditLogging = False
        Dim tbl = dcx.GetTable(objRecord.GetType)
    
        Dim TableColumns = New List(Of String)
        For Each p In objRecord.GetType.GetProperties
            If (p.PropertyType.BaseType IsNot Nothing AndAlso p.PropertyType.BaseType.Name = "ValueType") Or p.PropertyType Is "".GetType Then TableColumns.Add(p.Name)
        Next
    
        Dim Rows = Split(strContents, RowDelimiter).ToList
        If HasHeaders Then
            Columns = Rows(0).Split(CellDelimiter).ToList
            Rows.RemoveAt(0)
            'check validity
            For Each clm In Columns
                If Not TableColumns.Contains(clm) Then Throw New ApplicationException(clm & " is not a valid column name.")
            Next
        Else
            Columns = TableColumns
        End If
        For Each row In Rows
            objRecord = Activator.CreateInstance(axName, RecordType.ToString).Unwrap
            Dim Cells = row.Split(CellDelimiter)
            For i = 0 To Cells.Count - 1
                SetObjProperty(objRecord, Columns(i), Cells(i))
            Next
            tbl.InsertOnSubmit(objRecord)
        Next
        dcx.SubmitChanges()
    End Sub
    

    【讨论】:

      【解决方案2】:

      可以获取 x64 Jet,但不确定 SqlBulkCopy 是否支持,

      http://blogs.msdn.com/b/psssql/archive/2010/01/21/how-to-get-a-x64-version-of-jet.aspx

      【讨论】:

      • 我明白了。谢谢。他们在任何地方提供替代方案吗?我认为我会从我的清单中删除喷气式飞机,因为它古老且已被弃用。问题是,在当前时代,正确的进口方式是什么?
      【解决方案3】:

      您可以使用 Sql Server 集成服务 您可以在 SQL Management Studio 中轻松创建“导入数据”包,并从您的 .net 代码中调用它。

      【讨论】:

      • 您好,非常感谢。同时我得到这个消息。在 SQL Server Express、Web 或 Workgroup 中,您可以运行导入和导出向导创建的包,但不能保存它。要保存向导创建的包,您必须升级到 SQL Server Standard、Enterprise、Developer 或 Evaluation。但我没有使用快递。这是我从websitespark 下载的完整版本。我不确定确切的版本。哪里可以检查这个?但我确实有 sql profiler 和其他不在 express 中的高级工具。谢谢
      • 好的,我现在看到我有一个叫做“网络版”的东西。这不允许保存这些导入。还有其他想法吗?
      • 也许你可以看看 FileHelpers;他们提供 csv 导入功能。这是一个很好的图书馆
      • 嗯。从来没有听说过这个。谢谢。我下载了它。它似乎有很多功能,但是一个非常复杂且陈旧/补丁的解决方案。 FWIW,我想我现在尝试为我目前需要的 1 个文档编写自己的解析器。但如果我需要更多功能,请记住这一点。谢谢!
      猜你喜欢
      • 2011-06-10
      • 2012-09-30
      • 2011-07-21
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      相关资源
      最近更新 更多