Выбор из таблицы SQL, но возникло исключение

Я получаю эту ошибку, когда хочу прочитать таблицу:

System.Data.SqlClient.SqlException (0x80131904): неправильный синтаксис рядом с ','. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserState.DBject stateObj, BooleanCleanserCrypt.ColeanserCrypto, BooleanCleanserCryptoc, BooleanClientCrypto, BooleanClientCrypto, BooleanClientCryptoCrypt, BooleanClientClient.club, BooleanCallerTry, BooleanClientCrypt. (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClader.TaLaDataCode (System.Data.SqlClader.SqlientaDataqons) в System.Data.SqlClient. SqlCommand.FinishExecuteReader (SqlDataReader DS, runBehavior runBehavior, String resetOptionsString) на System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, булева returnStream, булева асинхронные, Int32 тайм-аут, задачи и задачи, булева asyncWrite, SqlDataReader DS, булева describeParameterEncryptionReque st) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, завершение TaskCompletionSource`1, тайм-аут Int32, задача и задача, Boolean asyncWriteClient (Boolean asyncWrite) в System.Data CommandBehavior, cmdBehavior, RunBehavior, runBehavior, Boolean returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) в System.Data.SqlClient.SqlCommand.Execormsohwat () при обновлении ) в C: \ Users \ Soroush \ documents \ visual studio 2015 \ Projects \ hamsohbat \ hamsohbat \ Form1.cs: строка 327 в hamsohbat.Form1.GetUpdates (Int64 ii, смещение Int32) в C: \ Users \ Soroush \ documents \ Visual Studio 2015 \ Projects \ hamsohbat \ hamsohbat \ Form1.cs: строка 113 ClientConnectionId: 02ad4c40-e0e7-47ac-91cc-ad88bcdf057d Номер ошибки: 102, состояние: 1, класс: 15

соответствующий раздел моего кода:

        using (SqlConnection con = new SqlConnection(@"Data Source=.\sqlexpress;AttachDbFilename=" + Directory.GetCurrentDirectory() + @"\MembersDB.mdf;Integrated Security=True;User Instance=True"))
        {
            foreach (Int32 x in matches)
            {
                con.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT ([UserName], [FName], [LName], [NickName]) FROM [Table] WHERE [TelegramId]=" + x.ToString(), con))

                    using (SqlDataReader reader = cmd.ExecuteReader())

                        while (reader.Read())

                            bot.SendTextMessage(update.Message.Chat.Id, "Nick: " + reader["NickName"].ToString() + "\nFirst Name: " + reader["FName"].ToString() + "\nLast Name: " + reader["LName"].ToString() + "\nTelegram ID: @" + reader["UserName"].ToString());

            }

        }

Я поместил несколько сообщений sendmessages между строками моего кода, чтобы отследить его, и я думаю, что проблема в этой строке (возможно, я ошибаюсь):

using (SqlCommand cmd = new SqlCommand("SELECT ([UserName], [FName], [LName], [NickName]) FROM [Table] WHERE [TelegramId]=" + x.ToString(), con))

а столбцы моей таблицы: Id, TelegramId, Username, FName, LName, Nickname

спасибо за Ваше внимание


person Persian LionKing    schedule 20.06.2017    source источник


Ответы (5)


Вам не нужно ставить фигурные скобки ( ) в начале и в конце имен столбцов, это, возможно, причина, по которой ваш запрос имеет синтаксическую ошибку, вы должны сначала попробовать запустить запрос на сервере sql, и если он работает нормально, то порт в базе кода измените свой запрос, удалив ненужные фигурные скобки:

SELECT [UserName], [FName], [LName], [NickName] FROM [Table]

и вам не следует выполнять конкатенацию строк в запросах так, как вы это делаете правильно, вам необходимо использовать параметризованные запросы, чтобы защитить себя от атак с использованием SQL-инъекций.

Чтобы узнать, как писать параметризованные запросы, обратитесь к следующему посту:

Параметризация запроса SQL

или эта ссылка также может быть полезна:

http://csharp-station.com/Tutorial/AdoDotNet/Lesson06

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

person Ehsan Sajjad    schedule 20.06.2017

Вам нужно только удалить "(" и ")" в запросе SELECT. Надеюсь, у вас это сработает.

using (SqlCommand cmd = new SqlCommand("SELECT [UserName], [FName], [LName], [NickName] FROM [Table] WHERE [TelegramId]=" + x.ToString(), con))
person Tien Nguyen Ngoc    schedule 20.06.2017

Похоже, вы неправильно используете скобки в операторе select:

SELECT ([UserName], [FName], [LName], [NickName]) FROM [Table] WHERE [TelegramId]=1

Просто должно быть:

SELECT [UserName], [FName], [LName], [NickName] FROM [Table] WHERE [TelegramId]=1

(без скобок перед [UserName] и после [NickName]).

При использовании скобок база данных будет пытаться интерпретировать термин в квадратных скобках как отдельный термин и, следовательно, будет жаловаться на неожиданную запятую.

person matt_t_gregg    schedule 20.06.2017

Да, я удалил скобки, и все заработало. Спасибо друзья

Я изменил эту строку своего кода на:

using (SqlCommand cmd = new SqlCommand("SELECT ([UserName], [FName], [LName], [NickName]) FROM [Table] WHERE [TelegramId]=" + x.ToString(), con))

и это сработало

person Persian LionKing    schedule 20.06.2017
comment
пожалуйста, не публикуйте комментарий как ответ, это запрещено в stackoverflow. - person Ehsan Sajjad; 20.06.2017

изменить эту строку

используя (SqlCommand cmd = new SqlCommand ("SELECT ([UserName], [FName], [LName], [NickName]]» FROM [Table] WHERE [TelegramId] = "+ x.ToString (), con))

в это

используя (SqlCommand cmd = new SqlCommand ("SELECT [UserName], [FName], [LName], [NickName] FROM [Table] WHERE [TelegramId] =" + x.ToString (), con)]

person Abdul Samad    schedule 20.06.2017