在 C# 中使用带有变量名的 SQLHelper 创建 Table
Create a Table using SQLHelper with a variable name in C#
我想创建名称为 username.The 的 table 用户名写在 xaml 的 uname.Text 文本框中。我正在为 this.I 使用 SQLHelper,我认为 syntax.Can 有问题,任何人都可以在下面给出的代码中更正我的语法。
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 是我在文本框中输入的用户名
从 table 名称中删除撇号,即:
CREATE TABLE " + uname.Text + " ( ...
相反,您还应该在 table 名称周围使用 [...]
,因为像 O'Connor
这样的用户名会有问题。
此外,在创建动态 Sql 时,请务必验证输入(用户名)以防止注入攻击。 (因为 Table 名称无法参数化)。
但是,作为您方法的替代方法(为每个用户创建一个新的 table),为什么不为所有用户创建一个 table,并添加一个额外的代理键,例如 UserId
到了吗?通过这种方式,您可以避免很多问题,包括用户更改名称等问题。
编辑
IMO 更好的替代方法是为每个名为 UserName
的用户创建 table
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)
)
将新用户插入此 table 后,您可以通过 SCOPE_IDENTITY()
检索新的 Surrogate UserDataId 键。
将单引号 ' 替换为 `
所以像
CREATE TABLE `" + uname.Text + "`(StudentID int,LastName varchar(255),RollNum varchar(255),Address varchar(255),City varchar(255));
An identifier may be quoted or unquoted. If an identifier contains
special characters or is a reserved word, you must quote it whenever
you refer to it.
因此,在大多数情况下,您可以省略 `,但如果名称中包含特殊字符,则需要这样做。
我想创建名称为 username.The 的 table 用户名写在 xaml 的 uname.Text 文本框中。我正在为 this.I 使用 SQLHelper,我认为 syntax.Can 有问题,任何人都可以在下面给出的代码中更正我的语法。
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 是我在文本框中输入的用户名
从 table 名称中删除撇号,即:
CREATE TABLE " + uname.Text + " ( ...
相反,您还应该在 table 名称周围使用 [...]
,因为像 O'Connor
这样的用户名会有问题。
此外,在创建动态 Sql 时,请务必验证输入(用户名)以防止注入攻击。 (因为 Table 名称无法参数化)。
但是,作为您方法的替代方法(为每个用户创建一个新的 table),为什么不为所有用户创建一个 table,并添加一个额外的代理键,例如 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)
)
将新用户插入此 table 后,您可以通过 SCOPE_IDENTITY()
检索新的 Surrogate UserDataId 键。
将单引号 ' 替换为 `
所以像
CREATE TABLE `" + uname.Text + "`(StudentID int,LastName varchar(255),RollNum varchar(255),Address varchar(255),City varchar(255));
An identifier may be quoted or unquoted. If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it.
因此,在大多数情况下,您可以省略 `,但如果名称中包含特殊字符,则需要这样做。