我有这个错误: 必须声明标量变量“@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中试过'@',但我也有同样的错误。
答案 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();
}