使用SQLHelper在C#中使用变量名创建表

时间:2015-03-02 05:56:20

标签: c# sql-server xaml sqlhelper

我想创建名称为username的表。用户名是用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.SqlClient.SqlException'的例外情况发生在System.Data.dll中但未在用户代码中处理

其他信息:' abc'附近的语法不正确。

abc是我在文本框中作为用户名提供的内容

2 个答案:

答案 0 :(得分: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)
)

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

答案 1 :(得分:0)

将单引号'替换为`

类似

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

查看Schema Object Names

  

标识符可以引用或不引用。如果标识符包含   特殊字符或是保留字,必须随时引用   你指的是它。

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