C#Sql客户端-can';t插入名称以数字开头的参数化列

C#Sql客户端-can';t插入名称以数字开头的参数化列,c#,sql,insert,sql-parametrized-query,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 +

在我的
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();
        }
    }
public void插入(字符串表、字典值)
{
//生成插入查询
string query=“插入到“+表+”(”;
foreach(值中的KeyValuePair对)
query+=pair.Key+“,”;
query=query.Substring(0,query.Length-1)+“;
查询+=“值(”;
foreach(值中的KeyValuePair对)
查询+=“@”+对.Key+”,“;
query=query.Substring(0,query.Length-1)+“;
//从查询创建命令
使用(SqlCommand=newsqlcommand(查询,连接))
{
foreach(值中的KeyValuePair对)
command.Parameters.Add(pair.Key,pair.Value);
//执行命令
command.ExecuteNonQuery();
}
}
但是,我发现它在值列表中的某个列不起作用,该列的名称以数字开头,例如
1column
。(我知道这是一个糟糕的变量名,告诉数据库所有者)。你能给我建议一些方法让它工作吗?此外,您肯定会发现我的查询构建方式并不理想,因此,如果您有任何意见,我将不胜感激

编辑

  • 在列名周围加上双引号(
    “1column”
    )没有帮助

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

即“1列”

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

更新:

你试过换衣服吗

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


用括号括住列名,例如[1列]

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

  foreach (KeyValuePair<string, object> pair in values)
        query += "[" + pair.Key + "],";
string query=“插入”+表格+”(”;
foreach(值中的KeyValuePair对)
query+=“[”+pair.Key+“],”;

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

foreach (KeyValuePair<string, object> pair in values)
    query += "[" + pair.Key + "],";
foreach(值中的KeyValuePair对)
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(" ", "_");
}
public void插入(字符串表、字典值)
{
string query=“插入到“+表+”(”;
foreach(值中的KeyValuePair对)
query+=“[”+pair.Key+“],”;
query=query.Substring(0,query.Length-1)+“;
查询+=“值(”;
foreach(值中的KeyValuePair对)
query+=ParamName(pair.Key)+“,”;
query=query.Substring(0,query.Length-1)+“;
使用(var sqlConnection=newsqlconnection(“…”)
{
sqlConnection.Open();
使用(SqlCommand=sqlConnection.CreateCommand())
{
command.CommandText=查询;
foreach(值中的KeyValuePair对)
{
command.Parameters.AddWithValue(ParamName(pair.Key)、pair.Value);
}
//执行命令
command.ExecuteNonQuery();
}
}
}
私有字符串参数名(字符串输入)
{
返回“@_”+输入。替换(“,”);
}

我不相信你。请在我做出更改后显示SQL命令。Richard,我真的很抱歉。我犯了一个小错误。现在它可以工作了。非常感谢!在这种情况下,我会按照Richard的建议,将命令字符串输出到消息框中,这样你就可以检查它是否生成了正确的字符串。最后,它与b一起工作rackets,也谢谢你的努力。出于好奇,是不是查询的构建不正确?
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(" ", "_");
}