C# SQL从不同语句插入变量

C# SQL从不同语句插入变量,c#,asp.net,sql,C#,Asp.net,Sql,我试图做两个select语句,将它们的结果放入它们的变量中,然后将它们的变量和另一个变量插入另一个insert语句中 我不确定我是否做对了,如果您对我编写的内容提出一些建议和批评,我将非常感谢您的帮助您的方法看起来不错,但建议您使用存储过程而不是传递查询您的方法看起来不错,但建议您使用存储过程而不是传递查询这确实容易受到攻击SQL注入,特别是这一部分: StringBuilder sb = new StringBuilder(); sb.Append("DECLARE @Co

我试图做两个select语句,将它们的结果放入它们的变量中,然后将它们的变量和另一个变量插入另一个insert语句中


我不确定我是否做对了,如果您对我编写的内容提出一些建议和批评,我将非常感谢您的帮助

您的方法看起来不错,但建议您使用存储过程而不是传递查询

您的方法看起来不错,但建议您使用存储过程而不是传递查询

这确实容易受到攻击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等?

我建议将该代码放在存储过程中。将该代码放在字符串生成器中并执行它不是一个好主意。

我建议将该代码放在存储过程中。把它放在字符串生成器中并执行它不是一个好主意

  • 在insert语句中,您可以将3个参数插入到2列中
  • 我认为您应该编写存储过程并为其传递参数。您总是使用字符串生成器“生成”sql代码。而且,更改存储过程中的某些功能要比在代码中查找语句、更改语句并重新生成应用程序容易得多
  • 从ControlPanelID中选择ControlPanelID,其中Name=@Name
    从UsersID中选择Name,其中UsersID=@UserID
    看起来很奇怪。您真的有名称为
    ControlPanelID
    UsersID
    的表吗
  • 在insert语句中,您可以将3个参数插入到2列中
  • 我认为您应该编写存储过程并为其传递参数。您总是使用字符串生成器“生成”sql代码。而且,更改存储过程中的某些功能要比在代码中查找语句、更改语句并重新生成应用程序容易得多
  • 从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,他们获取参数并将其放入数据库..他们没有混乱..我更喜欢通过内联代码来实现..但是如果考虑到安全性..那么我不知道..我想这会使内联代码完全冗余!!!