.ExecuteNonQuery() sql asp.net ошибка

Я впервые работаю с sql и asp.net. Я работаю над несколькими примерами, чтобы убедиться, что у меня есть все необходимые основы. Я шел через учебник, и где все должно работать просто отлично, я получаю ошибку.ExecuteNonQuery(). SqlException не был обработан кодом пользователя // Неверный синтаксис рядом с ключевым словом "Таблица".

Если у вас есть какие-либо указатели, дайте мне знать. Я работал над учебником дважды, я уверен, что здесь что-то не так. -Спасибо

Код.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)
);

5 ответов

Решение

Обычно это сообщение об ошибке вызвано одинарной кавычкой, присутствующей во вводимых текстовых полях, или использованием зарезервированного ключевого слова. Обе проблемы присутствуют в вашем запросе. Слово TABLE является зарезервированным ключевым словом для SQL Server, и поэтому вы должны заключить его в квадратные скобки, в то время как для возможного присутствия одинарной кавычки во входном тексте правильным подходом является использование параметризованного запроса, подобного этому

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.

Также я предлагаю НЕ ИСПОЛЬЗОВАТЬ глобальную переменную, чтобы сохранить ссылку на SqlConnection. Это дорогостоящий ресурс, и если вы забудете закрыть и утилизировать его, это может существенно повлиять на производительность и стабильность вашего приложения.
В подобных ситуациях оператор использования - это все, что вам действительно нужно

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

Ваш запрос пытается вставить в таблицу с именем Table. Это действительно существует? Если нет, то укажите фактическое имя таблицы в запросе. Если ваша таблица действительно называется Table, то я настоятельно рекомендую вам изменить ее на что-то менее запутанное.

Кроме того, прекратите писать команды, объединяя текст сейчас. Узнайте, как использовать параметры для предотвращения внедрения SQL

РЕДАКТИРОВАТЬ

Оператор вставки использует формат, указанный в документах BOL для INSERT, и приведенные в нем примеры. Таблица - это ключевое слово, поэтому не используйте его в качестве имени таблицы. Если вам нужно использовать ключевое слово, вы должны избегать его, используя квадратные скобки. См. BOL: Идентификаторы с разделителями

Я до сих пор говорю, не используйте "Таблица" в качестве имени для таблицы. Сделай свою жизнь проще.

Да, и напишите безопасный код (см. Выше комментарий о внедрении SQL-кода, о том, как получил доступ Linked In, и сколько это им стоило)

Изменено "вставить в значения таблицы" на "вставить в значения [таблицы]", и все работает нормально. Спасибо Примечание к себе, держись подальше от простых имен.

      SqlConnection conn = new SqlConnection("Data Source=MCTX-ZAFEER\\SQLEXPRESS;Initial Catalog=ZKAbid_Db;Persist Security Info=True;User ID=sa;Password=sa@1234");
    public int checkLogin(Ad_login ad)
    {
        SqlCommand cmd = new SqlCommand("Sp_Login", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Admin_id", ad.Ad_id);
        cmd.Parameters.AddWithValue("@Password", ad.Ad_Password);
        // cmd.InsertCommand.Connection = connection1;
        SqlParameter objLogin = new SqlParameter();
        objLogin.ParameterName = "@isValid";
        objLogin.SqlDbType = SqlDbType.Bit;
        objLogin.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(objLogin);

        conn.Open();
        cmd.ExecuteNonQuery();
        int res = Convert.ToInt32(objLogin.Value);
        conn.Close();
        return res;
    }

Везде, где вы используете ExecuteNonQuery(), вы должны перехватывать SqlException, или вам нужно выбросить из вашей функции.

В случае, указанном выше Button1_Click является функцией, использующей ExecuteNonQuery() из класса SqlCommand.

Теперь, что происходит, что эта функция (ExecuteNonQuery) имеет определение, чтобы бросить SqlException. так что у вас есть два варианта - вы также можете выбросить SqlException - или вы можете поместить эту строку в блок try catch для обработки исключения.

Другие вопросы по тегам