2013-05-21 58 views
3

我想在我的數據庫中基於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

回答

6

我在這裏錯過了一些明顯的東西嗎?

不幸的是,我想你錯過了一些不受支持的東西。儘管可以參數化,但據我所知,大多數數據庫(包括SQL服務器)不允許參數化表名或字段名。

因此,基本上,如果你真的需要能夠接受字段等作爲用戶輸入,你需要經歷的所有工作 - 對所接受的字符,轉義值等的重視 - 然後直接將其放入SQL中。

2

你不能使用表名參數捆綁在一起。您可以使用它來比較數值,例如

WHERE UserName = @UserName 

如果你害怕SQL注入使用經典.Replace("'","''")

+1

.Replace(「'」,「''」)如何防止SQL注入? – dkellycollins

+0

那麼,AFAIK它不是100%安全的,但它會導致有人通過撇號時(這是人們通常在嘗試注入代碼時所做的)SQL查詢無效。 – rocky

+0

參見例如http://stackoverflow.com/questions/8506574/sql-injection-isnt-replace-good-enough瞭解更多信息... – rocky