2015-11-19 3 views
0

Таким образом, мой код встречает искомый идентификатор пользователя лектора и идентификатор модуля, ранее выбранный пользователем. Однако это ломается на этой линии;Обновление базы данных с сеансами, не работающими C# SQL

myCommand.ExecuteNonQuery(); 

Ошибка:

An exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll but was not handled in user code 

Additional information: Incorrect syntax near '('. 

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

Передний конец Код:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
      SelectCommand="SELECT Lecturer_Records.UserID, Lecturer_Records.FirstName, Lecturer_Records.Surname, Lecturer_Records.PhoneNumber, Users.Email 
      FROM Lecturer_Records 
      INNER JOIN Users ON Lecturer_Records.UserID = Users.UserID 
      WHERE (Users.Email = @email)"> 
      <SelectParameters> 
       <asp:QueryStringParameter Name="email" QueryStringField="searchlects" /> 
       <asp:SessionParameter Name="ModuleID" SessionField="ModuleID" Type="Int32" /> 
      </SelectParameters> 
     </asp:SqlDataSource> 




     <asp:GridView ID="SearchResult" runat="server" AutoGenerateColumns="False" AutoGenerateSelectButton="True" DataSourceID="SqlDataSource1" OnSelectedIndexChanged="SearchResult_SelectedIndexChanged"> 
      <Columns> 
       <asp:BoundField DataField="UserID" HeaderText="UserID" SortExpression="UserID" /> 
       <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> 
       <asp:BoundField DataField="Surname" HeaderText="Surname" SortExpression="Surname" /> 
       <asp:BoundField DataField="PhoneNumber" HeaderText="PhoneNumber" SortExpression="PhoneNumber" /> 
       <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> 
      </Columns> 
     </asp:GridView> 

И мой C# код

protected void SearchResult_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    // open new connection 
     SqlConnection connection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 
     connection1.Open(); 

     string SearchUser = SearchResult.SelectedRow.Cells[1].Text; 
     string Module = (string)Session["ModuleID"]; 

     SqlCommand myCommand = new SqlCommand("UPDATE [Modules] SET (UserID = '" + SearchUser + "') WHERE (ModuleID = '" + Module + "')", connection1); 


     myCommand.ExecuteNonQuery(); 
     // move on to home page 
     Response.Redirect("APMDefault.aspx"); 
    } 

ответ

1

Вам не нужны никакие ( или ) в вашей команде. Они разбивают ваш синтаксис sql. Просто удалите их.

Но, что более важно, вы всегда должны использовать parameterized queries. Этот тип конкатенаций строк открыт для атак SQL Injection.

Основываясь на названиях столбцов, они выглядят как числовые типы. Это означает, что вам может понадобиться также удалить одинарные кавычки. Если вы используете prepared statements, вам это не понадобится, конечно.

И используйте заявление using, чтобы распорядиться своим соединением и командой.

using(var connection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
using(var myCommand = connection1.CreateCommand()) 
{ 
    myCommand.CommandText = @"UPDATE Modules SET UserID = @userid 
           WHERE ModuleID = @moduleid"; 
    myCommand.Parameters.Add("@userid", SqlDbType.NVarChar).Value = SearchUser; 
    myCommand.Parameters.Add("@moduleid", SqlDbType.NVarChar).Value = Module; 
    // I assumed your column types are nvarchar 
    connection1.Open(); 
    myCommand.ExecutenonQuery(); 
    // move on to home page 
    Response.Redirect("APMDefault.aspx"); 
} 

Но действительно эти столбцы кажутся числовыми типами. Либо вы можете их тип, либо изменить свое имя, которое указывает их типы как символ.

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