2011-03-26 89 views
1

我正在使用ASP.Net/C#和我有一個表格,允許人們添加信息到表中,並與它一起我想收集當前用戶的GUID並插入它。插入GUID到SQL表

我有一個字段的設置(用戶名)作爲唯一的標識符,我有以下代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MembershipUser currentUser = Membership.GetUser(); 
    Guid temp = (Guid)(Membership.GetUser(User.Identity.Name).ProviderUserKey); 
    Guid @currentUserID = temp; 
} 

SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\ASPNETDB.MDF;Integrated Security=True;User Instance=True"); 
SqlCommand cmd; 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values('" + @currentUserID + "')", con); 
    cmd.ExecuteNonQuery(); 

} 

我基本上要爲上面給出錯誤的變量任何想法鏈接到數據庫如何。

回答

1
Guid @currentUserID = temp; 

您在本地範圍內定義一個變量currentUserID - 你必須保存這個變量在Session這樣你就可以在Button1_Click方法訪問:

Session["UserId"] = currentUserID; 

現在你可以在Button1_Click檢索:

Guid currentUserID = (Guid)Session["UserId"]; 

此外,@不是必須的,也不應該在那裏,你只需要它,如果你想定義vari與名稱匹配的C#關鍵字 - 這是不好的風格。你也想把SqlConnection特定的代碼全部放在按鈕點擊處理程序中 - 否則這個變量會被實例化加載頁面加載,而不僅僅是當使用按鈕點擊處理程序時。最後你還想在你的SQL插入語句中使用SqlParameters而不是字符串。

編輯:

由於@pst指出,更多的「ASP.NET的方式」將只使用可變

你聲明爲類的一部分
Guid currentUserID; 

的情況下,不在方法中 - 那麼你可以在整個頁面中使用這個變量。然而,這意味着,用戶標識在其他頁面上不可用(具有會話可以在任何頁面上通過會話的有效期檢索)。

+0

感謝隊友工作出色:)感謝所有的人太:) – Mark 2011-03-26 21:09:23

+0

有沒有辦法使用會話特定的原因就在這裏,而不是隻是一個成員變量(設置在頁面加載)? – 2011-03-26 21:11:03

+0

@pst:是的,我想這對ASP.NET來說更習慣 - 我已經「脫身」了太久 - 我將編輯它。 – BrokenGlass 2011-03-26 21:23:40

0

我不知道SQL服務器是否支持GUID作爲數據類型,在Mysql中,我會用char,但這並不重要,只是一個註釋。最重要的部分是,在方法:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values('" + @currentUserID + "')", con); 
    cmd.ExecuteNonQuery(); 

} 

你不指定@currentUserID 您必須將其改寫成類似的實際值:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    SqlParameter param = new SqlParameter(); 
    con.Open(); 
    cmd = new SqlCommand("insert into Accom (UserID) values(@currentUserID)", con); 
    //this are the important lines that I'm talking about 
    param.ParameterName = "@currentUserID"; 
    param.Value   = valueOfUserId; 
    cmd.Parameters.Add(param); 
    cmd.ExecuteNonQuery();  
} 

希望有所幫助。

+2

「我不知道SQL服務器是否支持GUID作爲數據類型」 - 它它叫做uniqueidentifier – kevinw 2011-03-26 20:44:17

+0

我在-1上,因爲我認爲它試圖使用佔位符。然而,就像現在這樣,它已經破裂了。修復SqlCommand文本。 – 2011-03-26 21:08:58

4

不應該將值直接插入到這樣的SQL語句中,不管它們是什麼類型,因爲這會打開你的SQL Injection攻擊。相反,您應該在查詢中使用參數,通過這些參數System.Guid值將自動轉換爲SQL Server uniqueidentifier類型。這是我會怎麼做:

Guid currentUserId = (Guid)(Membership.GetUser(User.Identity.Name).ProviderUserKey); 
using (var connection = new SqlConnection("...")) 
using (var command = connection.CreateCommand()) 
{ 
    command.CommandText = "INSERT INTO Accom (UserID) VALUES (@UserID)"; 
    var param = command.Parameters.Add("@UserID", SqlDbType.UniqueIdentifier); 
    param.Value = currentuserId; 
    connection.Open(); 
    command.ExecuteNonQuery(); 
} 
+0

+1佔位符。 – 2011-03-26 21:09:57

0

在原代碼上面的currentUser變量未使用。另外,如果用戶未登錄,則對Membership.GetUser(User.Identity.Name)的調用將返回空引用,並嘗試檢索ProviderUserKey代碼將引發NullReferenceException。沿着這些路線有更好的做法會更好;

public partial class Default : System.Web.UI.Page 
{ 
    MembershipUser currentUser; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     currentUser = Membership.GetUser(); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (null != currentUser) 
     { 
      Guid currentUserID = currentUser.ProviderUserKey; 
      // database code here 
     } 
    } 
}