FileInfo.GetFiles()和特殊字符(重音符号)

时间:2018-04-09 14:37:37

标签: c# sql-server asp.net-mvc

当我在DB中插入一个字符串,该字符串包含来自FileInfo.GetFiles()项目的“à”或“é”的特殊字符时,我会遇到问题并且SQL保存分裂的特殊字符。非特殊字符就可以了。

例如,“à”变为“a”,“é”变为“e”。有没有人遇到过这种麻烦?

这是代码

DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles())
{
 Logger.LogInfo("Info: " + fi.Name);
}

基本上,如果string是“sàrl”,则保存日志“Info:sa`rl”

当我通过VS断点时,我看到带有“à”的字符串,但是当我记录它时,char被分割。

我的SQL排序规则是拉丁语CI AS(SQL_Latin1_General_CP1_CI_AS),DB已经使用特殊字符串主持字符串而没有问题。

谢谢大家

修改

我将fi.Name插入到决赛桌时也遇到了麻烦:

public bool InsertFile(string fileName, Societe company, string remark, PersonnelAM creator)
        {
            string commandText = (@"INSERT INTO [dbo].[TB_DOCSOCIETE_COM] " +
                                    "([IdtSOC] " +
                                    ",[NomDOC] " +
                                   ",[RemDOC] " +
                                   ",[DateDOC] " +
                                   ",[IdtPER]) " +
                                    "VALUES " +
                                   "(@company" +
                                   ",@fileName" +
                                   ",@remark" +
                                   ",@date" +
                                   ",@creator) SELECT @@IDENTITY");

            var identity = CreateCommand(commandText,
                    new SqlParameter("@fileName", DAOHelper.HandleNullValueAndMinDateTime<string>(fileName)),
                    new SqlParameter("@company", DAOHelper.HandleNullValueAndMinDateTime<int>(company.Id)),
                    new SqlParameter("@remark", DAOHelper.HandleNullValueAndMinDateTime<string>(remark)),
                    new SqlParameter("@date", DAOHelper.HandleNullValueAndMinDateTime<DateTime>(DateTime.Now)),
                    new SqlParameter("@creator", DAOHelper.HandleNullValueAndMinDateTime<int>(creator.id))
                     ).ExecuteScalar();

            return int.Parse(identity.ToString()) > 0;
        }

我正在使用NLog,所以数据是varchar(8000)用于消息列和记录消息的代码

public static bool LogInfo(Exception ex, string message = "")
        {
            try
            {
                GetLogger().Log(LogLevel.Info, ex, message);
            }
            #pragma warning disable 0168
            catch (Exception exception)
            #pragma warning restore 0168
            {
                return false;
            }
            return true;
        }

编辑2:

要清楚DB,那3行:

Logger.LogInfo("BL1 " + "sàrl is right saved");
Logger.LogInfo("BL2 " + fi.Name + " is not right saved");
Logger.LogInfo("BL3 " + "sàrl" + " - " + fi.Name + " is not right too!");

把结果发给我:

BL1 sàrl is right saved
BL2 ENTERPRISE Sa`rl - file.pdf is not right saved
BL3 sàrl - ENTERPRISE Sa`rl - file.pdf is not right too!

所以它不是来自DB,它是关于字符串(编码?)

的问题

1 个答案:

答案 0 :(得分:2)

varchar(8000)

制作专栏NVARCHAR。这不是整理问题。排序规则确定排序顺序和比较规则,而不是存储。确实,对于非unicode列(varchar),排序规则用作提示以确定结果的代码页。但代码页只会让你到目前为止,因为显然1字节编码代码页无法匹配文件系统命名的整个空间,这是基于Unicode的2字节编码。

使用Unicode列:NVARCHAR

如果您想了解自己的体验,请运行:

declare @a nvarchar(4000) = NCHAR(0x00E0) +  N'a' + NCHAR(0x0300)
select @a, cast(@a as varchar);

Unicode充满了惊喜,例如Combining characters。您无法直观地区分它们,但是当您查看实际编码的字节时它们肯定会显示出来。