System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' = '.' на Datatable и объект - PullRequest
1 голос
/ 01 февраля 2020

Я видел много похожих вопросов на этом сайте и в других местах, но ни один из них не помог мне.

Я пытаюсь установить соединение с базой данных с помощью запроса, но получаю ошибку

System.Data.SqlClient.SqlException: 'Неверный синтаксис рядом с' = '.'

в 2 разных строках кода. Я пытался использовать пробелы в запросе вокруг =, но это не помогает.

Код 1:

string connectieString = dbConnection();

SqlConnection connection = new SqlConnection(connectieString);

SqlCommand select = new SqlCommand();
select.Connection = connection;

select.Parameters.Add("@attackCategory", SqlDbType.NChar).Value = attackCategory;
select.Parameters.Add("@taughtOn", SqlDbType.NVarChar).Value = taughtOn;
select.CommandText = "SELECT ID, Name FROM attackCategory = @attackCategory WHERE TaughtOn = @taughtOn";

using (SqlDataAdapter sda = new SqlDataAdapter(select.CommandText, connection))
{
    DataTable dt = new DataTable();
    sda.Fill(dt);

    return dt;
}

Исключение выдается в строке sda.Fill(dt); код. Этот код работает, если в запросе не используются никакие параметры:

string cmd = @"select ID, Name from " + attackCategory + " where TaughtOn ='" + taughtOn + "'";

И код 2:

string connectieString = dbConnection();

SqlConnection connection = new SqlConnection(connectieString);

SqlCommand select = new SqlCommand();
select.Connection = connection;

select.Parameters.Add("@attackCategory", SqlDbType.NVarChar).Value = attackCategory;
select.Parameters.Add("@ID", SqlDbType.Int).Value = id;
select.CommandText = "SELECT Name FROM attackCategory = @attackCategory WHERE ID = @ID";

connection.Open();
object name = select.ExecuteScalar();
connection.Close();

return name;

Исключение возникает в строке кода object name = select.ExecuteScalar();. Этот код работает, если в запросе используется 1 параметр:

select.Parameters.Add("@ID", SqlDbType.Int).Value = id;
select.CommandText = "SELECT Inhabitants FROM Planet WHERE ID=@ID";

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

Вы не можете связывать имена объектов таким образом. Для имен объектов вам придется прибегнуть к какой-либо конкатенации строк. Например:

select.Parameters.Add("@taughtOn", SqlDbType.NVarChar).Value = taughtOn;
select.CommandText = "SELECT ID, Name FROM " + attackCategory + " WHERE TaughtOn=@taughtOn";

Примечание: Это слишком упрощенное решение, которое ничего не делает для снижения риска атак SQL -инъекций. Вам нужно продезинфицировать attackCategory, прежде чем использовать его вот так.

2 голосов
/ 01 февраля 2020

Нельзя предоставить имя таблицы с параметром, параметр применяется в предложении where со значением столбцов.

string cmd = @"select ID, Name from " + attackCategory + " where TaughtOn ='" + taughtOn + "'";

, но нам нужно упростить использование параметра в этом запросе.

SqlCommand select = new SqlCommand();
 select.Connection = connection;
 select.Parameters.Add("@taughtOn", SqlDbType.VarChar,50).Value = taughtOn;
 string cmd = @"select ID, Name from " + attackCategory + " where TaughtOn  =@taughtOn"; 
 select.CommandText = cmd;

В приведенном выше запросе t sql применяется конкатенация строк и имя таблицы включается в строку, что будет работать.

Редактировать: -

Я понял, почему вы sqlDataAdapter не распознаете параметр. Причина в том, что вы не предоставили это. Да, верно, вы предоставили CommandText, а не командный объект с переменной select.

Я исправил ваш код.

select.Parameters.Add("@taughtOn", SqlDbType.VarChar, 50).Value = taughtOn; 
string cmd = @"select ID, Name from " + attackCategory + " where TaughtOn =@taughtOn"; 
select.CommandText = cmd; 
select.Connection = new SqlConnection("provide your sql string");
using (SqlDataAdapter sda = new SqlDataAdapter(select)) 
{ 
DataTable dt = new DataTable(); 
sda.Fill(dt); 
return dt; 
}

Надеюсь, это поможет !!

...