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

时间:2018-07-03 05:57:30

标签: c# asp.net sql-server

我尝试调试代码和注释,但是似乎找不到问题。 I am getting the this error:

  

“ 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;
}

2 个答案:

答案 0 :(得分:2)

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

 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],这也可能引起问题(请查看此答案以获取更多详细信息:SELECT query on a table with a space in the name using SQSH

答案 1 :(得分:0)

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

使用参数之前,需要检查它。但是我宁愿返回一个默认值(因为它是 literally ,是特殊情况),而不是返回默认值(例如,空列表),例如:

null

还有一件事。您还需要处理SQL命令的转义。例如,您不仅可以使用MS SQL Server 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; } ,还需要SELECT * FROM User;,有时甚至需要SELECT * FROM [User];。对于DBMS,这可能有所不同。

根据建议,我建议您学习有关 ORM 的知识,例如SELECT * FROM [dbo].[User];EntityFramework,因为这样您就可以摆脱此 DBMS >相对的东西,例如语法或转义序列。