【问题标题】:Inserting into table from a form in asp.net从asp.net中的表格插入表格
【发布时间】:2013-05-14 10:55:12
【问题描述】:

我有一个页面,你填写一些信息,然后根据这些信息我在数据库中插入一个新行。以下是填写的表格截图:

这是我点击提交按钮时插入数据库的代码:

 protected void CreateCourseButton_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=University;Integrated Security=True;Pooling=False";

    string query1 = "insert into Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite) values ("
        + courseID.Text + "," + courseName.Text + "," + studyLevel.SelectedValue + "," + capacity.Text + "," + "Admin," + credits.Text + "," + prereq.Text + ")";



    SqlCommand cmd1 = new SqlCommand(query1, con);
    con.Open();
    cmd1.ExecuteNonQuery();
    con.Close();
}

问题是,当我点击提交时出现以下错误:

Server Error in '/Bannerweb' Application.

Incorrect syntax near the keyword 'to'.

Description: An unhandled exception occurred during the execution of the current web     
request. Please review the stack trace for more information about the error and where   
it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: Incorrect syntax near the   
keyword 'to'.

Source Error: 


Line 32:         SqlCommand cmd1 = new SqlCommand(query1, con);
Line 33:         con.Open();
Line 34:         cmd1.ExecuteNonQuery();
Line 35:         con.Close();
Line 36:     }

Source File: c:\Banner\Bannerweb\Pages\CreateCourse.aspx.cs    Line: 34 

Stack Trace: 


[SqlException (0x80131904): Incorrect syntax near the keyword 'to'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean     
breakConnection) +2084930
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean    
breakConnection) +5084668
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler,   
SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject  
stateObj) +2275
   System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean 
async) +228
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,     
String methodName, Boolean sendToPipe) +326
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137
   CreateCourse.CreateCourseButton_Click(Object sender, EventArgs e) in  
c:\Banner\Bannerweb\Pages\CreateCourse.aspx.cs:34
  System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112

第 34 行是:

cmd1.ExecuteNonQuery();

谁能帮我解决这个错误?

谢谢

【问题讨论】:

  • 尝试打印出query1,您可以自己查看。提示:注意引号。
  • 这是像您一样处理 SQL 查询的问题的一部分,您会遇到 SQL 查询不“完全”匹配的情况。您应该使用参数化查询,让提供者为您完成大部分工作。我会获取您正在生成的查询并自己在数据库上运行它 - 您会看到问题所在。
  • 显示CreateCourse.aspx.cs页面的Line: 34
  • @Rahul 第 34 行是 cmd1.ExecuteNonQuery();您也可以在编辑后的问题中看到
  • 只需按照我提到的那样更改您的插入查询并检查您是否再次发现该错误,或​​者如果您的数据字段类型 id nvarchar 或 varchar 然后在您的查询中使用 '"++"' 那样的字段。

标签: c# asp.net sql database


【解决方案1】:

发生此错误是因为您在插入的值之间缺少 ''。无论如何,最好的方法是使用 Parameters 这样的集合:

string query1 = "insert into Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite) values (@crn, @cursename, @studylevel, @capacity, @instructor, @credits, @prerequesite)";

SqlCommand cmd1 = new SqlCommand(query1, con);
cmd1.Parameters.AddWithValue("@crn", courseID.Text);
//add the rest

con.Open();
cmd1.ExecuteNonQuery();
con.Close();

【讨论】:

  • 谢谢,我解决了这个问题。我还有一个小问题:我想做类似的事情,如果(插入数据库成功)做其他事情做另一件事。有这样的布尔函数可以检查吗?
  • ExecuteNonQuery() 返回受影响的行数,因此如果返回 0,则表示没有插入任何行。更多here
【解决方案2】:

看来您需要在 Course Name 周围添加引号。还要使用SQL parameterized queries,这样你就不会受到SQL Injection 的攻击。

'" + courseName.Text + "'

将评估为:

'Intro to comp'

http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/

【讨论】:

  • 谢谢,我解决了这个问题。我还有一个小问题:我想做类似的事情,如果(插入数据库成功)做其他事情做另一件事。有这样的布尔函数可以检查吗?
  • @bigO - ExecuteNonQuery() 返回一个整数(受影响的行数)......你可以这样做:var results = cmd1.ExecuteNonQuery(); 然后检查if results > 1
  • @bigO - 没问题。如果此答案有帮助,请将其标记为答案。
【解决方案3】:

此错误可能来自Course name 字段,其中值中有空格。要修复它,您可以将 TextBoxes 的值包装到 ' 字符中。

但是,这是一个巨大的安全漏洞。现在,您必须使用参数,例如您的插入必须如下所示:

SqlConnection con = new SqlConnection();
con.ConnectionString = "...";

string query1 = "insert into Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite)"+
    " values (@CRN, @CourseName, ...)";



SqlCommand cmd1 = new SqlCommand(query1, con);

// Insert parameters
cmd1.Parameters.AddWithValue("@CRN",courseID.Text);
...

con.Open();
cmd1.ExecuteNonQuery();
con.Close();

您必须使用参数来保护自己免受 SQL 注入攻击。

【讨论】:

  • 谢谢,我解决了这个问题。我还有一个小问题:我想做一些事情,如果(插入数据库成功)做某事,否则做另一件事。有这样的布尔函数可以检查吗?
  • @bigO 我认为你可以使用两件事。 1 是使用cmd1.ExecuteNonQuery的返回值,来自msdnFor ... INSERT ...语句,返回值是受命令影响的行数. ... 对于所有其他类型的语句,返回值为 -1。如果发生回滚,则返回值也是-1。2 如果这是你需要的,你可以捕获任何异常来进行错误处理(但不要使用异常来控制正常的执行流程)
【解决方案4】:

你必须像这样传递'Update你的sql查询中所有控件的值:

   string query1 = "insert into 
Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite) values ("+
"'" + courseID.Text + "'" + "," + "'" + courseName.Text + "'" + "," + 
"'" + studyLevel.SelectedValue + "'" + "," + "'" + capacity.Text + "'" +
"," + "'Admin'," + "'" + credits.Text + "'" + "," +  "'"+prereq.Text +"'" + ")";

//返回查询影响的行数

int a= cmd1.ExecuteNonQuery();
if(a>0)
{
//inserted
}
else
{
//not inserted
}

查看here了解更多详情。

【讨论】:

  • 谢谢,我解决了这个问题。我还有一个小问题:我想做类似的事情,如果(插入数据库成功)做其他事情做另一件事。有这样的布尔函数可以检查吗?
【解决方案5】:

试试这个

string query1 = "insert into Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite) 
        values ('"+ courseID.Text +"','"+ courseName.Text + "','" + studyLevel.SelectedValue +"', '" + capacity.Text +"','" + "Admin" +"','"+credits.Text + "','" + prereq.Text +"') ";

您的查询语法完全错误。

【讨论】:

    【解决方案6】:

    修改你的Insert查询

    string query1 = "insert into Courses(CRN,CourseName,StudyLevel,Capacity,Instructor,Credits,Prerequisite) values ("
            + courseID.Text + ",'" + courseName.Text + "'," + studyLevel.SelectedValue + "," + capacity.Text + "," + "Admin," + credits.Text + "," + prereq.Text + ")";
    

    第二个问题

    如果它被保存,那么ExecuteNonQuery 将返回您1 否则0,因此通过使用返回值您可以检查并应用您的条件。

    希望你能理解。

    【讨论】:

    • 谢谢,我解决了这个问题。我还有一个小问题:我想做类似的事情,如果(插入数据库成功)做其他事情做另一件事。有这样的布尔函数可以检查吗?
    • 你可以拿一个标签来显示成功/失败文本... label1.Text="Successfully Inserted"
    • 这段代码很容易受到sql注入的攻击。避免通过字符串连接构建动态 sql。尽可能使用 sql 参数。
    【解决方案7】:
    protected void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection("Data Source=D1-0221-37-393\\SQLEXPRESS;Initial Catalog=RSBY;User ID=sa;Password=BMW@721");
            conn.Open();
            string EmployeeId = Convert.ToString(TextBox1.Text);
            string EmployeeName = Convert.ToString(TextBox2.Text);
            string EmployeeDepartment = Convert.ToString(DropDownList1.SelectedValue);
            string EmployeeDesignation = Convert.ToString(DropDownList2.SelectedValue);
            string DOB = Convert.ToString(TextBox3.Text);
            string DOJ = Convert.ToString(TextBox4.Text);
            SqlCommand cmd = new SqlCommand("insert into Employeemaster values('" + EmployeeId + "','" + EmployeeName + "','" + EmployeeDepartment + "','" + EmployeeDesignation + "','" + DOB + "','" + DOJ + "')", conn);
            cmd.ExecuteNonQuery();
    
        }
    

    【讨论】:

      猜你喜欢
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2023-03-02
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多