在C#和SQL Server中,如何使用并显示变音标记?

时间:2018-08-20 17:41:59

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

我正在构建(我认为)一个简单的闪存卡程序来帮助我学习西班牙语。即,将英语译成西班牙语,或者将西班牙语译成英语。我正在使用C#和SQL Server。该代码工作正常,除了我正在努力弄清楚如何使用西班牙的变音符,例如“á,é,í,ó,ú,ñ”。具体来说,虽然我可以使用win10专用键盘将它们输入到我的Prep Excel电子表格中,并且它们可以正确显示,但是当我将它们加载到SQL Sever数据库中并通过VS C#Winforms程序进行访问时,它们却显示不正确。

Shows excel CSV file

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

Shows flash card display

我尝试将默认键盘切换为西班牙语,但这完全切换为西班牙语。另外,请注意,当我将它们与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进程添加其余的列。请参阅代码段。输出文件也是一个csv文件。
    3. 我运行我的sql服务器作业,该作业使用批量插入将步骤3的输出加载到数据库中。
    4. 我使用我的c#winform抽认卡程序来刷卡层。

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

我从切换回了:     SpanWord nvarchar(100),

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

第3部分: 我同意这太含糊且不够简洁。我将其分解为各个部分并进行研究。然后完成整个过程。

我不认为我可以关闭此问题,因此,如果有人拥有适当的权限,请为我关闭此问题...再次感谢!我有足够的工作要做。

2 个答案:

答案 0 :(得分:1)

这个问题有太多可能的问题。您应该关注数据处理过程中的每个步骤,并确保数据仍然“良好”。找到特定问题后,您可以研究该特定问题,如果找不到答案,则应为该问题创建MCVE,然后然后询问一个问题。

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

new StreamReader(INFILE, Encoding.Default, true)

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

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

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

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

答案 1 :(得分:0)

感谢Richardissimo!我把这个问题分解成更容易处理的部分:

  1. c#控制台应用程序读取csv文件,添加更多列,然后写出另一个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参数的几种变体,但是在create table上不起作用。我发现我需要在BULK INSERT语句上指定CODEPAGE ='1252'作为参数。然后,一旦加载,SELECT就会正确显示变音字符,包括我的c#WinForms应用程序。

注意:我不需要将西班牙语单词列(SpanWord)更改为nvarchar。我将其保留为varchar,因为varchar涵盖了所有西班牙语的语法。它们仅大于127。

每个MS:

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. 

谢谢大家!