C# 在VisualStudio中生成SQL语句的更好方法是什么?

C# 在VisualStudio中生成SQL语句的更好方法是什么?,c#,sql,sql-server,sqlconnection,C#,Sql,Sql Server,Sqlconnection,我正在查找如何通过sql插入我的数据库,我注意到我看到一个人执行sql语句的方式与我执行sql语句的方式不同,现在我想知道哪种方式更好 我在前面的(select)语句中所做的示例 SqlConnection conn = new SqlConnection(Variables.Default.sqlConString); conn.Open(); string builtCmd = Variables.Default.returnUserNameSql1 + usersInput + Varia

我正在查找如何通过sql插入我的数据库,我注意到我看到一个人执行sql语句的方式与我执行sql语句的方式不同,现在我想知道哪种方式更好

我在前面的(select)语句中所做的示例

SqlConnection conn = new SqlConnection(Variables.Default.sqlConString);
conn.Open();
string builtCmd = Variables.Default.returnUserNameSql1 + usersInput + Variables.Default.returnUsernameSql2;
SqlCommand cmd = new SqlCommand(builtCmd, conn);

usersInput is a string.
Variables.Default.returnUserNameSql1 = SELECT [Username] from [dbo].[LoginDetails] WHERE [Username] = '
returnUsernameSql2 = '
我在网上看到的内容(不是我的查询):

参数函数(?)的使用是否更好?如果是,以什么方式

谢谢你抽出时间

由于这里的一些评论的帮助,我修改了我原来的查询。如果有人感兴趣,我会发布:

using (SqlConnection conn = new SqlConnection(Variables.Default.sqlConString))
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand(Variables.Default.returnUserNameSql, conn))
                    {
                        cmd.Parameters.Add(new SqlParameter(Variables.Default.param1, usersInput));
                        SqlDataReader reader = cmd.ExecuteReader();
                        usernameTaken = reader.Read();
                        cmd.Dispose();
                    }
                    conn.Close();
                }

在谷歌上查找“SQL注入攻击”。打招呼。然后意识到你的方式还不错,这是一场安全噩梦,因为每个有权访问你的程序的人都可以执行他想要的任何SQL。

在谷歌上查找“SQL注入攻击”。打招呼。然后意识到您的方式还不错,这是一场安全噩梦,因为每个有权访问您的程序的人都可以执行他想要的任何SQL。

SQL注入当然是不使用字符串连接的一个重要原因,但还有一些其他原因:

  • 字符串分隔符-您需要在SQL语句中包含字符串分隔符,如果您连接的值也包含它们,则可能会出现语法错误。对于参数,您不需要字符串分隔符,带撇号或引号的值不会影响SQL语法
  • 值的字符串转换-您需要转换所有非字符串值(数字、日期等)到字符串,并确保其字符串表示完全可由服务器反转。这对于日期尤其有问题,因为同一字符串可以表示两个不同的日期,具体取决于服务器的区域性。使用参数时,传递值时不进行转换,因此服务器不会误解值是的
  • 预编译-通过连接,服务器必须重新分析每个查询以确定“最佳”计划。有了参数,服务器可以重用缓存的计划,因为实际查询之前已经发出过,只是使用了不同的参数。这并不意味着查询总是执行得更快,在某些情况下,实际上可能会导致使用不好的计划,但如果您发出数百万个仅在参数v上不同的查询,这是一个需要考虑的问题价值观

SQL注入当然是不使用字符串连接的一个重要原因,但还有一些其他原因:

  • 字符串分隔符-您需要在SQL语句中包含字符串分隔符,如果您连接的值也包含字符串分隔符,则可能会出现语法错误。对于参数,您不需要字符串分隔符,带撇号或引号的值不会影响SQL语法
  • 值的字符串转换-您需要转换所有非字符串值(数字、日期等)到字符串,并确保其字符串表示完全可由服务器反转。这对于日期尤其有问题,因为同一字符串可以表示两个不同的日期,具体取决于服务器的区域性。使用参数时,传递值时不进行转换,因此服务器不会误解值是的
  • 预编译-通过连接,服务器必须重新分析每个查询以确定“最佳”计划。有了参数,服务器可以重用缓存的计划,因为实际查询之前已经发出过,只是使用了不同的参数。这并不意味着查询总是执行得更快,在某些情况下,实际上可能会导致使用不好的计划,但如果您发出数百万个仅在参数v上不同的查询,这是一个需要考虑的问题价值观

最好使用参数,请参阅最好使用参数和存储过程*摆脱内联SQL-它们是这样联机的,因此您可以阅读:P.您还可以指定SqlParameter对象类型、方向、值等。最好使用参数,请参阅最好使用参数和存储过程*摆脱内联SQLSQL-他们有这样的在线版本,所以你可以阅读:P。你也可以指定SqlParameter对象类型、方向、值等。“Bobby Tables说你好”?添加了链接。这是一个关于名为“Bobby;--Drop Table Students”的孩子的漫画)我明白了!非常感谢,我从来没有想过这件事!可能想把“不坏”改为“不仅坏”@tomtom我想你不能给我一个如何进行第一次选择查询的例子吗?我很难做到:/“Bobby Tables说你好”?添加了链接。这是一个关于一个名为“Bobby;--Drop Table Students”的孩子的漫画)我明白了!非常感谢,我从未想过这一点!可能想将“不坏”改为“不仅坏”@tomtom我想你不能给我一个如何执行第一个选择查询的示例吗?我很难做到:/。
using (SqlConnection conn = new SqlConnection(Variables.Default.sqlConString))
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand(Variables.Default.returnUserNameSql, conn))
                    {
                        cmd.Parameters.Add(new SqlParameter(Variables.Default.param1, usersInput));
                        SqlDataReader reader = cmd.ExecuteReader();
                        usernameTaken = reader.Read();
                        cmd.Dispose();
                    }
                    conn.Close();
                }