c# - 在 C# 中使用带有变量名的 SQLHelper 创建表

标签 c# sql-server xaml sqlhelper

我想创建名为用户名的表。用户名写在 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 是我在文本框中给出的用户名

最佳答案

从表名中删除撇号,即:

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

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

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

但是,作为您的方法(为每个用户创建一个新表)的替代方法,为什么不为所有用户创建一个表,并向其中添加一个额外的代理键,如 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 键。

关于c# - 在 C# 中使用带有变量名的 SQLHelper 创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28803501/

相关文章:

c# - 在 SQL Server 身份验证中执行存储过程所需的角色

sql-server - SQL 查询作业事件监视器的状态

xaml - 如何在 Windows Store Universal App (W8.1 + WP8.1) 中格式化日期?

c# - 应用程序在 15 分钟后崩溃,WCE 6.0 CF 3.5 Motorola MC3190

c# - sqlConnection/Command 使用语句 + try/catch block

c# - 使用 C# 在每一行中动态地将 Button 添加到 ListView

c# - WPF 内存泄漏

c# - 我的 Pandigital To Roman Number 不工作

sql server计算不同年份每月的累计数

xaml - 包含 GridView 和 ListView 的 ListView