在我的代码中我有这个
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();
答案 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");
}