3

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.");
}

ただし、これを実行するたびに、@tableName の周りに構文エラーがあることを知らせる SqlException が表示されます。生の値を文字列に入れるだけでこの同じコマンドを試したので、うまくいくことがわかりました。ここで明らかな何かが欠けていますか?

念のため、私は MVC 4 を使用しており、データベースは Sql Server Express または Visual Studio 2012 にバンドルされているものであると考えています。

4

2 に答える 2

7

ここで明らかな何かが欠けていますか?

残念ながら、サポートされていないものを見逃していると思います。はパラメーター化できますが、ほとんどのデータベース (SQL サーバーを含む) では、私が知る限り、テーブル名やフィールド名でさえパラメーター化できません。

したがって、基本的に、フィールドなどをユーザー入力として受け入れることが本当に必要な場合は、受け入れられる文字に細心の注意を払い、値をエスケープするなどのすべての作業を行ってから、SQL に直接入力する必要があります。 .

于 2013-05-21T21:36:01.627 に答える
2

テーブル名にパラメーターを使用することはできません。値を比較するために使用できます。

WHERE UserName = @UserName

SQL インジェクションが怖い場合は、classic を使用して.Replace("'","''")ください。

于 2013-05-21T21:33:59.087 に答える