2013-10-12 4 views
0

Итак, Visual Studio сообщает, что мои цитаты не соответствуют утверждению обновления. Я чувствую, что это может быть нечто большее. Я чувствую, что я близок, но я не вижу, где я ошибаюсь в этом заявлении sql. Точкой веб-страницы является обновление базы данных, которая является всего для этого шага. Кто-нибудь может мне помочь.Обновление базы данных

Вот мой код.

P.S. - Я сделал инструкцию вставки, подобную этой, но строкую часть idString полностью обращается к программному обеспечениюReportRecord.Close(); был ниже оператора обновления, и он сработал.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Data.SqlClient; 
public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     reportDateText.Text = DateTime.Today.ToShortDateString(); 
     //code page 429 
     if (Page.IsPostBack) 
     { 
      Page.Validate(); 
      if (Page.IsValid) 
      { 

       bugReportForm.Visible = false; 
       regMessage.Visible = true; 
       string typeOS = oSListbox.SelectedValue; 
       string reportDate = reportDateText.Text; 
       string hardware = hardwareText.Text; 
       string occurrence = occurrenceRadioButtonList.SelectedValue; 
       string shortDescription = shortDescriptionText.Text; 
       string longDescription = longDescriptionText.Text; 
       string actionsTaken = actionsTakenText.Text; 
       SqlConnection dbConnection = new SqlConnection("Data Source=.\\SQLEXPRESS;Integrated Security=true"); 
       try 
       { 
        dbConnection.Open(); 
        dbConnection.ChangeDatabase("BugsReport"); 

       } 
       catch (SqlException exception) 
       { 
        if (exception.Number == 911) 
        { 
         SqlCommand sqlCommand = new SqlCommand("CREATE DATABASE BugsReport", dbConnection); 
         sqlCommand.ExecuteNonQuery(); 
         regMessage.Text = "<p>Successfully created the database.</p>"; 
         dbConnection.ChangeDatabase("BugsReport"); 
        } 
        else 
         Response.Write("<p>Error code " + exception.Number 
          + ": " + exception.Message + "</p>"); 
       } 
       finally 
       { 
        regMessage.Text += "<p>Successfully selected the database.</p>"; 
       } 
       try 
       { 
        string SQLString = "SELECT * FROM softwareLog"; 
        SqlCommand checkIDTable = new SqlCommand(SQLString, dbConnection); 
        SqlDataReader idRecords = checkIDTable.ExecuteReader(); 
        idRecords.Close(); 
       } 
       catch (SqlException exception) 
       { 
        if (exception.Number == 208) 
        { 
         SqlCommand sqlCommand = new SqlCommand("CREATE TABLE softwareLog (reportID SMALLINT IDENTITY(100,1) PRIMARY KEY, typeOS VARCHAR(25), reportDate DATE, hardware VARCHAR(50), occurrence VARCHAR(15), shortDescription VARCHAR(100), longDescription VARCHAR(500), actionsTaken VARCHAR(25))", dbConnection); 
         sqlCommand.ExecuteNonQuery(); 
         regMessage.Text += "<p>Successfully created the table.</p>"; 
        } 
        else 
         regMessage.Text += "<p>Error code " + exception.Number 
          + ": " + exception.Message + "</p>"; 
       } 
       finally 
       { 
        string idString = "SELECT IDENT_CURRENT('softwareLog') AS reportID"; 
       SqlCommand newID = new SqlCommand(idString, dbConnection); 
       SqlDataReader softwareReportRecord = newID.ExecuteReader(); 
       softwareReportRecord.Read(); 
       string reportID = Convert.ToString(softwareReportRecord["reportID"]); 
       softwareReportRecord.Close(); 

       string editRecord = "UPDATE softwareLog SET " 
      + "typeOS='" + typeOS + "', " 
      + "reportDate='" + reportDate + "', " 
      + "hardware='" + hardware + "' " 
      + "occurrence='" + occurrence + "' " 
      + "shortDescription='" + shortDescription + "' " 
      + "longDescription='" + longDescription + "' " 
      + "actionsTaken='" + actionsTaken + "' " 
      + "WHERE reportID=" + reportID + ";"; 



        SqlCommand sqlCommand = new SqlCommand(editRecord, dbConnection); 
        sqlCommand.ExecuteNonQuery(); 
       } 


       dbConnection.Close(); 
      } 
     } 
    } 
} 




finally 
       { 
        string addRecord = "INSERT INTO softwareLog VALUES('" 
         + typeOS + "', '" 
         + reportDate + "', '" 
         + hardware + "', '" 
         + occurrence + "', '" 
         + shortDescription + "', '" 
         + longDescription + "', '" 
         + actionsTaken + "')"; 

        SqlCommand sqlCommand = new SqlCommand(addRecord, dbConnection); 
        sqlCommand.ExecuteNonQuery(); 
       } 
       string idString = "SELECT IDENT_CURRENT('softwareLog') AS reportID"; 
       SqlCommand newID = new SqlCommand(idString, dbConnection); 
       SqlDataReader softwareReportRecord = newID.ExecuteReader(); 
       softwareReportRecord.Read(); 
       string reportID = Convert.ToString(softwareReportRecord["reportID"]); 
       softwareReportRecord.Close(); 
       regMessage.Text += "<p>Sorry for your inconvience. We will be working on your problem ASAP. For reference your ID is </p>" + reportID; 

       dbConnection.Close(); 
+1

Запустите его в режиме отладки и посмотрите значение Edit Record с помощью точки разрыва. и попробуйте запустить это из студии управления sql. Вы будете знать, где проблема. – Regon

+0

Сообщите нам, где вы застряли? –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

2

Вам не хватает слишком много «,» в разделе «Обновление». EDIT У вас есть одна цитата внутри строки. Вы должны избежать этих цитат также:

string editRecord = "UPDATE softwareLog SET " 
    + "typeOS='" + typeOS.Replace("'", "''") + "', " 
    + "reportDate='" + reportDate + "', " 
    + "hardware='" + hardware.Replace("'", "''") + "'," 
    + "occurrence='" + occurrence.Replace("'", "''") + "'," 
    + "shortDescription='" + shortDescription.Replace("'", "''") + "'," 
    + "longDescription='" + longDescription + "'," 
    + "actionsTaken='" + actionsTaken.Replace("'", "''") + "'" 
    + "WHERE reportID= " + reportID ; 

В вкладыше вам не нужна котировка для ReportID:

string addRecord = "INSERT INTO softwareLog VALUES('" 
    + typeOS.Replace("'", "''") + "', '" 
    + reportDate + "', '" 
    + hardware.Replace("'", "''") + "', '" 
    + occurrence.Replace("'", "''") + "', '" 
    + shortDescription.Replace("'", "''") + "', '" 
    + longDescription.Replace("'", "''") + "', '" 
    + actionsTaken.Replace("'", "''") + "')"; 
+4

Это и он должен действительно использовать параметры ... или еще лучше хранимую процедуру. – MikeSmithDev

+0

+1 @MikeSmithDev - Я полностью согласен. – afzalulh

+0

Я скопировал этот код и получил ту же ошибку, чтобы показать мне, как лучше. Мы еще не храним процедуры в этом классе. Я знаю их, но мы тоже их не имеем. –

0

Скорее всего, данные, передаваемые запросу, заканчиваются строкой раньше. По многим причинам (включая эту, но также и SQL-инъекцию) вы должны использовать параметры вместо конкатенации.

0

Попробуйте, как это,

string editRecord = "UPDATE softwareLog SET " 
      + "typeOS='" + typeOS + "', " 
      + "reportDate='" + reportDate + "', " 
      + "hardware='" + hardware + "'," 
      + "occurrence='" + occurrence + "'," 
      + "shortDescription='" + shortDescription + "'," 
      + "longDescription='" + longDescription + "'," 
      + "actionsTaken='" + actionsTaken + "'" 
      + "WHERE reportID=" + reportID + ""; 

Можете ли вы добавить свой Вставить Заявление тоже.

Примечание: Это будет лучше использовать параметризованный SqlCommand или хранить Процедуры для выполнения этого типа операции.

Если вы укажете значение в любое поле, это не сработает. Также проверьте значение, которое вы поставляете для ReportId.

+0

Это неправильно. Последнее «,» перед ГДЕ приведет к ошибке. – afzalulh

+0

добавил вставку к коду после того, как основной код, который я разместил –

+0

Если в вашей таблице есть поле со списком 7-го столбца и все поля являются текстовыми типами, такими как Varchar, Nvarchar и т. Д. Тогда ваша операция вставки будет работать. Есть ли проблемы в операции вставки. – Regon

0

В этом примере вы должны использовать параметры в качестве меры предосторожности против SQL-инъекций, как упомянули другие.

Но для других строк я предлагаю вам изучить string.Format(), а не конкатенировать все. Сделал бы эту строку намного легче читать.

Смежные вопросы