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