【问题标题】:Non-integer primary key exception非整数主键异常
【发布时间】:2018-07-12 22:40:17
【问题描述】:

大家好,我正在处理具有简单表格和数据库的学校作业。

数据库中有学生表。

问题:

当我将 stu_ID 输入为整数时,该程序可以工作,它是主键,如 1234, 当我输入 stu_ID 作为非整数时出现问题。(分配要求)。 像 BSCS-122.it 给出以下异常

'System.Data.SqlClient.SqlException' {"无效的列名'BSCS'。"}

我正在使用 Visual Studio 2015 SQL Server 2008 R2 速成版。

学生 stu_Id varchar(50) PK stu_Name varchar(50) Stu_Age int stu_Semester int stu_City varchar(50) +------------+-----------------+---------+-------- ------+--------------+ | stu_Id | stu_Name | Stu_Age | stu_学期 | stu_City | +------------+-----------------+---------+-------- ------+--------------+ | BSCS-122 |丹麦卡里姆 | 22 | 5 |德佳 | | MBA-233 |卡姆兰 | 23 | 5 | JPT | | .. .... | ...... | ..... ..| ………………| …………| +------------+-----------------+---------+-------- ------+--------------+

c#代码如下。

 private void btnInsert_Click(object sender, EventArgs e)
    {
        SqlConnection objSqlConnection = new SqlConnection(@"Data Source=DESKTOP-VESS66M\SQLEXPRESS;Initial Catalog=Persons;Integrated Security=True");
        try
        {
            //
            objSqlConnection.Open();
            string insertCommand = "INSERT INTO students VALUES (" +stu_ID.Text+ ",'" + stu_Name.Text + "','" + Convert.ToInt32(stu_Age.Text) + "','" + Convert.ToInt32(stu_Semester.Text) + "','" + stu_City.Text + "')";
            SqlCommand objSqlCommand = new SqlCommand(insertCommand, objSqlConnection);
            objSqlCommand.ExecuteNonQuery();
            //
            this.studentsTableAdapter.Fill(this.personsDataSet.students);
            //
            MessageBox.Show("Student " + txtName.Text + " had been added Successfully", "Added Succefull", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }
        catch (Exception)
        {

            throw;
        }
        finally
        {
            objSqlConnection.Close();
        }

    }

【问题讨论】:

  • 使用参数化 SQL 查询。您的问题是您没有在查询中打开带有 ' 的 id 字符串。如果您使用 sql 参数,您将解决此问题并避免 sql 注入问题。
  • 你了解SQL注入了吗?如果您在查询中使用参数,那么您可以避免字符串周围缺少引号的麻烦(这是这里的问题)。数字不需要引号,但像 BSBC 这样的输入需要引号。 bobby-tables.com/csharp
  • 当您构建 SQL 时 - 可以有一个没有引号的整数,但文本必须在引号内 - 您正在构建没有单引号的 stu_ID 部分 - 似乎是直接的问题跨度>
  • 除了上述关于将字符串括在引号中的 cmets - 作为对正在发生的事情的解释 - 因为它不在引号中 BSCS-122 被视为表达式 - 列 BSCS 减去的当前内容122.跨度>

标签: c# sql-server


【解决方案1】:

快速的解决方法是在 stu_ID 周围添加单引号,但这很容易导致 SQL 注入:"'"+stu_ID.Text+"'"

更好的方法是在查询中添加参数,以防止 SQL 注入:

string insertCommand = "INSERT INTO students VALUES (@stuID, @stuName, @stuAge, @stuSemester, @stuCity)";
insertCommand.Parameters.Add(new SqlParameter("stuId", stu_ID.Text));
command.Parameters.Add(new SqlParameter("stuName", stu_Name.Text));
command.Parameters.Add(new SqlParameter("stuAge", Convert.ToInt32(stu_Age.Text)));
command.Parameters.Add(new SqlParameter("stuSemester", Convert.ToInt32(stu_Semester.Text)));
command.Parameters.Add(new SqlParameter("stuCity", stu_City.Text));

【讨论】:

    【解决方案2】:

    您的文本字段值需要用单引号括起来,例如:

    "INSERT INTO students VALUES ('" + stu_ID.Text + "')"

    但是,这仍然是一个非常糟糕的主意,因为您要让自己对SQL Injection 开放。如果您不打算为数据层使用框架(例如实体框架),则至少需要使用SQLParameter 来注入您的值。

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2011-01-10
      相关资源
      最近更新 更多