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