2017-06-20 44 views
0

我得到这个错误时,我想读表异常:从SQL表中选择,但有抛出

System.Data.SqlClient.SqlException(0x80131904):附近有语法错误“”。 在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,动作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose) 在System.Data。 SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand的cmdHandler,SqlDataReader的数据流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔& dataReady) 在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在System.Data.SqlClient.SqlDataReader.get_MetaData( ) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)在System.Data.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,布尔异步,Int32超时,任务&任务,布尔asyncWrite,SqlDataReader DS,布尔describeParameterEncryptionRequest) 在System.Data.SqlClient.SqlCommand。 RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,TaskCompletionSource`1 completion,Int32 timeout,Task & task,Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method) at System.Data.SqlClient.SqlCommand.ExecuteReader() at hamsohbat.Form1.showFriends(Update update)in C:\ Users \ Soroush \ documents \ visual studio 2015 \ Projects \ hamsohbat \ hamsohbat \ Form1.cs:line 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)) 

和我的表列编号,TelegramId,用户名,FName参数,LName的,昵称

感谢您对SELECT查询您的关注

回答

3

你不必把括号()在列名的开始和结束,也可能是您的查询语法具有的errror原因,你应该先尝试运行在SQL Server查询和如果运行正常,然后将它移植代码库,通过删除不必要的括号更改查询:

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

,你不应该这样做字符串连接在查询你正在做正确的方式,你需要使用参数化查询来防止SQL注入攻击。

对于看到如何编写参数化查询,请参考以下职位:

Parameterize SQL query

或这个环节也能有所帮助:

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

希望它能帮助。

1

你只需要删除“(”和“)”。我希望它能为你工作。

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

它看起来像你使用你的SELECT语句括号有过错:

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

应该仅仅是:

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

(不含括号前[用户名]和后[NickName])。

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

0

Yesss 我删除了大括号,它的工作。谢谢各位朋友

我改变该行的我的代码:

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

,它使用的工作

+0

请不要发表评论为答复,禁止在stackoverflow上。 –

0

改变这一行

(的SqlCommand CMD =新的SqlCommand(“SELECT( [UserName],[FName], [LName],[NickName])FROM [Table] WHERE [TelegramId] =“+ x.ToString(), con))

到此

使用(的SqlCommand CMD =新的SqlCommand( “选择[用户名],[FName参数], [LName的],[昵称] FROM [表] WHERE [TelegramId] =” + X .ToString(), con))