0

谢谢你的帮助。你们所有人(字面意思)

我检查了我正在更新条目的代码的另一部分,我使用了该代码并对其进行了修改。现在它可以工作了

这里是

string sql = "DELETE from Login WHERE UserName = '" + comboBox1.SelectedItem.ToString() + "'";

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;


            cmd.Parameters.Add(new SqlParameter("@UserName", comboBox1.SelectedItem.ToString()));
            int rowdel = cmd.ExecuteNonQuery();
            MessageBox.Show("Done!");

这是我从通过组合框选择的数据库中删除特定行的代码。我的老师使用了相同的代码并且他的程序有效。但是它显示错误:

" int rowInserted = cmd.ExecuteNonQuery(); "

它说

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常附加信息:“=”附近的语法不正确。

这是我的代码:

private void button1_Click(object sender, EventArgs e)
        {
            string connectionString = "Server = HP-PC\\SQLExpress; Database = CProject; Trusted_Connection = True";
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = connectionString;
            conn.Open();

            string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString();

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sql;

            int rowInserted = cmd.ExecuteNonQuery();
            label7.Text = rowInserted.ToString();

            conn.Close();


        }

        private void AddDeleteUsers_Load(object sender, EventArgs e)
        {
            string connectionstring = "Server=HP-PC\\SQLExpress;Database=CProject;Trusted_Connection=True;";
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = connectionstring;
            conn.Open();

            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "select UserName from Login";

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            comboBox1.Items.Add(reader["UserName"].ToString());
            reader.Close();

            conn.Close();
        }
4

5 回答 5

4

我给你一个提示。

错误消息在您的 SQL 代码中,在这一行中:

    string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString();

问题是 SQL 需要单引号中的文本,例如 'text'...

在不提供答案的情况下(因为这是家庭作业),我认为这足以让您弄清楚吗?

编辑“按大众需求”

顺便说一句,不建议只从 HTML 输入(您的 ComboBox)中获取值的原因之一是它可能被恶意人员操纵并替换为 SQL 代码,这称为 SQL 注入。

为避免这种情况,建议使用参数。

一个例子是

    string sql = "delete from [Login] where UserName = @UserName"

然后,您必须在执行命令之前将参数添加到命令中

command.Parameters.AddWithValue("@UserName", comboBox1.SelectedText.ToString());

这可以防止有人将您的 SQL 语句变成险恶的东西。

于 2013-03-18T17:03:17.753 回答
2

改变

string sql = "delete from [Login] where UserName = " + comboBox1.SelectedText.ToString();

对此

string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString() + "'";

您需要在文本周围加上单引号。

于 2013-03-18T17:02:51.703 回答
1

尝试这个:

string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString() + "'";

最好使用SqlParameter避免sql注入。

        string sql = "delete from [Login] where UserName = @username";

        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = sql;
        cmd.Parameters.AddWithValue("@username", comboBox1.SelectedText.ToString());

        int rowInserted = cmd.ExecuteNonQuery();
于 2013-03-18T17:02:52.597 回答
1
string sql = "delete from [Login] where UserName = '" + comboBox1.SelectedText.ToString()+ "'";

更好,不是吗?

顺便提一下Sql注入...

于 2013-03-18T17:03:04.397 回答
0

为了防止 SQL 注入攻击,您应该使用参数化查询:

    string connectionString = "Server = HP-PC\\SQLExpress; Database = CProject; Trusted_Connection = True";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        string sql = "delete from [Login] where UserName = @UserName;";

        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            SqlParameter p = new SqlParameter("UserName", comboBox1.SelectedText.ToString());
            cmd.Parameters.Add(p);
            cmd.ExecuteNonQuery();
        }
    }
于 2013-03-18T17:12:24.803 回答