3

コードで一意の名前のテーブルを作成できますが、動的な名前のテーブルを作成する場合、テキストボックスの内容を使用して、メッセージボックスに「CREATETABLEステートメントの構文エラー」と表示されます。私のコード:

private void createTableInDatabase(string fName, string lName)
    {
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Project\Learning\Visual C#\Form\Tailor Assistance\Tailor Assistance\bin\Release\Tailor Assistance.mdb";
        conn.Open();
        string tableName = fName + " " + lName;
        OleDbCommand cmmd = new OleDbCommand("", conn);
        cmmd.CommandText = "CREATE TABLE " + tableName + "( [ID] Counter Primary Key, [FirstName] Text, [LastName] Text, [Gender] Text, [Phone] Text, [CellPhone] Text, [FriendsFirstName] Text, [FriendsLastName] Text, [RegisterDate] Text, [Size] Text, [Description] Text)";
        if (conn.State == ConnectionState.Open)
        {
            try
            {
                cmmd.ExecuteNonQuery();
                MessageBox.Show("Add!");
                conn.Close();
            }
            catch (OleDbException expe)
            {
                MessageBox.Show(expe.Message);
                conn.Close();
            }
        }
        else
        {
            MessageBox.Show("Error!");
        }
    }

どうしたの?

4

1 に答える 1

7

テーブル名にスペースが含まれています。角かっこでカプセル化する必要があります。これを書いてください

string tableName = "[" + fName + " " + lName + "]";

ただし、これは避けることを強くお勧めします。

将来的には、作成するすべてのクエリに対して、常にそれを行う必要があります。
よく知られている簡単な回避策は、スペースの代わりにアンダースコアを使用することです。

そして、あなたのフィールド名を見ると、SIZEというフィールドに気づきました。
これはMSAccess用に予約されたキーワードです。ここでも同じ問題に直面します。そのフィールドを使用するすべてのクエリは、名前を角かっこで囲む必要があります。
繰り返しになりますが、将来の精神的な正気のために、その名前を変更してください。:-)

注-7年
後この答えを振り返ると、正しいとはいえ、重要な点が欠けています。
上記のコードから、テーブルの名前を定義するために使用される入力値が安全かどうかを知ることはできません。ユーザーにこれらの名前を入力させると、現在の文字列と組み合わされた非常に厄介な文字列を入力して、データベースに大混乱をもたらす可能性があります。このハックはSQLインジェクションの名前でよく知られており、解決策は常に同じです。パラメータを使用してデータベースに値を渡す必要があります。パラメータを使用してテーブルまたは列の名前を表すことができないためにこれが不可能な場合は、ユーザーに文字列を入力させずに一連の名前から選択するように強制する必要があります。 。

于 2013-03-24T09:33:46.967 に答える