c# - 如何在 C# 中使用动态名称在 Microsoft Access 中创建表?

标签 c# database ms-access oledb

我可以在代码中创建具有唯一名称的表,但是当我想使用文本框的内容创建具有动态名称的表时,它会在消息框中显示“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!");
        }
    }

有什么问题?

最佳答案

您的表名包含空格。您需要用方括号将其封装起来。就这么写

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

但是,我强烈建议您避免这种情况。

将来,对于您编写的每个查询,您将始终必须这样做。
一个众所周知的简单解决方法是使用下划线代替空格。

而且,查看您的字段名称,我注意到一个名为 SIZE 的字段。
这是 reserved keyword for MS Access .您将在这里面临同样的问题。 每个使用该字段的查询都需要将名称封装在方括号中,
同样,为了您 future 的精神健全,请更改该名称。 :-)

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

关于c# - 如何在 C# 中使用动态名称在 Microsoft Access 中创建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15596887/

相关文章:

c# - Linq-To-Entities 'Contains' 子句 1-many 关系

sql - DB2:将日期值转换为 varchar

ms-access - 如何在 VBA 中创建字典集合?

c# - 在本地文件夹中设置 db mdf 文件的路径

c# - DbSet 查找总是返回 null

VBA 数组长度(不是 ubound 或 onerror!)

mysql - MySQL 中的 Access 查找

c# - 如何使用 Visual Studio + ReSharper 禁用不需要的自动完成功能?

c# - HttpClient GetAsync 大约需要 2 秒

javascript - 在数组中以编程方式在节点内插入节点