2013-06-28 16 views
1

我有此錯誤: 必須聲明標量變量「@Login」。必須聲明標量變量「@Login」。嘗試將參數添加到SqlDataSource時出錯

我的代碼:

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(); 
} 

我曾嘗試與前作「@」在參數,但我有同樣的錯誤。

+0

你甚至不嘗試添加'Login'作爲參數的名字 - 它的覆蓋,直到它的'Source'。 –

回答

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

您覆蓋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

其實,這並沒有幫助,因爲你再次使用相同的參數對象。我相信第二次調用cmd.Parameters.Add會引發異常,因爲該參數已經存在。如我錯了請糾正我。 – saamorim

+0

@saamorim - 關閉我的頭頂我不是100%確定。然而,我已經調整了我的答案,包括單獨的變量。 –

+0

不起作用。關於「Param已經知道cmd」的Sql異常。我需要爲每個參數聲明一個新的SqlParameter對象。 – Portekoi

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(); 
0

你重用相同參數實例的所有參數。這顯然是錯誤的。

更簡單的方法是使用addWithValue方法來代替:

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

注意,@是名稱的一部分,所以這裏也使用它。

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(); 

}

感謝

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(); 
} 
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(); 
}