2

我想创建名称为用户名的表。用户名写在 xaml 中的 uname.Text 文本框中。我为此使用 SQLHelper。我认为我的语法有问题。任何人都可以在下面给出的代码中更正我的语法。

SqlHelper.ExecuteDataset("Data Source=ADMIN-PC\\MSSQL;Initial Catalog=RecordsDB;Integrated Security=True", CommandType.Text, "CREATE TABLE '" + uname.Text + "'(StudentID int,LastName varchar(255),RollNum varchar(255),Address varchar(255),City varchar(255));   ");

我收到的错误:System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

附加信息:“abc”附近的语法不正确。

abc 是我在文本框中给出的用户名

4

2 回答 2

1

从表名中删除撇号,即:

CREATE TABLE " + uname.Text + " ( ...

相反,您还应该[...]在表名周围使用,因为用户名之类的O'Connor会有问题。

另外,像这样创建动态 Sql 时,一定要验证输入(用户名)以防止注入攻击。(因为表名不能参数化)。

但是,作为您的方法的替代方案(为每个用户创建一个新表),为什么不为所有用户创建一个表,并添加一个额外的代理键UserId呢?通过这种方式,您可以解决很多问题,包括用户更改姓名等问题。

编辑
IMO 更好的替代方法来为每个名为的用户创建一个表UserName

CREATE TABLE UserData
(
    UserDataId INT IDENTITY(1,1) NOT NULL,  -- Surrogate PK
    UserName varchar(255), -- Becomes a column, not a table name
    StudentID int, -- ? Is this a surrogate key for the same user
    LastName nvarchar(255),
    RollNum nvarchar(255),
    Address nvarchar(255),
    City nvarchar(255),

    CONSTRAINT PK_UserData PRIMARY KEY(UserDataId)
)

将新用户插入此表后,您可以通过 检索新的 Surrogate UserDataId 键SCOPE_IDENTITY()

于 2015-03-02T06:00:07.697 回答
0

将单引号'替换为`

所以像

CREATE TABLE `" + uname.Text + "`(StudentID int,LastName varchar(255),RollNum varchar(255),Address varchar(255),City varchar(255));

查看架构对象名称

标识符可以被引用或不被引用。如果标识符包含特殊字符或者是保留字,则在引用它时必须引用它。

因此,在大多数情况下,您可以省略`,但如果名称中包含特殊字符,则它是必需的。

于 2015-03-02T06:02:06.207 回答