C# 在VisualStudio中生成SQL语句的更好方法是什么?
我正在查找如何通过sql插入我的数据库,我注意到我看到一个人执行sql语句的方式与我执行sql语句的方式不同,现在我想知道哪种方式更好 我在前面的(select)语句中所做的示例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
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语法
- 值的字符串转换-您需要转换所有非字符串值(数字、日期等)到字符串,并确保其字符串表示完全可由服务器反转。这对于日期尤其有问题,因为同一字符串可以表示两个不同的日期,具体取决于服务器的区域性。使用参数时,传递值时不进行转换,因此服务器不会误解值是的
- 预编译-通过连接,服务器必须重新分析每个查询以确定“最佳”计划。有了参数,服务器可以重用缓存的计划,因为实际查询之前已经发出过,只是使用了不同的参数。这并不意味着查询总是执行得更快,在某些情况下,实际上可能会导致使用不好的计划,但如果您发出数百万个仅在参数v上不同的查询,这是一个需要考虑的问题价值观
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();
}