C#SQL命令参数不起作用

时间:2014-12-04 08:05:55

标签: c# sql sql-server

我通过取出参数并用文本替换它们来完成一些问题,唯一不起作用的参数是@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();

感谢任何帮助。如果我需要发布更多相关代码,请告诉我,我将添加它。

4 个答案:

答案 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;
}