.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"> </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 для обработки исключения.