为什么我在C#中的SQL代码不起作用?

时间:2017-01-24 09:53:24

标签: c# sql database visual-studio visual-studio-2015

我编写了一个SQL命令来保存数据库中的一些项目。但是当我运行它时,它会给出一条错误消息:

enter image description here

这是我的代码:

public void Opslaan(string titel, string rVoornaam, string rAchternaam, decimal beoordeling, string a1Voornaam, string a1Achternaam, string a2Voornaam, string a2Achternaam, string a3Voornaam, string a3Achternaam)
    {
        if (beoordelingBest < beoordeling)
        {
            titelBest = titel;
            beoordelingBest = beoordeling;
        }
        string queryString = "INSERT INTO Films (titel, beoordeling) VALUES('" + titel + "', " + beoordeling + ");" +
                             "INSERT INTO Acteurs (voornaam, achternaam, FilmID) VALUES('" + a1Voornaam + "' , '" + a1Achternaam + "', (SELECT FilmID from Films where titel = '" + titel + "'));" +
                             "INSERT INTO Acteurs (voornaam, achternaam, FilmID) VALUES('" + a2Voornaam + "' , '" + a2Achternaam + "', (SELECT FilmID from Films where titel = '" + titel + "'));" +
                             "INSERT INTO Acteurs (voornaam, achternaam, FilmID) VALUES('" + a3Voornaam + "' , '" + a3Achternaam + "', (SELECT FilmID from Films where titel = '" + titel + "'));" +
                             "INSERT INTO Regisseurs (voornaam, achternaam, FilmID) VALUES('" + rVoornaam + "' , '" + rAchternaam + "', (SELECT FilmID from Films where titel = '" + titel + "'));";
        command = new SqlCommand(queryString, con);

有人可以帮我这个吗?我无法弄清楚。

3 个答案:

答案 0 :(得分:3)

  1. 使用参数化查询,不要使用字符串连接。这是为了防止sql注入攻击,但也有错误,例如忘记确保strins被转义(例如,如果字符串包含')。
  2. 如果您有多个查询,则每个唯一参数值都应具有自己的参数名称/值
  3. 将{ado.net数据库类型(SqlConnection,SqlCommand等)包装在using块中(如果它们是一次性的)
  4. 永远不要将连接重用为全局对象,在需要时创建,使用和销毁它们。
  5. 以下是带有1个语句的更新代码,您可以向其附加其他语句,并根据需要添加更多参数。

    var query = "INSERT INTO Acteurs (voornaam, achternaam, FilmID) SELECT @a1Voornaam, @a1Achternaam, FilmID from Films WHERE titel = @title";
    
    using(var con = new SqlConnection("connection string here"))
    using(var command = new SqlCommand(queryString, con))
    {
      command.Parameters.Add(new SqlParameter("@a1Voornaam", SqlDbType.VarChar){Value = a1Voornaam});
      command.Parameters.Add(new SqlParameter("@achternaam", SqlDbType.VarChar){Value = achternaam});
      command.Parameters.Add(new SqlParameter("@title", SqlDbType.VarChar){Value = title});
    
      con.Open();
      command.ExecuteNonQuery();
    }
    

答案 1 :(得分:0)

也许您的一个值是');

这会提前终止INSERT语句,并导致错误。

                                                   |
                                                   V
  INSERT INTO Films (titel, beoordeling) VALUES('');,'anything');

您应该使用SqlParameters而不是字符串连接。

答案 2 :(得分:0)

您使用的是TextBoxes吗?我无法确定。尝试这样的事情,并根据您的具体需求进行调整。

using System.Data.SqlClient;

protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(System.Configuration.
ConfigurationManager.ConnectionStrings["con"].ToString());
    try
    {
        string query = "insert into UserDetail(Name,Address) 
        values('" + txtName.Text + "','" + txtAddress.Text + "');";
        SqlDataAdapter da = new SqlDataAdapter(query, con);
        con.Open();
        da.SelectCommand.ExecuteNonQuery();
        con.Close();
        lblmessage.Text = "Data saved successfully.";
    }
    catch
    {
        con.Close();
        lblmessage.Text = "Error while saving data.";
    }

}