从SQL表中选择,但抛出异常

时间:2017-06-20 01:51:12

标签: c# sql-server telegram sqlcommand sqltransaction

当我想阅读表时,我收到此错误:

  

System.Data.SqlClient.SqlException(0x80131904):','附近的语法不正确。      在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)      在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)      在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)      在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()      在System.Data.SqlClient.SqlDataReader.get_MetaData()      在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)      在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 timeout,Task& task,Boolean asyncWrite,SqlDataReader ds,Boolean describeParameterEncryptionRequest)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String方法,TaskCompletionSource`1完成,Int32超时,任务和任务,布尔asyncWrite)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)      在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)      在System.Data.SqlClient.SqlCommand.ExecuteReader()      在hamsohbat.Form1.showFriends(更新更新)中的C:\ Users \ Soroush \ documents \ visual studio 2015 \ Projects \ hamsohbat \ hamsohbat \ Form1.cs:第327行      at hamsohbat.Form1.GetUpdates(Int64 ii,Int32 offset)在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,用户名,FName,LName,昵称

感谢您的关注

5 个答案:

答案 0 :(得分:3)

您不必将大括号( )放在列名的开头和结尾,这可能是您的查询语法错误的原因,您应该首先尝试在sql server中运行查询,如果它运行正常,然后在代码库中移植它,通过删除不必要的大括号来更改您的查询:

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

并且您不应该以正确的方式在查询中进行字符串连接,您需要使用参数化查询来防止SQL注入攻击。

有关如何编写参数化查询的信息,请参阅以下文章:

Parameterize SQL query

或此链接也有帮助:

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

希望它有所帮助。

答案 1 :(得分:1)

您只需要在SELECT查询中删除“(”和“)”。我希望它对你有用。

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

答案 2 :(得分:1)

看起来你在select语句中使用括号是错误的:

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

应该是:

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

(在 [UserName] 之前和 [NickName] 之后没有括号)。

使用括号,数据库将尝试将括号中的术语解释为单个术语,因此会抱怨意外的逗号。

答案 3 :(得分:0)

YESSS 我删除了大括号,它有效。谢谢朋友们

我将我的代码行更改为:

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

并且有效

答案 4 :(得分:0)

更改此行

  

使用(SqlCommand cmd = new SqlCommand(" SELECT([UserName],[FName],   [LName],[NickName])FROM [表] WHERE [TelegramId] =" + x.ToString(),   CON))

进入这个

  

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