Параметризованный SQL в приложении C#

Я строю SQL-запрос, пытаясь сделать его более безопасным с помощью параметризованного запроса. У меня есть ниже, это выглядит нормально или есть что-то, что я могу / нужно изменить?

// 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();

Я пропустил некоторые детали (имя БД и т. Д.).

Любая помощь или предложения будут с благодарностью!

2 ответа

Решение

Вы должны сделать это так:

// 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Прочитайте это.

Я сильно чувствую риск, чтобы ответить на ваш вопрос, но в любом случае..

Прежде всего, database является зарезервированным ключевым словом в T-SQL. Вы должны использовать его с квадратными скобками, такими как [database], Но как лучший способ, не надо. Измените его на незарезервированное слово, которое имеет значение для вашего.

Во-вторых, использовать using заявление, чтобы избавиться от SqlConnection а также SqlCommand вместо звонка .Dispose() метод вручную..

В-третьих, не рекомендуется использовать AddWithValue метод. Это может привести к неожиданным результатам. использование .Add() метод или это перегрузки. Читайте: мы можем прекратить использовать AddWithValue() уже?

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();
}
Другие вопросы по тегам