确定哪些 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;
}
您可以引用所有内容,这将由数据库本身转换为适当的数据类型。
但这是不正确的。相反,您需要使用参数化查询并按原样发送值:
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);
}
}