2015-03-02 84 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

相關問題