System.Data.SqlClient.SqlException:关键字“FROM”附近的语法不正确

Posted

技术标签:

【中文标题】System.Data.SqlClient.SqlException:关键字“FROM”附近的语法不正确【英文标题】:System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'FROM' 【发布时间】:2015-10-10 00:05:53 【问题描述】:

我正在尝试在 ASP.net 中创建一个网站,它可以向我展示我们组织发布的出版物。这是cs文件中的一些代码。

//2nd - Setup SQL Command
    SqlCommand cmd = new SqlCommand("SELECT [IDTip], [Date], CONVERT(nvarchar(100),[Date], 1) AS Released, [Title], [Image], REPLACE(CONVERT (nvarchar(MAX),[Tip]), '</p>\r\n\r\n<p>', '<p></p>') AS ContentConverted, Recognition, FROM tips WHERE IDTip =" + Request.QueryString["IDTip"], new SqlConnection(HealthReachConString));

//3rd - Attempt to open the connection to the DB
    cmd.Connection.Open();

//4th - Go and fetch some data and apply it to our controls
    SqlDataReader objReader = cmd.ExecuteReader();
    while (objReader.Read())
    
        lblDate.Text = objReader.GetString(2);
        lblTitle.Text = objReader.GetString(4);
        lblTip.Text = Convert.ToString(objReader["ContentConverted"]);
        imgContentPicture.ImageUrl = "~/files/Health_Tips/" + objReader.GetString(5);
        if (objReader.GetString(5) == " " || objReader.GetString(5) == "")
        
            imgContentPicture.Visible = false;
        
        else
        
            imgContentPicture.Visible = true;
        

    
    objReader.Close();
    cmd.Connection.Close();

这是我得到的错误。

“/”应用程序中的服务器错误。 关键字“FROM”附近的语法不正确。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:。

来源错误:

第 23 行: 第 24 行://4th - 获取一些数据并将其应用于我们的控件 第 25 行:SqlDataReader objReader = cmd.ExecuteReader(); 第 26 行:while (objReader.Read()) 第 27 行:

堆栈跟踪:

[SqlException (0x80131904): 关键字“FROM”附近的语法不正确。] System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action`1 wrapCloseInAction) +1791910 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection,Action`1 wrapCloseInAction) +5347106 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObjec>t stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +546 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1693 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61 System.Data.SqlClient.SqlDataReader.get_MetaData() +90 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串 resetOptionsString) +377 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 超时,Task& 任务,Boolean asyncWrite,SqlDataReader ds)+1421 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法, TaskCompletionSource`1 完成, Int32 超时, Task& 任务, Boolean asyncWrite) +177 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)+137 System.Data.SqlClient.SqlCommand.ExecuteReader() +99 PressRoom_Detail.Page_Load(Object sender, EventArgs e) in E:\web\healthreach\htdocs\Tips_Detail.aspx.cs:25 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51 System.Web.UI.Control.OnLoad(EventArgs e) +92 System.Web.UI.Control.LoadRecursive() +54 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

知道发生了什么吗?

【问题讨论】:

SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 【参考方案1】:

为了澄清您的问题,额外的逗号向 SQL 指示存在另一个参数,但您的参数是您的 FROM。删除 FROM 之前的逗号后,您的语法应该是有效的。假设您已经为 CONVERTAlias 函数指定了正确的语法。

我还想指出您的查询容易受到 SQL 注入的影响。要解决该部分,您应该这样做:

SELECT [IDTip], [Date], 
CONVERT(nvarchar(100),[Date], 1) AS Released, [Title], [Image], 
REPLACE(CONVERT (nvarchar(MAX),[Tip]), '</p>\r\n\r\n<p>', '<p></p>') AS [ContentConverted], [Recognition]
FROM [Tips]
WHERE ([IDTip] = @Id);

这就是我在评论中看到的查询中的错误。

【讨论】:

【参考方案2】:

额外的垃圾:

SELECT ... Recognition, FROM ...
                      ^---

【讨论】:

以上是关于System.Data.SqlClient.SqlException:关键字“FROM”附近的语法不正确的主要内容,如果未能解决你的问题,请参考以下文章