我有以下课程:
public class VendorClass {
public int VendorID { get; set; }
public string VendorName { get; set; }
}
上面的字段匹配数据库表中的字段。
如果说VendorName
,我该如何给它一个字段宽度?
VendorName
映射到数据库中varchar(15)
答案 0 :(得分:8)
您不能限制字符串的长度,但可以使用带有支持字段的属性来获得所需的结果:
public class VendorClass
{
public int VendorID { get; set; }
private string _vendorName;
public string VendorName
{
get { return _vendorName; }
set
{
if (value.Length > 15)
{
_vendorName = value.Substring(0,15);
} else {
_vendorName = value;
}
}
}
}
答案 1 :(得分:3)
C#中的字符串几乎具有任意长度。
从数据库加载时,它会自动适应实际的字符串长度。保存到数据库时,您的业务逻辑,数据层或ORM(视情况而定)需要确保适当的最大长度。
答案 2 :(得分:2)
字符串在C#中不能有设定的长度。您必须通过其他一些机制(如验证)来处理数据库长度。没有更多细节,无法真正告诉你更多。
答案 3 :(得分:0)
我会问你为什么要在c#代码中这样做。但是this link有两种解决方法。我认为截断或采取子循环是最好的选择。您还可以确保UI(或模型视图)处理此类详细信息。
答案 4 :(得分:0)
我不确定您的要求是什么,但如果您想知道字符串的最大长度,question可以帮助您。
如果您想限制输入的字符数,我建议您使用服务器端验证和/或客户端验证。
答案 5 :(得分:0)
我刚刚遇到了一个像你描述的那样的问题,并找到了一种创建有限长度字符串的方法。当数据库中只有有限的 varchar 长度定义时,可能有点不灵活但简洁。
首先介绍一些基础类:
public class Length16
{
public static int StringLength { get => 16; }
}
public class Length8
{
public static int StringLength { get => 8; }
}
public class Length15
{
public static int StringLength { get => 15; }
}
public class LimitedLengthString<T>
{
private string _sValue;
public LimitedLengthString(string sNewValue)
{
_sValue = sNewValue;
}
public static implicit operator LimitedLengthString<T>(string sNewValue)
{
var prop = typeof(T).GetProperty("StringLength");
int iLength = (int)prop.GetValue(null);
if (sNewValue.Length > iLength)
{
throw new Exception($"New string is too long! Allowed length {iLength}.");
}
return new LimitedLengthString<T>(sNewValue);
}
public static implicit operator string(LimitedLengthString<T> sSource)
{
return sSource.ToString();
}
public override string ToString()
{
return _sValue;
}
}
public class AutoTruncatedString<T>
{
private string _sValue;
public AutoTruncatedString(string sNewValue)
{
_sValue = sNewValue;
}
public static implicit operator AutoTruncatedString<T>(string sNewValue)
{
var prop = typeof(T).GetProperty("StringLength");
int iLength = (int)prop.GetValue(null);
return new AutoTruncatedString<T>(sNewValue.Substring(0, iLength));
}
public static implicit operator string(AutoTruncatedString<T> sSource)
{
return sSource.ToString();
}
public override string ToString()
{
return _sValue;
}
}
像这样使用它们:
LimitedLengthString<Length8> sLimitedLength8;
sLimitedLength8 = "asdfgasdfg"; // will error out
AutoTruncatedString<Length8> sAutoTruncated8;
sAutoTruncated8 = "asdfgasdfg"; // will be truncated
sLimitedLength8 将在您尝试分配长度超过 8 的字符串时抛出错误,而 sAutoTruncated8 将截断您分配给它的字符串。
对于您来说,您可以这样定义 VendorName:
public LimitedLengthString<Length15> VendorName { get; set; }
希望能帮到你。