如何防止插入"。" " /"和" \"作为空字符串进入SQL数据库

时间:2017-11-20 09:29:50

标签: c# sql sql-server entity-framework-6 special-characters

在我的代码中我有这个

string specialChar = @"\|!#$%&/()=?»«@£§€{}.-;'<>_,";

我想要实现的是,我试图将此字符串中的每个字符插入到数据库中,每次数据库都应该抛出异常,因为它有一个约束,只允许字母和要插入的数字。

一切都很好,除了三个字符 - ".", "/" and "\".

不知何故,这些值仍会插入到表中,因为它们会转换为空字符串。我不确定原因,但也许EF6正在这样做。

可悲的是,添加不允许empty/NULL值的约束不是一种选择。

任何想法为什么以及如何防止这些字符转换为空字符串?

byte[] data = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

foreach (var item in specialChar)
{
    try
    {
        string tempName = item.ToString();
        upload.Upload(tempName, data);
    }

    catch (Exception ex)
    {
       // this is not being thrown at specified characters
    }
}

约束我用来防止特殊字符:

CONSTRAINT [ck_No_Special_Characters] CHECK (NOT [name] like '%[^A-Z0-9]%')

Upload.cs

        var db = new testEntities();
        var fileToUpload = new testFile();

        // **this is where I'm using my chars** 
        fileToUpload.name = Path.GetFileNameWithoutExtension(name);
        fileToUpload.extension = Path.GetExtension(name);
        fileToUpload.data = data;

        db.test.Add(fileToUpload);
        db.SaveChanges();

1 个答案:

答案 0 :(得分:0)

这应该在前端处理,而不是进入数据库级别。想象一下,无效的文件名到达数据库,它会因您的约束而拒绝并报告回UI。你在浪费资源。

在UI处理此操作将节省不必要的数据库调用。

使用 GetInvalidFileNameChars 方法:

if (name.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) == -1)
{
    var db = new testEntities();
    var fileToUpload = new testFile();

    // **this is where I'm using my chars** 
    fileToUpload.name = Path.GetFileNameWithoutExtension(name);
    fileToUpload.extension = Path.GetExtension(name);
    fileToUpload.data = data;

    db.test.Add(fileToUpload);
    db.SaveChanges();
}
else
{
    Console.WriteLine("Filename has invalid characters");
}