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 来处理你的 SqlConnectionSqlCommand 而不是手动调用 .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