3

我可以在代码中创建具有唯一名称的表,但是当我想使用文本框的内容创建具有动态名称的表时,它会在消息框中显示“CREATE TABLE 语句中的语法错误”。我的代码:

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 的字段。
这是MS Access 的保留关键字。您将在这里面临同样的问题。使用该字段的每个查询都需要将名称封装在方括号中,
同样,为了您未来的心理健康,请更改该名称。:-)

注意 - 7 年
后回顾这个答案,虽然是正确的,但它缺乏重要的一点。
从上面的代码无法知道用于定义表名的输入值是否安全。如果您让您的用户键入这些名称,那么可能会输入非常讨厌的字符串,这些字符串与您当前的字符串相结合可能会对您的数据库造成严重破坏。这种 hack 以Sql Injection的名义而广为人知,解决方案总是相同的。您应该使用参数将值传递给您的数据库,如果因为参数不能用于表示表或列名而无法做到这一点,那么您应该强制用户从一组名称中进行选择,而不让他们输入任何字符串.

于 2013-03-24T09:33:46.967 回答