2015-03-02 55 views
2

我想创建名称为username的表格。用户名用xaml中的uname.Text文本框编写。我为此使用SQLHelper。我认为我的语法有问题。任何人都可以在下面给出的代码中纠正我的语法。使用带有C#中变量名称的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是我所给出的用户名在文本框中

回答

1

从表名称中删除撇号的,即:

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

相反,你也应该使用[...]围着桌子名称,用户名像O'Connor会有问题。

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

但是,作为替代方法(为每个用户创建一个新表),为什么不为所有用户创建一张表,并为其添加一个替代关键字UserId?这样你就可以从很多问题中解决问题,包括用户更改名称等问题。

编辑
创建名为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) 
) 

插入一个新的用户进入此表后,在每个用户的表IMO更好的选择,你可以通过SCOPE_IDENTITY()检索新的代理UserDataId关键。

+0

什么是surragate键? – 2015-03-02 06:12:18

+0

请参阅http://en.wikipedia.org/wiki/Surrogate_key。请删除您的MySql标签,因为您正在向错误的轨道发送答复者。 – StuartLC 2015-03-02 06:20:51

+0

感谢解决问题 – 2015-03-02 06:26:54

0

`

因此,像

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

看一看Schema Object Names

的标识符可以或不使用引号替换单引号。如果标识符包含 特殊字符或是保留字,则只要您引用 ,就必须引用该标识符。

所以在大多数情况下,你可以离开了`但如果名字有特殊字符,它是必需的。

+0

先生它给了我这个错误:在System.Data中发生类型'System.Data.SqlClient.SqlException'的异常。dll,但未在用户代码中处理 附加信息:“'”附近的语法错误。 – 2015-03-02 06:10:59

相关问题