我正在尝试基于csv文件在我的数据库中创建一个新表。因为我不知道csv文件中有哪些列,所以我在运行时创建了一个SqlCommand。这是我到目前为止所拥有的。
public static void AddTableFromFile(string file)
{
DefaultContext dbContext = DefaultContext.GetInstance();
DbProviderFactory dbFactory = DbProviderFactories.GetFactory(dbContext.Database.Connection);
SqlCommand createTable = new SqlCommand();
createTable.Connection = (SqlConnection)dbContext.Database.Connection;
//Get all the fields from the file.
TextReader reader = File.OpenText(file);
string head = reader.ReadLine();
reader.Close();
head = head.Replace('\"', ' ');
//Build the column paramaters for the Sql query.
string[] fields = head.Split(',');
if (fields.Length == 0)
throw new Exception("No data to process; " + file);
StringBuilder columnsBuilder = new StringBuilder();
for (int i = 0; i < fields.Count(); i++)
{
columnsBuilder.Append("@column" + i + " char(25), ");
createTable.Parameters.AddWithValue("@column" + i, fields[i]);
}
//Make the first field the primary key.
columnsBuilder.Append("PRIMARY KEY(@column0)");
createTable.Parameters.AddWithValue("@tableName", Path.GetFileNameWithoutExtension(file));
createTable.CommandText = "CREATE TABLE @tableName (" + columnsBuilder.ToString() + ")";
dbContext.Database.Connection.Open();
createTable.ExecuteNonQuery();
dbContext.Database.Connection.Close();
DefaultContext.Release();
Logger.Log("Table " + Path.GetFileNameWithoutExtension(file) + " added to the database.");
}
但是每次运行时我都会收到SqlException,告诉我@tableName周围存在语法错误。我只是将原始值放在字符串中尝试了同样的命令,所以我知道它有效。我错过了一些明显的东西吗?
为了防止它有用,我正在使用MVC 4,我相信数据库是Sql Server Express或与Visual Studio 2012捆绑在一起的数据库。
答案 0 :(得分:6)
我错过了一些明显的东西吗?
不幸的是,我认为你错过了一些不受支持的东西。虽然可以参数化 values ,但据我所知,大多数数据库(包括SQL服务器)都不允许对表名甚至字段名进行参数化。
所以基本上,如果你真的需要能够接受字段等作为用户输入,你需要完成所有 super - 关于接受的字符的工作,逃避价值等 - 然后直接将它放入SQL中。
答案 1 :(得分:2)
您不能将参数用于表名。您可以使用它来比较值,例如
WHERE UserName = @UserName
如果您害怕SQL注入,请使用经典.Replace("'","''")
。