5

我需要向数据库发送命令。我知道受影响表中所有字段的名称和数据类型,我需要使用它们生成命令。我唯一的问题是确定哪些列值是需要 TSQL 中的引号的数据类型 - 例如,如果字段是Hello Worldtype的字符串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;
}
4

2 回答 2

6

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

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

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

或者

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

请参阅MSDN

于 2012-04-19T19:43:28.427 回答
3

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

我想指出这不一定是真的(参考 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);
    }
}
于 2018-12-20T21:08:01.830 回答