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
。 (我知道这是糟糕的变量名,请告诉数据库所有者)。你能建议我一些方法让它工作吗?另外,您肯定会发现我的查询构建方式不理想,因此,如果您提出任何意见,我将不胜感激。
编辑:
- 用双引号将列名称括起来 (
"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(" ", "_");
}
在我的 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
。 (我知道这是糟糕的变量名,请告诉数据库所有者)。你能建议我一些方法让它工作吗?另外,您肯定会发现我的查询构建方式不理想,因此,如果您提出任何意见,我将不胜感激。
编辑:
- 用双引号将列名称括起来 (
"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(" ", "_");
}