繁体   English   中英

“ FROM”关键字附近的语法不正确。 C#

[英]Incorrect syntax near 'FROM' Keyword. C#

我尝试调试代码和注释,但是似乎找不到问题。 我收到此错误:

“ FROM”附近的语法不正确。

说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:'FROM'附近的语法不正确。

我的代码:

public List<string> GetTableColumns(string tableName)
{
    List<string> colCollection = new List<string>();

    IDataReader reader = null;

    using (var cmd = MyDB.GetSqlStringCommand("SELECT * FROM " + tableName))
    {
        using (reader = MyDB.ExecuteReader(cmd))
        {
            foreach (DataRow r in reader.GetSchemaTable().Rows)
            {
                colCollection.Add(r["ColumnName"].ToString());
            }

            reader.Close();
        }
    }

    return colCollection;
}

建议您像下面使用字符串格式一样正确格式化字符串,并检查表名是否存在

 public List<string> GetTableColumns(string tableName)
 {
   if(!String.IsNullOrWhiteSpace(tableName))
   {
    string query = string.Format( "SELECT * FROM  [{0}]",tableName);
    // or use string interpolation
    string query = $"SELECT * FROM [{tableName}]";
    //rest of the code execute reader  
    //return collection of string   
   }
   return new List<string>();
  }

在表名周围添加[] ,因为sql中的表名可能包含空格示例。 SELECT * FROM [My Table]也会引起问题(请查看此答案以获取更多详细信息: 使用SQSH在名称中带有空格的表上进行SELECT查询

正如@PranayRana在对他的答案的评论中提到的那样,此问题主要是由于传递给GetTableColumns() tableName参数为null或空字符串。 我有98%的把握。

您需要在使用前检查参数值。 但是,我宁愿抛出一个异常(因为从字面上看是特殊情况),而不是返回默认值(例如,空列表),如下所示:

public List<string> GetTableColumns(string tableName)
{
    if (tableName == null)
        throw new ArgumentNullException(nameof(tableName));
    if (string.IsNullOrWhitespace(tableName))
        throw new ArgumentException("Table name can't be empty!", nameof(tableName));

    List<string> colCollection = new List<string>();

    using (var cmd = MyDB.GetSqlStringCommand($"SELECT * FROM {tableName}"))
    using (var reader = MyDB.ExecuteReader(cmd))
        foreach (DataRow r in reader.GetSchemaTable().Rows)
            colCollection.Add(r["ColumnName"].ToString());

    return colCollection;
}

还有一件事。 您还需要处理SQL命令的转义。 例如,您不能只是SELECT * FROM User; 对于MS SQL Server,您需要SELECT * FROM [User]; ,甚至SELECT * FROM [dbo].[User]; 有时。 对于DBMS,这可能有所不同。

作为建议,我建议您学习一些有关ORM的知识 ,例如EntityFrameworkNHibernate ,因为这样您就可以摆脱与DBMS相关的语法或转义序列之类的东西了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM