确定哪些SQL数据类型需要引用值?

时间:2012-04-19 19:36:50

标签: c# .net tsql ado.net sql-server-2008-r2

我需要向数据库发送命令。我知道受影响的表中所有字段的名称和数据类型,我需要使用它们生成命令。我唯一的问题是确定哪些列值是TSQL中需要引号的数据类型 - 例如,如果字段是Hello World类型的字符串varchar,我需要引用它,但是如果它是int,5,我不需要引用它。

我可以使用类似下面的代码,但它似乎非常低效。有人能指出我这样做的更好方法 - 可能使用内置的SQL服务器或C#功能吗?

public string QuoteStringIfDatatypeRequires(string columnName)
{
    if (DataTypes[columnName].Contains("date") || DataTypes[columnName].Contains("time") ||
        DataTypes[columnName].Contains("char") || DataTypes[columnName].Contains("text") ||
        DataTypes[columnName].Contains("binary") || DataTypes[columnName].Contains("image"))
    {
        return "'" + columnName + "'";
    }

    return columnName;
}

2 个答案:

答案 0 :(得分:6)

您可以引用所有内容,并且数据库本身会将其转换为适当的数据类型。

但这不正确。相反,您需要使用参数化查询并按原样发送值:

command.Parameters.AddWithValue("@name", value);

command.Parameters.Add("@name", type, size).Value = value;

请参阅MSDN

答案 1 :(得分:1)

  

您可以引用所有内容,并将其转换为   数据库本身提供适当的数据类型。

我想指出的是,这不一定是正确的(引用Binary和BigInt类型)。您将获得将VARCHAR转换为某些值类型的异常。我只能使用以下方法解决这些异常:

public string RenderField(string fieldValue, string fieldType)
{
    // Null check
    if (fieldValue == null || fieldValue.Trim() == string.Empty)
    {
        // Not there
        return null;
    }

    // Switch on type
    switch (fieldType)
    {
        // Cases
        case "TimeSpan":
            return ToolOperations.QuotedValue(fieldValue);
        case "String":
            return ToolOperations.QuotedValue(fieldValue);
        case "Char[]":
            return ToolOperations.QuotedValue(fieldValue);
        case "DateTime":
            return ToolOperations.QuotedValue(fieldValue);
        case "DateTimeOffset":
            return ToolOperations.QuotedValue(fieldValue);
        case "Guid":
            return ToolOperations.QuotedValue(fieldValue);
        case "Boolean":
            return ToolOperations.QuotedValue(fieldValue);
        case "Int64":
            return fieldValue;
        case "Byte[]":
            return fieldValue;            
        case "Decimal":
            return fieldValue;
        case "Double":
            return fieldValue;
        case "Int32":
            return fieldValue;
        case "Single":
            return fieldValue;
        case "Int16":
            return fieldValue;
        case "Byte":
            return fieldValue;
        default:
            ToolOperations.Log("WARNING => UNSUPPORTED SQL TYPE: " + fieldType, false);
            return ToolOperations.QuotedValue(fieldValue);
    }
}