从用户在asp.net c中输入的数据向SQL Server数据库添加行#

时间:2014-03-26 15:20:35

标签: c# asp.net sql sql-server

string ConnectionString = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection connection = new SqlConnection(ConnectionString);

SqlCommand cmd = new SqlCommand("INSERT INTO Data (Name, Sur-Name, Score,Avg) VALUES ('" + fName + "','" + sName + "','" + lblScore.Text + "','" + lblAvg.Text + "');");
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.Parameters.AddWithValue("@Name", fName);
cmd.Parameters.AddWithValue("@Sur-Name", sName);
cmd.Parameters.AddWithValue("@Score", lblScore.Text);
cmd.Parameters.AddWithValue("@Avg", lblAvg.Text);

try
{
    connection.Open();
    cmd.ExecuteNonQuery();
}
catch (Exception exc)
{
    lblData.Text = exc.Message;              
}
finally
{
    connection.Close();
}

我不断得到的错误是运行时说

  

' - '附近的语法不正确。 “ - ”附近的语法不正确。

我使用了try catch,因此页面会加载并且我的分数显示但是标签说明了这个不正确的语法,我想知道任何人都可以帮我解决我做错了什么

感谢。

2 个答案:

答案 0 :(得分:11)

我认为Sur-Name会破坏您的查询。与[Sur-Name]

等方括号一起使用

但更重要的是,请使用parameterized queries。这种字符串连接对SQL Injection攻击是开放的。我看到你试图使用,但你从未在查询中声明参数名称。

对于SQL Server的未来版本,DATA也可能是reserved keyword。您可能还需要使用[DATA]

考虑使用using statement来处置您的SqlConnectionSqlCommand

using(SqlConnection connection = new SqlConnection(ConnectionString))
using(SqlCommand cmd = connection.CreateCommand())
{
   cmd.CommandText = @"INSERT INTO [Data] (Name, [Sur-Name], Score, Avg)
                       VALUES (@Name, @SurName, @Score, @Avg)";
   cmd.Connection = connection;
   cmd.Parameters.AddWithValue("@Name", fName);
   cmd.Parameters.AddWithValue("@SurName", sName);
   cmd.Parameters.AddWithValue("@Score", lblScore.Text);
   cmd.Parameters.AddWithValue("@Avg", lblAvg.Text);

   try
   {
        connection.Open();
        cmd.ExecuteNonQuery();
   }
   catch (Exception exc)
   {
        lblData.Text = exc.Message;
   }     
}

答案 1 :(得分:3)

您正在尝试将连接查询与参数化混合使用。始终使用参数化查询,它将使您免于SQL注入。

SqlCommand cmd = new SqlCommand(@"INSERT INTO [Data] (Name, [Sur-Name], Score,Avg) VALUES (
                                  @Name, @SurName, @Score, @Avg)");
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
cmd.Parameters.AddWithValue("@Name", fName);
cmd.Parameters.AddWithValue("@SurName", sName);
cmd.Parameters.AddWithValue("@Score", lblScore.Text);
cmd.Parameters.AddWithValue("@Avg", lblAvg.Text);

还要考虑在using语句中包含您的连接和命令对象。

正如@Soner在his answer中提到的,使用方括号代表DataSur-Name