C# 应用程序中的参数化 SQL
Parameterized SQL in C# Application
我正在构建一个 SQL 查询,试图通过使用参数化查询使其更安全。我有以下内容,这看起来不错还是我 can/need 有什么要更改的?
// Connection to SQL
string connectionString = "Data Source= PC\SQL;Initial Catalog= Catalog;Integrated Security=False; User ID=; Password=";
// SQL Insert Command - Must Use The Below For Commands!
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand Insert = new SqlCommand("INSERT INTO database (OS) VALUES (@ad)", connection);
Insert.Parameters.AddWithValue("@ad", adtb.text);
connection.Open();
Insert.ExecuteNonQuery();
connection.Close();
我遗漏了某些细节(数据库名称等)。
如有任何帮助或建议,我们将不胜感激!
我强烈觉得回答你的问题有点冒险,但无论如何..
首先,database
是T-SQL中的一个reserved keyword。您应该将它与方括号一起使用,例如 [database]
。但作为更好的方法,不要这样做。改成对你有意义的非保留字
其次,使用 using
statement 来处理你的 SqlConnection
和 SqlCommand
而不是手动调用 .Dispose()
方法..
第三,作为最佳实践,不要使用 AddWithValue
方法。它可能会产生意想不到的结果。使用 .Add()
method or it's overloads. Read: Can we stop using AddWithValue()
already?
using(SqlConnection con = new SqlConnection(connectionString))
using(SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "INSERT INTO [database] (OS) VALUES (@ad)";
cmd.Parameters.Add("@ad", SqlDbType.NVarChar, 16).Value = adtb.text;
con.Open();
cmd.ExecuteNonQuery();
}
你应该这样做:-
// Read this connection string from `Web.Config` file instead.
string connectionString = "Data Source= PC\SQL;
Initial Catalog= Catalog;Integrated Security=False; User ID=; Password=";
可以这样写,避免每次更改连接字符串都重新编译:-
string connectionString = ConfigurationManager.ConnectionString["YourKey"]
.ConnectionString;
考虑使用 using
语句来处置您的宝贵资源:
using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand Insert = new SqlCommand("INSERT INTO database (OS)
VALUES (@ad)", connection))
{
Insert.Parameters.Add("@ad", SqlDbType.NVarchar,10).Value = adtb.text;
connection.Open();
Insert.ExecuteNonQuery();
}
避免使用 AddWithValue
,阅读 this。
我正在构建一个 SQL 查询,试图通过使用参数化查询使其更安全。我有以下内容,这看起来不错还是我 can/need 有什么要更改的?
// Connection to SQL
string connectionString = "Data Source= PC\SQL;Initial Catalog= Catalog;Integrated Security=False; User ID=; Password=";
// SQL Insert Command - Must Use The Below For Commands!
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand Insert = new SqlCommand("INSERT INTO database (OS) VALUES (@ad)", connection);
Insert.Parameters.AddWithValue("@ad", adtb.text);
connection.Open();
Insert.ExecuteNonQuery();
connection.Close();
我遗漏了某些细节(数据库名称等)。
如有任何帮助或建议,我们将不胜感激!
我强烈觉得回答你的问题有点冒险,但无论如何..
首先,database
是T-SQL中的一个reserved keyword。您应该将它与方括号一起使用,例如 [database]
。但作为更好的方法,不要这样做。改成对你有意义的非保留字
其次,使用 using
statement 来处理你的 SqlConnection
和 SqlCommand
而不是手动调用 .Dispose()
方法..
第三,作为最佳实践,不要使用 AddWithValue
方法。它可能会产生意想不到的结果。使用 .Add()
method or it's overloads. Read: Can we stop using AddWithValue()
already?
using(SqlConnection con = new SqlConnection(connectionString))
using(SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "INSERT INTO [database] (OS) VALUES (@ad)";
cmd.Parameters.Add("@ad", SqlDbType.NVarChar, 16).Value = adtb.text;
con.Open();
cmd.ExecuteNonQuery();
}
你应该这样做:-
// Read this connection string from `Web.Config` file instead.
string connectionString = "Data Source= PC\SQL;
Initial Catalog= Catalog;Integrated Security=False; User ID=; Password=";
可以这样写,避免每次更改连接字符串都重新编译:-
string connectionString = ConfigurationManager.ConnectionString["YourKey"]
.ConnectionString;
考虑使用 using
语句来处置您的宝贵资源:
using(SqlConnection connection = new SqlConnection(connectionString))
using(SqlCommand Insert = new SqlCommand("INSERT INTO database (OS)
VALUES (@ad)", connection))
{
Insert.Parameters.Add("@ad", SqlDbType.NVarchar,10).Value = adtb.text;
connection.Open();
Insert.ExecuteNonQuery();
}
避免使用 AddWithValue
,阅读 this。