C# SQL从不同语句插入变量
我试图做两个select语句,将它们的结果放入它们的变量中,然后将它们的变量和另一个变量插入另一个insert语句中C# SQL从不同语句插入变量,c#,asp.net,sql,C#,Asp.net,Sql,我试图做两个select语句,将它们的结果放入它们的变量中,然后将它们的变量和另一个变量插入另一个insert语句中 我不确定我是否做对了,如果您对我编写的内容提出一些建议和批评,我将非常感谢您的帮助您的方法看起来不错,但建议您使用存储过程而不是传递查询您的方法看起来不错,但建议您使用存储过程而不是传递查询这确实容易受到攻击SQL注入,特别是这一部分: StringBuilder sb = new StringBuilder(); sb.Append("DECLARE @Co
我不确定我是否做对了,如果您对我编写的内容提出一些建议和批评,我将非常感谢您的帮助您的方法看起来不错,但建议您使用存储过程而不是传递查询您的方法看起来不错,但建议您使用存储过程而不是传递查询这确实容易受到攻击SQL注入,特别是这一部分:
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();
}
这是非常非常危险的。我无法想象你没有听说过这件事,但为了以防万一,请查看这篇维基文章:
如果确实希望/需要执行原始SQL,请始终转义这些值
您是否考虑过使用强类型DAL,如LINQ2SQL、DataEntities等?这很容易受到SQL注入的影响,尤其是这一部分:
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();
}
这是非常非常危险的。我无法想象你没有听说过这件事,但为了以防万一,请查看这篇维基文章:
如果确实希望/需要执行原始SQL,请始终转义这些值
您是否考虑过使用强类型DAL,如LINQ2SQL、DataEntities等?我建议将该代码放在存储过程中。将该代码放在字符串生成器中并执行它不是一个好主意。我建议将该代码放在存储过程中。把它放在字符串生成器中并执行它不是一个好主意
从ControlPanelID中选择ControlPanelID,其中Name=@Name
和从UsersID中选择Name,其中UsersID=@UserID
看起来很奇怪。您真的有名称为ControlPanelID
和UsersID
的表吗从ControlPanelID中选择ControlPanelID,其中Name=@Name
和从UsersID中选择Name,其中UsersID=@UserID
看起来很奇怪。您真的有名称为ControlPanelID
和UsersID
的表吗六羟甲基三聚氰胺六甲醚。。为什么我不能使用内联代码?///如果我将Textbox1变量传递给存储过程或内联sql代码,会有什么区别?1.正如Nico在下面所说,使用内联代码会增加sql注入威胁。2.使用存储过程是最佳实践3.存储过程防止sql注入,因为您可以从数据库OMG中为存储过程分配角色..但我所有的sql内联代码都是内联的,不在存储过程中..:(存储过程预编译为内联代码,先编译后执行,因此出错的可能性增加。如果您不能将内联代码转换为存储过程,请不要担心。请尽可能地进行验证。为什么我不能使用内联代码?///如果我将Textbox1变量传递给存储过程或内联sq,会有什么区别l代码?1.正如Nico在下面所说,使用内联代码会增加sql注入的威胁。2.使用存储过程是最佳做法3.存储过程防止sql注入,因为您可以从数据库OMG中为存储过程分配角色。但是我所有的sql内联代码都是内联的,不在存储过程中..:(存储过程预编译为内联代码,先编译后执行,因此出错的几率会增加。如果您不能将内联代码转换为存储过程,请不要担心。请尽可能地进行验证。它们太慢;;;linq2sql和数据实体为什么这么危险?它使用的是SQL参数,而不是代码中断?您完全正确,参数不易受SQL注入的攻击。My bad。它们太慢;;;linq2sql和数据实体为什么这么危险?它使用的是SQL参数,而不是代码中断?您完全正确,参数不易受SQL注入的攻击。My bad.BTW,您知道“逐字字符串文字”吗?您不需要所有这些附加。请参阅。@VladV:但是使用简单字符串将此语句连接在一起将非常糟糕-每次向字符串变量添加内容时,都会创建一个新字符串。在这种情况下,建议使用StringBuilderit@marc_s:我的意思是字符串查询=@“DECLARE@ControlPaneliD int SET@ControlPaneliD=(选择ControlPanelID…顺便说一句,您知道“逐字字符串文字”吗?您不需要所有这些附加。请参阅。@VladV:但是使用简单字符串将此语句连接在一起会很糟糕-每次向字符串变量添加内容时,都会创建一个新字符串。在这种情况下,建议使用StringBuilderit@marc_s:我的意思是字符串查询=@“DECLARE@ControlPaneliD int SET@ControlPaneliD”=(选择ControlPanelID…它可以工作我试过了..我有一类静态函数,它们接受参数并将它们放入数据库..它们没有混乱..我更喜欢通过内联代码来完成..但是如果考虑到安全性..那么我不知道..我想它会使内联代码完全冗余!!!它可以工作我试过了..我有一类静态函数ns,他们获取参数并将其放入数据库..他们没有混乱..我更喜欢通过内联代码来实现..但是如果考虑到安全性..那么我不知道..我想这会使内联代码完全冗余!!!