2017-06-20 72 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))