确定哪些 SQL 数据类型需要用值括起来

本文关键字:起来 数据类型 SQL | 更新日期: 2023-09-27 18:31:37

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

我可以使用类似于以下代码的内容,但它似乎效率很低。 有人可以指出我更好的方法来做到这一点 - 可能使用内置的 SQL Server 或 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;
}

确定哪些 SQL 数据类型需要用值括起来

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

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

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

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

请参阅MSDN。

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

我想指出这不一定是真的(参考二进制和 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);
    }
}