[英]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的知识 ,例如EntityFramework
或NHibernate
,因为这样您就可以摆脱与DBMS相关的语法或转义序列之类的东西了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.