【问题标题】:.ExecuteNonQuery() sql asp.net error.ExecuteNonQuery() sql asp.net 错误
【发布时间】:2017-12-24 09:53:52
【问题描述】:

这是我第一次使用 sql 和 asp.net。我正在研究一些示例,以确保我拥有所需的所有基础知识。我正在浏览一个教程,并且一切都应该正常工作,但我收到了一个 .ExecuteNonQuery() 错误。 SqlException 未被用户代码处理 // 关键字“Table”附近的语法不正确。

如果您有任何指示,请告诉我。我把教程工作了两次,我确定我在这里做错了什么。 -谢谢

.CS 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

namespace WebSite
{
public partial class _default : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

    protected void Page_Load(object sender, EventArgs e)
    {
        con.Open();
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        SqlCommand cmd = new SqlCommand("insert into Table values('" + txtfName.Text + "','" + txtlName.Text + "','" + txtpNumber.Text + "')", con);
        cmd.ExecuteNonQuery();
        con.Close();
        Label1.Visible = true;
        Label1.Text = "Your DATA has been submitted";
        txtpNumber.Text = "";
        txtlName.Text = "";
        txtfName.Text = "";
    }
  }
}

.aspx 文件:

<form id="form1" runat="server">
<div class="auto-style1">

    <strong>Insert data into Database<br />
    <br />
    </strong>

</div>
    <table align="center" class="auto-style2">
        <tr>
            <td class="auto-style3">First Name:</td>
            <td class="auto-style4">
                <asp:TextBox ID="txtfName" runat="server" Width="250px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="auto-style3">Last Name:</td>
            <td class="auto-style4">
                <asp:TextBox ID="txtlName" runat="server" Width="250px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="auto-style3">Phone Number:</td>
            <td class="auto-style4">
                <asp:TextBox ID="txtpNumber" runat="server" Width="250px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="auto-style3">&nbsp;</td>
            <td class="auto-style4">
                <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" Width="150px" />
            </td>
        </tr>
    </table>
    <br />
    <br />
    <asp:Label ID="Label1" runat="server" ForeColor="#663300" style="text-align: center" Visible="False"></asp:Label>
    <br />
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Table]"></asp:SqlDataSource>
</form>

SQL 数据库:

CREATE TABLE [dbo].[Table] (
[Id]      INT          IDENTITY (1, 1) NOT NULL,
[fName]   VARCHAR (50) NOT NULL,
[lName]   VARCHAR (50) NOT NULL,
[pNumber] VARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

【问题讨论】:

  • SQL Injection alert - 你应该将你的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入

标签: asp.net sql visual-studio-2012 executenonquery


【解决方案1】:

此错误消息通常是由输入文本框中的单引号或使用保留关键字引起的。您的查询中存在这两个问题。 TABLE 字是reserved keyword for SQL Server,因此您应该用方括号将其封装起来,而对于输入文本中可能存在单引号的情况,正确的方法是像这样使用Parameterized Query

SqlCommand cmd = new SqlCommand("insert into [Table] values(@fnam, @lnam, @pNum)", con);
cmd.Parameters.AddWithValue("@fnam", txtfName.Text );
cmd.Parameters.AddWithValue("@lnam", txtlName.Text );
cmd.Parameters.AddWithValue("@pNum", txtpNumber.Text);
cmd.ExecuteNonQuery();

通过这种方法,您可以将解析输入文本的工作转移到框架代码中,并避免解析文本和Sql Injection出现问题

另外,我建议不使用一个全局变量来保留 SqlConnection 引用。这是一种昂贵的资源,如果您忘记关闭和处置它,可能会对应用程序的性能和稳定性产生重大影响。
对于这种情况,您真正需要的是 using statement

using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings
                             ["ConnectionString"].ConnectionString));
{
    con.Open();
    SqlCommand cmd = new SqlCommand("insert into [Table] values(@fnam, @lnam, @pNum)", con);
    cmd.Parameters.AddWithValue("@fnam", txtfName.Text );
    cmd.Parameters.AddWithValue("@lnam", txtlName.Text );
    cmd.Parameters.AddWithValue("@pNum", txtpNumber.Text);
    cmd.ExecuteNonQuery();
}

当然要去掉全局变量并在Page_Load中打开

【讨论】:

  • +1,但我也相信您需要将 sql 设置为:insert into [Table] values....,因为该表实际上是使用的名称 :-/ 并且是保留关键字。
  • 是的@Aristos 我也添加了这个,正在寻找正确的链接以添加到答案中
  • 这首先是实际的错误,但是给他这个完整的答案很好。名称 Table 非常基本,就像创建表时的 select :) 一样!有它,并在他们的问题上 :)...
  • @史蒂夫。 “有一个全局变量来保存 SqlConnection 引用”——真的吗?这就是连接池的用途。在大多数情况下,保持自己的全球连接不被视为最佳做法。参见:stackoverflow.com/a/10116623/1945631,例如
  • 我建议 NOT 有一个全局变量来保留 SqlConnection 引用,因为连接池会使这种方法适得其反。我误解了你的评论吗?
【解决方案2】:

您的查询正试图插入一个名为 Table 的表中。那真的存在吗?如果没有,则将实际表名放入查询中。如果您的表格确实被称为表格,那么我强烈建议您将其更改为不那么令人困惑的东西。

另外,通过现在连接文本来停止编写命令。了解如何使用parameters 以防止SQL injection

编辑

插入语句使用BOL documents for INSERTexamples provided therein 中指定的格式。表是一个关键字,所以不要用它作为表名。如果必须使用关键字,则需要使用方括号对其进行转义。见BOL: Delimited Identifiers

我还是要说,不要使用“Table”作为表格的名称。让您的生活更轻松。

哦,还有编写安全代码(请参阅上面关于 SQL 注入的评论,以及Linked In got hit 是如何进行的,以及它们的成本是多少)

【讨论】:

  • +1 用于指出确切的问题。名称为 table 的表不存在。
  • 数据库中的表名为dbo.Table
  • 其实我认为插入语法是错误的,但更大的问题是命名一个表“表”并编写不安全的代码
  • @SeanRobbins 名字Table是一个sql关键字,把你的sql改成:insert into [Table] values....,避免使用保留关键字...
  • 将“插入表值”更改为“插入 [表] 值”,一切正常。安迪,你是 SH$T!感谢自我提醒,远离简单的名字。
【解决方案3】:

将“插入表值”更改为“插入 [表] 值”,一切正常。感谢自我提醒,远离简单的名字。

【讨论】:

    【解决方案4】:

    无论你在哪里使用 ExecuteNonQuery(),你都应该捕获 SqlException 或者你需要从你的函数中抛出。

    在上面给出的情况下,Button1_Click 是使用 SqlCommand 类中的 ExecuteNonQuery() 的函数。

    现在这个函数 (ExecuteNonQuery) 有定义抛出 SqlException 会发生什么。所以你有两个选择 - 你也可以抛出 SqlException - 或者您可以将此行放在 try catch 块中以处理异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多