2015-07-24 1 views
2
private void button1_Click(object sender, EventArgs e) 
{ 
    SqlConnection con = new SqlConnection("Data Source=SAGAR\\SQLEXPRESS;Initial Catalog=ClinicDb;Integrated Security=True"); 
    con.Open(); 
    SqlCommand sc = new SqlCommand("insert into Patient_Details (Patient Id,Name,Age,Contact No,Address) VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "',);", con); 
    object o= sc.ExecuteNonQuery(); 
    MessageBox.Show(o +"Saved data"); 
    con .Close(); 
} 
+0

Какова деталь исключения? Вы всегда должны использовать [параметризованные запросы] (http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/). Этот тип конкатенаций строк открыт для [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) атак. –

+2

В названиях столбцов есть пробелы, что означает, что вам нужно заключить их в фигурные скобки, например. '[имя столбца]' – DavidG

+0

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

ответ

1

поля и имена таблиц с пробелами должны быть внутри [], также у вас есть 1 дополнительная запятая в конце вашего запроса. Попробуйте:

SqlCommand sc = new SqlCommand("insert into [Patient_Details] ([Patient Id],Name,Age,[Contact No],Address) VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "');", con); 
object o= sc.ExecuteNonQuery(); 

также рассмотрите возможность использования параметров, так как вы открыты для ввода в sql.

+0

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

+0

Вам не нужен 'ToString'. Оператор '+' автоматически вызовет 'ToString' на' o'. – juharr

+0

thx .... отредактированный .... – apomene

1

Я вижу несколько вещей;

  • Patient Id должен быть [Patient Id] и Contact No должны быть [Contact No], так как они более чем одно слово. Как наилучшая практика, измените свои имена на одно слово.
  • У вас есть дополнительные , в конце textBox5.Text + "', часть.

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

И используйте using statement для автоматического управления вашими соединениями и командами вместо вызова методов Close или Dispose вручную.

using(var con = new SqlConnection(connection)) 
using(var sc = con.CreateCommand()) 
{ 
    sc.CommandText = @"insert into Patient_Details ([Patient Id],Name,Age,[Contact No],Address) 
         VALUES(@id, @name, @age, @no, @address)"; 
    sc.Parameters.AddWithValue("@id", textBox1.Text); 
    sc.Parameters.AddWithValue("@name", textBox2.Text); 
    sc.Parameters.AddWithValue("@age", textBox3.Text); 
    sc.Parameters.AddWithValue("@no", textBox4.Text); 
    sc.Parameters.AddWithValue("@address", textBox5.Text); 

    con.Open(); 
    int i = sc.ExecuteNonQuery(); 
    MessageBox.Show(i + " Saved data"); 
} 

Кстати, я использовал AddWithValue в моем примере, так как вы не сказали нам свои типы столбцов, но вы не. This method might generate surprising results sometimes. Используйте Add метод перегрузки, чтобы указать свой тип параметра (SqlDbType) и его размер.

Получение object от ExecuteNonQuery is действительно странно также. Он будет возвращать int в качестве количества проведенных строк. Это будет 1 или 0 в вашем случае.

В последнюю очередь, я сильно предполагаете Patient Id, Age и Contact No столбцы должны быть какой-то числовой тип, не введенный символ.

+0

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

+0

Пожалуйста, [не рекомендуется] (http://blogs.msmvps.com/jcoehoorn/blog/ 2014/05/12/can-we-stop-using-addwithvalue-уже /) использовать 'AddWithValue' – DavidG

+0

@DavidG Я объяснил, почему я использовал его на последней части. –

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