SQL вставка переменных из разных операторов - PullRequest
0 голосов
/ 05 июля 2011
      StringBuilder sb = new StringBuilder();
    sb.Append("DECLARE @ControlPaneliD int");
    sb.Append(" SET @ControlPaneliD=(SELECT ControlPanelID");
    sb.Append(" FROM ControlPanelID");
    sb.Append(" WHERE Name=@Name)");

    sb.Append("DECLARE @UserName UniqueIdentifier");
    sb.Append(" SET @UserName=(SELECT Name");
    sb.Append(" FROM UsersID");
    sb.Append(" WHERE UsersID=@UserID)");

    sb.Append("INSERT INTO dbo.CP_Comments (ControlPanelID,Comments,Commentator)");
    sb.Append(" VALUES(@ControlPaneliD,@Comment,@UserName)");
    MembershipUser CurrentUser = Membership.GetUser();
    Guid id = (Guid)CurrentUser.ProviderUserKey;

    string myConnectionString = AllQuestionsPresented.connectionString;
    using (SqlConnection conn = new SqlConnection(AllQuestionsPresented.connectionString))
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
        cmd.Parameters.Add("UserID", SqlDbType.UniqueIdentifier).Value = id;
        cmd.Parameters.Add("Comment", SqlDbType.NVarChar).Value = TextBox1.Text;
        cmd.Parameters.Add("Name", SqlDbType.NVarChar).Value = name; //string variable from my code
        cmd.ExecuteNonQuery();

    }

Я пытаюсь сделать два оператора выбора, поместить их результаты в свои переменные и вставить их переменные плюс еще одну переменную в другой оператор вставки.

Я не уверен, правильно ли я делаю, буду признателен за помощь, если вы дадите мне несколько советов и критику по поводу того, что я написал.

Ответы [ 4 ]

2 голосов
/ 05 июля 2011
  1. В операторе вставки вы вставляете 3 параметра в 2 столбца.
  2. Я думаю, вы должны написать хранимую процедуру и передать параметры для нее.Вы всегда «генерируете» SQL-код с помощью строителя строк.А изменить некоторые функции в хранимой процедуре гораздо проще, чем найти оператор в коде, изменить его и пересобрать приложение.
  3. SELECT ControlPanelID FROM ControlPanelID WHERE Name=@Name и SELECT Name FROM UsersID WHERE UsersID=@UserID выглядит странно.У вас действительно есть таблицы с именами ControlPanelID и UsersID?
1 голос
/ 05 июля 2011

Это действительно уязвимо для SQL-инъекций, особенно эта часть:

cmd.Parameters.Add("Comment", SqlDbType.NVarChar).Value = TextBox1.Text;

Это очень, очень опасно. Я не могу представить, что вы не слышали об этом, но на всякий случай посмотрите эту статью в вики: http://en.wikipedia.org/wiki/SQL_injection

Если вы действительно хотите / должны выполнять сырой SQL, всегда избегайте значений.

Рассматривали ли вы использование строго типизированного DAL, такого как LINQ2SQL, DataEntities и т. Д.?

1 голос
/ 05 июля 2011

Ваш метод выглядит нормально, но вместо передачи запроса рекомендуется использовать хранимую процедуру

0 голосов
/ 05 июля 2011

Я бы предпочел поместить этот код в хранимую процедуру.Не стоит помещать это в построитель строк и запускать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...