C#Sql客户端 - 无法插入名称以数字

时间:2015-09-25 11:30:51

标签: c# sql insert sql-parametrized-query

在我的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 个答案:

答案 0 :(得分:1)

用括号括起列名,例如[1column]。

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

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

答案 1 :(得分:1)

双引号在T-SQL中没有特殊含义。使用方括号:

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

答案 2 :(得分: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(" ", "_");
}

答案 3 :(得分:0)

我会确保在调用违规列时,它被“”

包围

即。 “1column”

可能是sql引擎将其视为与1和列中的两个独立实体。

更新:

您是否尝试过更改

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

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