【问题标题】:VB.net Bulk InsertVB.net 批量插入
【发布时间】:2012-07-18 05:25:55
【问题描述】:

关于“批量插入”的 sql 命令,我对某些法语口音有疑问。从文本文件插入后,“à”或“急性”在数据库表中显示为 n++。这是当前转换存在问题的唯一字符。我尝试使用“WITH”子句修改命令并分配诸如“RAW”或“1252”或“ACP”之类的值,但它们都无法保留此特定字符。我使用的数据库是 Sql Server 2008。非常感谢任何帮助。谢谢。

仅供参考,我不会使用任何编码或解码技术。只是试图将文本文件中的任何内容放回数据库。


感谢您的回复。但是,将列类型从“varchar”更改为“nvarchar”实际上并没有解决问题。它现在在数据库表列中显示为“∩┐╜”。任何想法的人?提前非常感谢

【问题讨论】:

  • 这里出现字符编码问题 - 确保您使用的是 UTF-8。
  • 要插入数据的列是什么数据类型?为了存储 unicode 数据,它需要是 nvarchar 或 ntext(尽管已被折旧)。
  • 那时没有任何方法可以存储法语重音字符。如果要存储它们,则必须将列更改为 nvarchar。
  • 您好,感谢您的回复。但是,将列类型从“varchar”更改为“nvarchar”实际上并没有解决问题。它现在在数据库表列中显示为“∩┐╜”。任何想法。

标签: sql sql-server vb.net


【解决方案1】:

正如 Bridge 所说,您需要NVARCHAR。您还需要将文件转换为 UTF-16,因为即使您使用 NVARCHARBULK INSERT 也无法与 UTF-8 配合使用。

更多信息请参见this question

这里有几个关于转换文件编码的问题,但为了记录,这对我有用:

public static void  ConvertUtf8ToUtf16(string path, int bufferSize = 4096)
    {
    string  tempPath = path + ".tmp";

    char[]  buffer = new char[bufferSize];
    using (var input = File.OpenText(path))
    using (var output = new StreamWriter(tempPath, false, Encoding.Unicode))
        {
        int  index = 0;
        int  chars;
        while ((chars = input.Read(buffer, index, bufferSize)) > 0)
            output.Write(buffer, 0, chars);
        }

    // Swap the files
    File.Delete(path);
    File.Move(tempPath, path);
    }

【讨论】:

  • 感谢您的回复。但是,将列类型从“varchar”更改为“nvarchar”实际上并没有解决问题。它现在在数据库表列中显示为“∩┐╜”。任何想法
  • 这不是完整的解决方案。你的文件的字符编码是什么? BULK INSERT 很敏感。
【解决方案2】:

将列类型更改为nvarchar

【讨论】:

  • 您好,感谢您的回复。但是,将列类型从“varchar”更改为“nvarchar”实际上并没有解决问题。它现在在数据库表列中显示为“∩┐╜”。任何想法。
  • 附加信息:我将这些法语字符从文本文件插入到数据库表中。我正在使用批量插入来做到这一点。谢谢
  • @Sanjay - 批量插入文件不是 UTF-16 格式,这是你的问题。
  • 这意味着我需要在执行批量插入之前将文本文件转换为 UTF-16,仪式??
  • byte[] utf8Bytes = Encoding.UTF8.GetBytes("这是测试字符串"); byte[] unicodeBytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); Encoding.Unicode.GetString(unicodeBytes); \n\n这是我在批量插入之前所做的。 Encoding.Unicode.GetString(params) 的输出被用于编写另一个文本文件。仍然得到一些垃圾输出。谁能告诉我在转换为 UTF16 时是否做错了什么...谢谢
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多