1

私のSqlClientクラスでは、Insertこの方法でメソッドを実装しました。Dictionaryペア (列名、値) をInsertメソッドに渡す必要があり、メソッドはパラメーター化されたクエリを構築してコマンドを実行します。

    public void Insert(string table, Dictionary<string, object> values)
    {
        // build INSERT query
        string query = "INSERT INTO " + table + " (";

        foreach (KeyValuePair<string, object> pair in values)
            query += pair.Key + ",";

        query = query.Substring(0, query.Length - 1) + ")";
        query += "VALUES (";

        foreach (KeyValuePair<string, object> pair in values)
            query += "@" + pair.Key + ",";

        query = query.Substring(0, query.Length - 1) + ")";

        // create command from query
        using (SqlCommand command = new SqlCommand(query, connect))
        {
            foreach (KeyValuePair<string, object> pair in values)
                command.Parameters.Add(pair.Key, pair.Value);

            // execute command
            command.ExecuteNonQuery();
        }
    }

しかし、値リストに名前が数字で始まる列がある間は機能しないことがわかりました1column。(これはひどい変数名であることはわかっています。データベースの所有者に伝えてください)。それを機能させる方法を教えてもらえますか?また、私のクエリ作成方法が理想的ではないことは間違いないので、コメントをいただければ幸いです。

編集

  • 列名を二重引用符 ( "1column") で囲んでも役に立ちません。
4

4 に答える 4

1

[1column] のように、列名を括弧で囲みます。

  string query = "INSERT INTO " + table + " (";

  foreach (KeyValuePair<string, object> pair in values)
        query += "[" + pair.Key + "],";
于 2015-09-25T11:40:57.777 に答える
1

T-SQL では、二重引用符に特別な意味はありません。角かっこを使用します。

foreach (KeyValuePair<string, object> pair in values)
    query += "[" + pair.Key + "],";
于 2015-09-25T11:42:00.980 に答える
1

列名は数字で始まる場合があり、その場合は [] で囲む必要があります。

query += "[" + pair.Key + "],";

ただし、パラメーター名は使用できません。数字で始まる名前を別の名前に変換する戦略を立てる必要があります。例えば:

public void Insert(string table, Dictionary<string, object> values)
{
    string query = "INSERT INTO " + table + " (";

    foreach (KeyValuePair<string, object> pair in values)
        query += "[" + pair.Key + "],";

    query = query.Substring(0, query.Length - 1) + ")";
    query += "VALUES (";

    foreach (KeyValuePair<string, object> pair in values)
        query += ParamName(pair.Key) + ",";

    query = query.Substring(0, query.Length - 1) + ")";

    using (var sqlConnection = new SqlConnection("..."))
    {
        sqlConnection.Open();
        using (SqlCommand command = sqlConnection.CreateCommand())
        {
            command.CommandText = query;
            foreach (KeyValuePair<string, object> pair in values)
            {
                command.Parameters.AddWithValue(ParamName(pair.Key), pair.Value);
            }
            // execute command
            command.ExecuteNonQuery();
        }
    }
}

private string ParamName(string input)
{
    return "@_" + input.Replace(" ", "_");
}
于 2015-09-25T12:30:10.443 に答える
0

問題のある列を呼び出すときは、「」で囲まれていることを確認します

IE「1列」

SQL エンジンが、1 と列のように 2 つの別個のエンティティとして認識している可能性があります。

アップデート:

変えてみましたか

command.Parameters.Add(pair.Key, pair.Value);

為に

 command.Parameters.AddWithValue(pair.Key, pair.Value);
于 2015-09-25T11:37:21.070 に答える