我想在我的數據庫中基於csv文件創建一個新表。由於我不知道csv文件中有哪些列,我在運行時創建了一個SqlCommand。這是我到目前爲止。Sql參數沒有被替換
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
.Replace(「'」,「''」)如何防止SQL注入? – dkellycollins
那麼,AFAIK它不是100%安全的,但它會導致有人通過撇號時(這是人們通常在嘗試注入代碼時所做的)SQL查詢無效。 – rocky
參見例如http://stackoverflow.com/questions/8506574/sql-injection-isnt-replace-good-enough瞭解更多信息... – rocky