在我的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"
)的周围列名称无效。答案 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);