必须声明标量变量“@Login”。尝试将参数添加到SqlDataSource时出错

时间:2013-06-28 13:39:46

标签: c# .net sql sqlcommand sqlparameter

我有这个错误: 必须声明标量变量“@Login”。

我的代码:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["intranetv2"].ConnectionString))
{

    SqlCommand cmd = new SqlCommand("insert into [MyBase].[Dbo].[LogErrors] (Username, StackTrace, ShortDescription, DetailDescription, ErrorType) VALUES (@Login, @Stack, @Message, @Txt, @Source)", conn);

                SqlParameter param = new SqlParameter();
                param.ParameterName = "Login";
                param.Value = user.Login;
                param.ParameterName = "Stack";
                param.Value = ex.StackTrace;
                param.ParameterName = "Message";
                param.Value = ex.Message;
                param.ParameterName = "Txt";
                param.Value = Txt;
                param.ParameterName = "Source";
                param.Value = ex.Source;
                // 3. add new parameter to command object
                cmd.Parameters.Add(param);
                conn.Open();
                return cmd.ExecuteNonQuery();
}

我在param中试过'@',但我也有同样的错误。

7 个答案:

答案 0 :(得分:2)

您覆盖params值,并且只向查询添加一个参数。这是Source

我建议您创建一个新变量或使用AddWithValue

   SqlParameter param = new SqlParameter();
   param.ParameterName = "Login";
   param.Value = user.Login;

   cmd.Parameters.Add(param);

   SqlParameter param2 = new SqlParameter();
   param2.ParameterName = "Stack";
   param2.Value = ex.StackTrace;

   cmd.Parameters.Add(param2);

要使用AddWithValue,您可以执行以下操作:

cmd.Parameters.AddWithValue("@Login", user.Login);
cmd.Parameters.AddWithValue("@Stack", ex.StackTrace);

答案 1 :(得分:2)

您必须为每个参数创建一个新的SqlParameter,它应该是这样的:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["intranetv2"].ConnectionString))
{

    SqlCommand cmd = new SqlCommand("insert into [MyBase].[Dbo].[LogErrors] (Username, StackTrace, ShortDescription, DetailDescription, ErrorType) VALUES (@Login, @Stack, @Message, @Txt, @Source)", conn);

                SqlParameter param = new SqlParameter();
                param.ParameterName = "@Login";
                param.Value = user.Login;
                cmd.Parameters.Add(param);

                SqlParameter param2 = new SqlParameter();
                param2.ParameterName = "@Stack";
                param2.Value = ex.StackTrace;
                cmd.Parameters.Add(param2);
    (...)

答案 2 :(得分:1)

您的方式,只添加最后一个参数。有几种方法可以向命令对象添加参数,下面的参数最简单:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["intranetv2"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand("insert into [MyBase].[Dbo].[LogErrors] (Username, StackTrace, ShortDescription, DetailDescription, ErrorType) VALUES (@Login, @Stack, @Message, @Txt, @Source)", conn);

    conn.Open();

    cmd.Parameters.AddWithValue("@Login", user.Login);
    cmd.Parameters.AddWithValue("@Stack", ex.StackTrace);
    cmd.Parameters.AddWithValue("@Message", ex.Message);
    cmd.Parameters.AddWithValue("@Txt", Txt);
    cmd.Parameters.AddWithValue("@Source", ex.Source);

    return cmd.ExecuteNonQuery();
}

答案 3 :(得分:0)

您只将最后一个参数添加到参数列表中。

更好的是:

SqlParameter param = new SqlParameter();
param.ParameterName = "@Login";
param.Value = user.Login;
cmd.Parameters.Add(param);

param = new SqlParameter();
param.ParameterName = "@Stack";
param.Value = ex.StackTrace;
cmd.Parameters.Add(param);

param = new SqlParameter();
param.ParameterName = "@Message";
param.Value = ex.Message;
cmd.Parameters.Add(param);

param = new SqlParameter();
param.ParameterName = "@Txt";
param.Value = Txt;
cmd.Parameters.Add(param);

param = new SqlParameter();
param.ParameterName = "@Source";
param.Value = ex.Source;
cmd.Parameters.Add(param);

conn.Open();
return cmd.ExecuteNonQuery();

答案 4 :(得分:0)

您正在为所有参数重复使用相同参数实例。这是完全错误的。

更简单的方法是使用addWithValue方法:

cmd.Parameters.AddWithValue("@Login", user.Login);

请注意,@是名称的一部分,因此也请在此处使用。

答案 5 :(得分:0)

有一个小错误。这是纠正的代码

using (SqlConnection conn = new  SqlConnection(ConfigurationManager.ConnectionStrings["intranetv2"].ConnectionString))
{

    SqlCommand cmd = new SqlCommand("insert into [MyBase].[Dbo].[LogErrors] (Username, StackTrace, ShortDescription, DetailDescription, ErrorType) VALUES (@Login, @Stack, @Message, @Txt, @Source)", conn);

            SqlParameter param = new SqlParameter();
            param.ParameterName = "@Login";
            param.Value = user.Login;
            cmd.Parameters.Add(param);

            SqlParameter param2 = new SqlParameter();
            param2 .ParameterName = "@Stack";
            param2 .Value = ex.StackTrace;
            cmd.Parameters.Add(param2);

            SqlParameter param3 = new SqlParameter();
            param3.ParameterName = "@Message";
            param3.Value = ex.Message;
            cmd.Parameters.Add(param3);

            SqlParameter param4 = new SqlParameter();
            param4.ParameterName = "@Txt";
            param4.Value = Txt;
            cmd.Parameters.Add(param4);

            SqlParameter param5 = new SqlParameter();
            param5.ParameterName = "@Source";
            param5.Value = ex.Source;
            cmd.Parameters.Add(param5);

            conn.Open();
            return cmd.ExecuteNonQuery();

}

由于

答案 6 :(得分:0)

问题是你不断改变'param'的值,然后只添加最后一个版本。

请尝试以下方法:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["intranetv2"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand("insert into [MyBase].[Dbo].[LogErrors] (Username, StackTrace, ShortDescription, DetailDescription, ErrorType) VALUES (@Login, @Stack, @Message, @Txt, @Source)", conn);

    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Login", Value = user.Login });
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Stack", Value = ex.StackTrace });
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Message", Value = ex.Message});
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Txt", Value = Txt });
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Source", Value = ex.Source});

    conn.Open();
    return cmd.ExecuteNonQuery();
}