“ID”附近的语法不正确

时间:2013-12-24 16:22:35

标签: c# database

private void btnID_Click(object sender, EventArgs e)
    {
      //Set Up Conncetion
        SqlConnection myconnection = new SqlConnection(global::Database_connection_inForm.Properties.Settings.Default.Database1ConnectionString);
        try
        {
           string sql = "INSERT INTO Students(Student ID,Student Name) values("+txtID.Text+",'"+txtName.Text+"')";
           //Command object

           SqlCommand exeSql = new SqlCommand(sql, myconnection);
           myconnection.Open(); //Opening connection
           exeSql.ExecuteNonQuery();

           MessageBox.Show("Add new Record Done!","Message",MessageBoxButtons.OK,MessageBoxIcon.Information);
           this.studentsTableAdapter.Fill(this.database1DataSet.Students);



        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        finally
        {
            myconnection.Close();
        }
    }

    private void btnRef_Click(object sender, EventArgs e)
    {
        this.studentsTableAdapter.Fill(this.database1DataSet.Students);
    }
}

4 个答案:

答案 0 :(得分:3)

当列名包含空格时,您应始终使用方括号

封装该名称
sql = "INSERT INTO Students([Student ID],[Student Name]) ....." 

说,请删除你的字符串连接并使用参数化查询ALWAYS。 使用参数而不是字符串concat要好得多。主要原因是避免使用Sql Injection,但参数方法也会删除引用问题(IE名称='O'Brian'在使用字符串concat时会导致语法错误)

private void btnID_Click(object sender, EventArgs e)
{
   try
   {
       string sql = "INSERT INTO Students([Student ID],[Student Name]) " + 
                    "values (@id, @name)";
        using(SqlConnection myconnection = new SqlConnection(....))
        using(SqlCommand exeSql = new SqlCommand(sql, myconnection))
        {
           myconnection.Open();
           exeSql.Parameters.AddWithValue("@id",Convert.ToInt32(txtID.Text));
           exeSql.Parameters.AddWithValue("@name",txtName.Text);
           exeSql.ExecuteNonQuery(); 
        }
   }
   .....

另请注意,我已将txtID.Text内容转换为整数而不进行任何检查 如果您的用户键入的内容不是有效的数字ID,则可能会失败(如果学生ID是Identity列,则绝不应在INSERT语句中传递此值)

作为最后的说明。你真的需要这些列名吗?让它们没有空格要好得多,否则每次使用这个表都会遇到这个问题

答案 1 :(得分:0)

如果您的标识符包含空格,则必须分隔标识符。您这样做的方式取决于您使用的数据库。

在SQL Server中,您使用方括号:

string sql = "INSERT INTO Students([Student ID],[Student Name]) values(@Id,@Name)";

在MySQL中你使用反引号:

string sql = "INSERT INTO Students(`Student ID`,`Student Name`) values(@Id,@Name)";

请注意,我已使用参数替换了查询中的连接值。您应该使用参数化查询,否则您的代码会对SQL注入攻击持开放态度。

答案 2 :(得分:0)

首先,您没有使用正确的命名约定

你应该使用

StudentId Student_Id (建议使用第一个)

如果列名称之间有空格,则应使用“[” “]”并覆盖列名称

答案 3 :(得分:-1)

列名称中有空格

string sql = "INSERT INTO Students(Student ID,Student Name) values("+txtID.Text+",'"+txtName.Text+"')";

这是一个问题 - 检查列名并使用正确的列名。