5

データベースにコマンドを送信する必要があります。影響を受けるテーブルのすべてのフィールドの名前とデータ型を知っているので、それらを使用してコマンドを生成する必要があります。私の唯一の問題は、どの列値がTSQLで引用符を必要とするデータ型であるかを判断することです。たとえば、フィールドがHello Worldタイプの文字列である場合は引用符で囲む必要がありますが、5varcharの場合は引用符で囲みintません。引用する必要があります。

次のようなコードを使用することもできますが、非常に非効率的です。誰かがこれを行うためのより良い方法を教えてもらえますか?おそらく組み込みの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 に答える