我试图创建一个类来表示SQL中列的值。下面是最终目标,我想达到:如何在C中创建包含各种类型属性的类#
public string GenerateInsertSql()
{
StringBuilder insertSql = new StringBuilder();
insertSql.Append("INSERT INTO " + SchemaName + "." + TableName + "\n");
insertSql.Append("(\n");
int counter = 0;
foreach (ColumnValue columnValue in _insertValues)
{
if (counter > 0) insertSql.Append(",");
counter++;
insertSql.Append(columnValue.ColumnName).Append("\n");
}
insertSql.Append(")\n");
insertSql.Append("VALUES\n");
insertSql.Append("(\n");
counter = 0;
foreach (ColumnValue columnValue in _insertValues)
{
if (counter > 0) insertSql.Append(",");
counter++;
insertSql.Append(columnValue.SqlValue).Append("\n");
}
insertSql.Append(")\n");
}
因此类是上面提到的ColumnValue
类。 ColumnValue
类需要一个Value
属性,它可能是任何基本的.NET类型(int,string等)。该类还有一个属性SqlValue
,它提供了可在生成的SQL语句中使用的Value
属性的字符串表示形式。所以如果Value
是一个int,那么SqlValue
只是给出Value.ToString()
,而如果Value
是一个字符串,SqlValue
需要检查字符串是否为空以便返回'NULL'或Value
属性本身。
起初我想有Value
为对象,以及SqlValue
测试的Value
类型switch语句:
public string SqlValue
{
get
{
switch (Value.GetType())
{
...
}
}
}
但后来我得到“整型预期价值”。所以我无法检查一个对象的类型。
接下来我尝试了泛型。我改变了ColumnValue
类ColumnValue<T>
,与Value
属性,如下所示:
public T Value { get; set; }
,然后在SqlValue
财产,T类型的另一种检验,但我不允许这样做,要么。
有没有办法在C#中实现这一点,而无需简单地创建单独的类来处理每种可能的列类型?
通过字符串连接创建SQL?我会更担心Sql注入。 – spender 2010-10-11 10:01:49
感谢您的警告,但这只是测试类的SQL生成。没有涉及任何用户输入。 – David 2010-10-11 10:08:25
还值得指出的是,上面的SQL可以快速修改为参数化值,从而完全保护它。 – David 2010-10-11 10:09:17