我正在使用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();
}
我基本上想要将变量链接到数据库任何想法,如上所述给出错误。
答案 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
}
}
}