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

列名可能以数字开头,在这种情况下,您必须用 [] 将其括起来:

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 回答
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 回答
0

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

IE“1列”

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

更新:

你试过改变

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

为了

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