2016-09-14 2 views
0

В настоящее время я пишу фрагмент кода, в котором пользователь должен вставить несколько сведений о сотруднике и нажать одну кнопку, чтобы заполнить сетку, а другой - сохранить информацию в gridview в локальной базе данных. Несмотря на то, что я написал до сих пор, существует непротиворечивая ошибка: «SqlExeption был необработанным кодом пользователя. Я пытался его исправить, но безуспешно. Он жалуется на conn.Open();Сохранение данных из сетки в локальную базу данных в asp.net

Это конкретный фрагмент кода:

protected void SaveButton_Click(object sender, EventArgs e) 
{ 
    string StrQuery; 

    try 
    { 
     using (SqlConnection conn = new SqlConnection(@"Data Source = C:\EmployeeWebProject\EmployeeWebProject\App_Data\EmployeeDatabase.sdf")) 
     { 
      using (SqlCommand comm = new SqlCommand("SELECT * FROM Employee")) 
      { 
       comm.Connection = conn; 

       conn.Open(); 

       for (int i = 0; i < GridView1.Rows.Count; i++) 
       { 
        StrQuery = @"INSERT INTO Employee VALUES (" 
           + GridView1.Rows[i].Cells[0].ToString() + ", " 
           + GridView1.Rows[i].Cells[1].ToString() + ", " 
           + GridView1.Rows[i].Cells[2].ToString() + ", " 
           + GridView1.Rows[i].Cells[3].ToString() + ", " 
           + GridView1.Rows[i].Cells[4].ToString() + ");"; 
        comm.CommandText = StrQuery; 
        comm.ExecuteNonQuery(); 
       } 
      } 
     } 
    } 
    finally 
    { 
    } 
} 
+3

[SQL Injection alert] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** объединять свои SQL-запросы - использовать ** параметризованные запросы ** вместо избежания SQL-инъекции –

+0

Вам нужно предоставить больше данных об ошибках - проверьте внутренние исключения, включите полное сообщение об ошибке и т. д. – mason

+1

+10000000 - комментарии @marc_s о SQL-инъекции. Скорее всего, вы получаете сообщение об ошибке, потому что ваш запрос недействителен. Я предполагаю, что у вас есть строковые значения, но у вас нет ни одной кавычки в вашем запросе. Параметрирование этого не только предотвратит уязвимость, но и устранит ошибки. –

ответ

2

Чтобы избежать SQL инъекции и правильно использовать параметризованные запросы, а также использовать SQL Server CE соединений и командных объектов, попробуйте этот код:

protected void SaveButton_Click(object sender, EventArgs e) 
{ 
    string StrQuery; 

    try 
    { 
     // define connection string and INSERT query WITH PARAMETERS 
     string connectionString = @"Data Source = C:\EmployeeWebProject\EmployeeWebProject\App_Data\EmployeeDatabase.sdf"; 
     string insertQry = "INSERT INTO Employees(Col1, Col2, Col3, Col4, Col5) " + 
          "VALUES(@Col1, @Col2, @Col3, @Col4, @Col5);"; 

     // define connection and command for SQL Server CE 
     using (SqlCeConnection conn = new SqlCeConnection(connectionString)) 
     using (SqlCeCommand cmd = new SqlCeCommand(insertQry, conn)) 
     { 
      // add parameters to your command - adapt those *as needed* - we don't know your table structure, 
      // nor what datatype (and possibly length) those parameters are ! 
      cmd.Parameters.Add("@Col1", SqlDbType.Int); 
      cmd.Parameters.Add("@Col2", SqlDbType.VarChar, 100); 
      cmd.Parameters.Add("@Col3", SqlDbType.VarChar, 100); 
      cmd.Parameters.Add("@Col4", SqlDbType.VarChar, 100); 
      cmd.Parameters.Add("@Col5", SqlDbType.VarChar, 100); 

      conn.Open(); 

      for (int i = 0; i < GridView1.Rows.Count; i++) 
      { 
       // set parameter values 
       cmd.Parameters["@Col1"].Value = Convert.ToInt32(GridView1.Rows[i].Cells[0]); 
       cmd.Parameters["@Col2"].Value = GridView1.Rows[i].Cells[1].ToString(); 
       cmd.Parameters["@Col3"].Value = GridView1.Rows[i].Cells[1].ToString(); 
       cmd.Parameters["@Col4"].Value = GridView1.Rows[i].Cells[1].ToString(); 
       cmd.Parameters["@Col5"].Value = GridView1.Rows[i].Cells[1].ToString(); 

       cmd.ExecuteNonQuery(); 
      } 
     } 
    } 
    finally 
    { 
    } 
} 
+0

Nice one marc_s !! –

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