【问题标题】:Create a Table using SQLHelper with a variable name in C#在 C# 中使用带有变量名的 SQLHelper 创建表
【发布时间】:2015-03-02 05:56:20
【问题描述】:

我想创建名称为用户名的表。用户名写在 uname.Text 文本框中的 xaml 中。我正在为此使用 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 是我在文本框中给出的用户名

【问题讨论】:

    标签: c# sql-server xaml sqlhelper


    【解决方案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 键。

    【讨论】:

    • 什么是代理键?
    • 见这里en.wikipedia.org/wiki/Surrogate_key。请删除您的 MySql 标签,因为您将回答者发送到错误的轨道上。
    • 感谢问题已解决
    【解决方案2】:

    将单引号 ' 替换为 `

    类似

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

    看看Schema Object Names

    标识符可以被引用或不被引用。如果标识符包含 特殊字符或保留字,您必须在任何时候引用它 你参考一下。

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

    【讨论】:

    • 先生,它给了我这个错误:System.Data.dll 中发生了“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理其他信息:'` 附近的语法不正确'。
    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多