【问题标题】:In C# and SQL Server, how do I work with and display diacritical marks?在 C# 和 SQL Server 中,如何使用和显示变音符号?
【发布时间】:2018-08-20 17:41:59
【问题描述】:

我正在构建(我想)一个简单的闪存卡程序来帮助我学习西班牙语。也就是说,英语到西班牙语,或翻​​到西班牙语到英语。我正在使用 C# 和 SQL Server。代码运行良好,除了我正在努力弄清楚如何使用西班牙语变音符号,如“á、é、í、ó、ú、ñ”。具体来说,虽然我可以使用 win10 特殊键盘将它们输入到我的 prep Excel 电子表格中,并且它们可以正确显示,但是当我将它们加载到我的 SQL Sever 数据库中并通过 VS C# Winforms 程序访问时,它们显示不正确。

我尝试使用nvarchar 而不是varchar,这只是以陌生的格式加载和显示这些字符。

我曾尝试将我的默认键盘切换为西班牙语,但这完全将我切换为西班牙语。另外,请注意,当我使用 Note++ 与它们一起工作时,它们会正确显示。

当我在 c# 中处理它们时,它们输入正确,但在使用 StreamWriter 处理时它们没有。在将 Excel .csv 数据加载到数据库之前,我会处理每个数据以添加一些额外的列。

using (StreamReader reader = new StreamReader(File.OpenRead(INFILE)))
{
    using (StreamWriter writer = new StreamWriter(File.Open(OUTFILE, FileMode.Create)))
    {
        while ((sLineIn = reader.ReadLine()) != null)   // Process each input record until no more
        {
            iRecIn++;                       // Count input records

            if (bFirstRecord)
            {
                iRecOut++;                  // Account for title line
                bFirstRecord = false;       // Skip first record
                continue;
            }

            sLineOut = processLineOut(sLineIn);
            writeTheRecord(writer);
            continue;
        }
    }
}

我只是不知道下一步该去哪里。谢谢!!

第 2 部分: 我的流程如下:

  1. 闪存卡数据输入到通用 Excel 2016 文件中。如图所示,每行一张卡。
    1. 我将此文件保存为 csv 文件。
    2. 由于我的数据库表有额外的 10 多列,我有一个单独的 c# 程序,它使用刚刚创建的 csv 文件,并通过 StreamReader/StreamWriter 进程添加剩余的列。请参阅代码 sn-p。输出文件也是一个 csv 文件。
    3. 我运行我的 sql server 作业,该作业使用批量插入将第 3 步的输出加载到数据库中。
    4. 我使用我的 c# winform flashcard 程序来刷新卡片组。

关于数据库表,column定义为: SpanWord varchar(100),

我将其从以下位置切换回来: SpanWord nvarchar(100),

因为那也不起作用.... 谢谢

第 3 部分: 我同意这太模糊了,不够简洁。我将把它分解成几个部分并处理它们中的每一个。然后继续整个过程。

我不相信我可以关闭这个问题,所以如果有人有适当的权限,请为我关闭这个......再次感谢!我有足够的工作要做。

【问题讨论】:

  • 您的列是如何定义的?如在保存此数据的列中
  • StreamReader\Writer 与 SQL server 或 Excel 有什么关系?
  • 好吧,我想你不会回答,检查 Northwind 示例数据库。它已经充满了那些字符。 MS SQL 服务器支持带有 NCHAR 和 NVARCHAR 的 unicode。
  • 我回答了上述两个问题。谢谢

标签: c# windows winforms sql-server-2016


【解决方案1】:

这个问题有太多可能的问题。您应该关注数据旅程中的每一步,并确保数据仍然“良好”。一旦你找到一个特定的问题,你就可以研究那个特定的问题,如果你找不到答案,那么你应该为那个问题创建一个MCVE,然后然后你可以提出一个问题.

这里有一些高级提示:您应该通过调试确保正在读取 CSV 文件的程序正确读取字符。如果不是,最可能的原因是编码:更改阅读器根据字节顺序标记决定编码,如下所示:

new StreamReader(INFILE, Encoding.Default, true)

如果这不起作用,您可以具体告诉它要使用哪种编码。 (您可以通过在记事本中打开文件并执行“另存为...”来查看文件的编码。)

那么您还需要确保使用适当的编码编写文件 - 我建议使用输入文件的任何编码。

我怀疑您需要将数据库字段更改为nvarchar,除非您需要的所有字符都是covered by varchar。一旦正确,并且文件具有正确的编码,该文件的批量插入应该可以工作。

您还没有显示将数据从数据库读取到 WinForms 应用程序的代码;所以我只能猜测那里没有问题。

【讨论】:

  • 感谢您的建议。我会按照你的建议做,然后从输入文件开始。
【解决方案2】:

感谢理查德西莫!我将问题分解为更易于管理的部分:

  1. 读取 csv 文件的 c# 控制台应用程序添加了更多列,然后写出另一个 csv 文件,需要如 Richard 所说的编码。

        using (StreamReader reader = new StreamReader(File.OpenRead(INFILE),
            Encoding.Default, true))
        {
            using (StreamWriter writer = new StreamWriter(File.Open(OUTFILE, FileMode.Create),
                Encoding.Default))
    

这行得通,我验证了输出文件包含西班牙语变音符号。

  1. 我的 sql server 2016 数据库仍然存在问题。我尝试了 COLLATE 参数的几种变体,但在创建表上不起作用。我发现我需要在 BULK INSERT 语句中指定 CODEPAGE = '1252' 作为参数。然后一旦加载,选择正确显示变音字符,包括我的 c# WinForms 应用程序。

注意:我不需要将西班牙语单词列 (SpanWord) 更改为 nvarchar。我将其保留为 varchar,因为所有的西班牙方言都包含在 varchar 中。它们刚好大于 127。

每毫秒:

CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
Specifies the code page of the data in the data file. CODEPAGE is relevant
only if the data contains char, varchar, or text columns with character values
greater than 127 or less than 32. 

谢谢大家!

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2015-01-22
    • 2018-08-15
    • 1970-01-01
    • 2011-04-30
    • 2012-11-08
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多