C# Sql 客户端 - 无法插入名称以数字开头的参数化列

C# Sql client - can't Insert parametrized column whose name starts with number

在我的 SqlClient class 中,我以这种方式实现了 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。 (我知道这是糟糕的变量名,请告诉数据库所有者)。你能建议我一些方法让它工作吗?另外,您肯定会发现我的查询构建方式不理想,因此,如果您提出任何意见,我将不胜感激。

编辑:

我会确保在调用有问题的列时,它被“

包围

即“1 列”

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

更新:

你尝试过改变

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

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

用方括号将列名括起来,例如[1 列].

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

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

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

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

列名可以以数字开头,在这种情况下,您必须用 []:

将其括起来
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(" ", "_");
}