将GUID插入SQL表

时间:2011-03-26 20:30:19

标签: c# asp.net

我正在使用ASP.Net/C#,我有一个允许人们将信息添加到表中的表单,我希望收集当前用户GUID并插入它。

我有一个字段设置(UserID)作为唯一标识符,我有以下代码:

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();

}

我基本上想要将变量链接到数据库任何想法,如上所述给出错误。

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

Guid @currentUserID = temp;

您在本地范围内定义变量currentUserID - 您必须将此变量保存在Session中,以便您可以使用Button1_Click方法访问它:

Session["UserId"] = currentUserID;

现在您可以在Button1_Click中找回它:

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

同样不需要@,也不应该存在@,如果你想定义一个名字与C#关键字匹配的变量,你只需要它 - 无论如何这都是坏的风格。此外,您还希望将SqlConnection特定代码全部放在按钮单击处理程序中 - 否则此变量将在页面加载时实例化,而不仅仅是在使用按钮单击处理程序时。最后,您还希望在SQL插入语句中使用SqlParameters而不是字符串。

修改

正如@pst指出的那样,“ASP.NET方式”就是使用实例变量

Guid currentUserID;

您声明为类的一部分,而不是在方法中 - 然后您可以在整个页面中使用此变量。但是,这意味着用户ID将无法在其他页面上使用(可以在任何页面上通过会话的生命周期检索会话)。

答案 2 :(得分: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();    
}

希望有所帮助。

答案 3 :(得分: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
        }
    }
}