StringBuilder sb = new StringBuilder();
sb.Append("DECLARE @ControlPaneliD int");
sb.Append(" SET @ControlPaneliD=(SELECT ControlPanelID");
sb.Append(" FROM ControlPanelID");
sb.Append(" WHERE Name=@Name)");
sb.Append("DECLARE @UserName UniqueIdentifier");
sb.Append(" SET @UserName=(SELECT Name");
sb.Append(" FROM UsersID");
sb.Append(" WHERE UsersID=@UserID)");
sb.Append("INSERT INTO dbo.CP_Comments (ControlPanelID,Comments,Commentator)");
sb.Append(" VALUES(@ControlPaneliD,@Comment,@UserName)");
MembershipUser CurrentUser = Membership.GetUser();
Guid id = (Guid)CurrentUser.ProviderUserKey;
string myConnectionString = AllQuestionsPresented.connectionString;
using (SqlConnection conn = new SqlConnection(AllQuestionsPresented.connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
cmd.Parameters.Add("UserID", SqlDbType.UniqueIdentifier).Value = id;
cmd.Parameters.Add("Comment", SqlDbType.NVarChar).Value = TextBox1.Text;
cmd.Parameters.Add("Name", SqlDbType.NVarChar).Value = name; //string variable from my code
cmd.ExecuteNonQuery();
}
我正在尝试做两个select语句,将结果放入变量中,并将其变量加上另一个变量插入另一个插入语句中。
我不确定我是否做得对,如果你给我一些建议和批评我的作品,我将不胜感激。
答案 0 :(得分:2)
SELECT ControlPanelID FROM ControlPanelID WHERE Name=@Name
和SELECT Name FROM UsersID WHERE UsersID=@UserID
看起来很奇怪。你真的有名字ControlPanelID
和UsersID
?答案 1 :(得分:1)
您的方法看起来不错,但建议您使用存储过程而不是传递查询
答案 2 :(得分:1)
这非常容易受到SQL注入攻击,尤其是这部分:
cmd.Parameters.Add("Comment", SqlDbType.NVarChar).Value = TextBox1.Text;
这非常非常危险。我无法想象你没有听说过这个,但为了以防万一,看看这篇wiki文章:http://en.wikipedia.org/wiki/SQL_injection
如果您确实需要/需要执行原始SQL,请始终转义值。
您是否考虑使用LINQ2SQL,DataEntities等强类型DAL?
答案 3 :(得分:0)
我宁愿建议将该代码放在存储过程中。将它放在字符串构建器中并执行它并不是一个好主意。