我通过取出参数并用文本替换它们来完成一些问题,唯一不起作用的参数是@seat,我无法弄清楚原因。
allSeats是一组自定义控件。我尝试用实际的字符串替换参数内容即ie。 " A1"而那仍然无法奏效。如果我删除@seat参数并将其替换为A1,它可以工作,但我需要能够动态设置列名。
myConnection.Open();
SqlCommand myCommand = new SqlCommand("UPDATE Events SET @seat = @truefalse WHERE Name = @name", myConnection);
SqlParameter param = new SqlParameter();
SqlParameter param2 = new SqlParameter();
SqlParameter param3 = new SqlParameter();
param.ParameterName = "@seat";
param2.ParameterName = "@truefalse";
param2.DbType = System.Data.DbType.Boolean;
param3.ParameterName = "@name";
param.Value = allSeats[i].Name;
param2.Value = allSeats[i].taken;
param3.Value = name;
myCommand.Parameters.Add(param);
myCommand.Parameters.Add(param2);
myCommand.Parameters.Add(param3);
myCommand.ExecuteNonQuery();
感谢任何帮助。如果我需要发布更多相关代码,请告诉我,我将添加它。
答案 0 :(得分:3)
在你的
中SET @seat = @truefalse
部分,您尝试参数化列名称。你不能这样做。您只能参数化您的值,而不是列名或表名。
您可以在这种情况下使用动态SQL,但不建议这样做。读
作为建议,请使用白名单这样的案例。我希望,列名称只能有一组固定的可能的正确值。当然,这需要在输入部分进行强有力的验证。
答案 1 :(得分:1)
同意Soner。在创建命令之前更改字符串
string cmdStr = string.Format("UPDATE Events SET {0} = @truefalse WHERE Name = @name", allSeats[i].Name)
然后 只使用2个参数。
SqlCommand myCommand = new SqlCommand(cmdStr, myConnection);
SqlParameter param = new SqlParameter();
SqlParameter param2 = new SqlParameter();
等
答案 2 :(得分:0)
cmd.parameter.addwithvalue("@param1", value1);
cmd.parameter.addwithvalue("@param2", value2);
像这样使用。
答案 3 :(得分:0)
正如Soner所提到的,列无法参数化。这意味着您必须创建动态查询,或者在启动时创建一次参数化,每个列名称一次查询。
这可以在以下示例中完成:
private static Dictionary<string, SqlCommand> parameterizedCommands = new Dictionary<string,SqlCommand>();
public static void CreateparameterizedCommandsy(string[] colums)
{
parameterizedCommands = new Dictionary<string,SqlCommand>();
foreach (string colname in colums)
{
parameterizedCommands.Add(colname, CreateCommandForColumn(colname));
}
}
public static SqlCommand CreateCommandForColumn(string columnName)
{
SqlCommand myCommand = new SqlCommand(string.Format("UPDATE Events SET {0} = @truefalse WHERE Name = @name",columnName));
// the following statement creates the parameter in one go. Bit = boolean
myCommand.Parameters.Add("@truefalse", SqlDbType.Bit);
myCommand.Parameters.Add("@name", SqlDbType.Text);
return myCommand;
}
public int ExccuteColumnUpdate(string columnName, bool setToValue, string name, SqlConnection connection)
{
connection.Open();
try
{
SqlCommand command;
if (parameterizedCommands.TryGetValue(columnName, out command))
{
command.Connection = connection;
command.Parameters["@truefalse"].Value = setToValue;
command.Parameters["@name"].Value = name;
return command.ExecuteNonQuery();
}
}
finally
{
connection.Close();
}
return 0;
}