0

我目前正在完成一个课程的 asp.net 项目,并开始注意到其中一个必要条件的主要缺陷。应用程序应提出五个问题并将答案写入数据库,然后将调查结果显示给用户。

这是我到目前为止所尝试的:

 public static string GetConnectionString()
    {
        string connStr = String.Format("server={0}; user id={1}; password={2};" + "database= -table to be accessed-; pooling=false", 
            "-database server-", "-user-", "-password-");
        return connStr;
    } 

 protected void Button1_Click(object sender, EventArgs e)
    {

        if (Page.IsValid)
        {
            string sex = gender.Text;
            string likes = interests.Text;
            string edu = education.Text;
            string nation = nationality.Text;
            string userage = age.Text;

            MySql.Data.MySqlClient.MySqlConnection mycon;

            mycon = new MySqlConnection(GetConnectionString());

            try
            {
                MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
                cmd.ExecuteNonQuery();
                mycon.Open();
            }

            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

            finally
            {
                mycon.Close();
            }

        }
    }

我继续用占位符替换了数据库信息。

数据库是 MySql 并托管在外部服务器上。

我遇到的问题是代码可以编译,但是信息没有写入数据库。我不确定这是否是因为我仍在测试代码并且尚未将 Web 应用程序上传到服务器,或者它只是错误的事实。

就显示结果而言,如果上面的代码是正确的,那只是更改 sql 查询的问题,对吗?

提前感谢您的洞察力。

4

5 回答 5

5

您在打开数据库连接之前执行命令。

ExecuteNonQuery()方法和所有其他 Execute 方法都需要打开的数据库连接。

另一个错误是:
列数(即 5)和提供的值(即 4)不相等。

正如Steve Wellens所说,您的代码中还有一个问题

更改您的代码,如下所示:

try
{
    MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
    mycon.Open();
    cmd.ExecuteNonQuery();
}    
catch (Exception ex)
{
    Response.Write(ex.Message);
}    
finally
{
    mycon.Close();
}

安全说明:

切勿data使用运算符添加到查询中+。它可能会导致SQL 注入

如果用户输入1); DROP TABLE <table-name> --..怎么办Age TextBox??
任何人都可以从数据库中完全删除任何表。

使用MySQL Parameter来避免此类问题。它可以防止对整个数据库造成严重损害。

于 2013-02-23T18:48:36.100 回答
1

在您的连接字符串中:

"database= -table to be accessed-;

...你不放桌子。该表在 SQL 语句中指定。

于 2013-02-23T17:30:56.980 回答
1

您应该先打开连接,然后执行查询。

    try
                {
                    MySqlCommand cmd = new MySqlCommand("INSERT INTO survey (gender, age, birthplace, occupation, winner) VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", mycon);
                    mycon.Open();
                    cmd.ExecuteNonQuery(); 
                }
于 2013-02-23T18:02:17.357 回答
1

这可能不是唯一的问题,但它是一个问题:

"INSERT INTO survey (gender, age, birthplace, occupation, winner) " + 
"VALUES ('" + sex  + ", " + likes + ", " + edu + ", " + userage + "')", 

(我把它分成两个字符串,以便于阅读。)

您正在插入五列。您只指定了四个数据值,除了性别之外,它们的顺序似乎不正确,甚至不是正确的数据。

于 2013-02-23T18:49:08.277 回答
-1

尝试检查这些事情:

  1. 在执行 SQL 之前尝试打开连接

  2. 检查您的 SQL,并尝试直接对数据库执行它们。我在您的 SQL 中看到的是您将值连接成一个字符串(引号仅存在于开头和结尾,但不存在于传递的参数之间)

于 2013-02-23T17:35:46.953 回答