2016-12-04 1 views
1

내 프로그램에서 사용자는 내가 만든 로컬 데이터베이스에서 값 (예 : price)을 변경할 수있는 옵션을 원합니다.로컬 SQL Server 데이터베이스의 값을 업데이트하는 방법

문제가 있습니다. 연결이 잘 작동하고 디버그가 잘되고 "저장 확인"메시지가 표시되지만 데이터베이스에서 전혀 변경되지 않습니다.

private void button2_Click(object sender, EventArgs e) 
{    
    var con = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\sam\Desktop\hello\hello\DB.mdf;Integrated Security=True"; 

    using (SqlConnection myconnection = new SqlConnection(con)) 
    { 
     try 
     { 
      myconnection.Open();  
      var query = string.Format("update DBTable set price='"+textBox2.Text+"' where ParamToCheck='"+comboBox5.Text+"'"); 
      SqlCommand cm = new SqlCommand(query, myconnection); 

      cm.ExecuteNonQuery(); 

      MessageBox.Show("saved ok !!");  
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

사용자는 combobox5에서 문자열을 선택하고 번호를 입력하여 textBox2에서 자신의 가격을 변경 - 내가 원하는 것을 -하지만 변화하지 않습니다.

+2

SSMS에서 직접 실행하면 쿼리가 작동합니까? – ChrisF

+0

테이블/컬럼 이름이 실제로'DBTable'과'ParamToCheck'입니까? 가격이 varchar/nvarchar가 아닌 경우 값을 따옴표로 묶을 필요가 없습니다. – Marco

+1

ExecuteNonQuery는 쿼리에서 업데이트 한 행 수를 반환합니다. 귀하의 메시지 상자는 "저장되었습니다"진실을 말하지 않습니다. _int rowsUpdated = cm.ExecuteNonQuery(); _로 확인한 다음 rowsUpdated 값을 확인하십시오. – Steve

답변

2

SQL 쿼리를 작성하는 올바른 방법은 매개 변수를 사용하고 각 열에 올바른 데이터 형식을 사용하는 것입니다. 이제 문자열을 연결하면 여러 가지 유형의 오류에 빠질 수있는 안전한 방법입니다. 간단한 것은 데이터베이스 엔진에 의한 값을 올바르게 이해하지 못하는 것입니다. 최악의 경우는 전체 데이터베이스를 손상시킬 수있는 SQL Injection입니다. 내가 문자열 연결을 사용하지 않고 많은 당신의 쿼리 텍스트를 단순화

var query = "update DBTable set [email protected] where [email protected]"; 
using (SqlConnection myconnection = new SqlConnection(con)) 
using (SqlCommand cm = new SqlCommand(query, myconnection)) 
{ 
    try 
    { 

     myconnection.Open();  
     cm.Parameters.Add("@price", SqlDbType.Decimal).Value = Convert.ToDecimal(textBox2.Text); 
     cm.Parameters.Add("@prm", SqlDbType.NVarChar).Value = comboBox5.Text; 
     int rowsUpdated = cm.ExecuteNonQuery(); 
     if(rowsUpdated > 1) 
      MessageBox.Show("saved ok !!");  
     else 
      MessageBox.Show("No match for condition:" + comboBox5.Text);  
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

공지 사항, 대신 명령을 완료하기 위해 데이터베이스 엔진에서 사용되는 두 개의 매개 변수의 자리가 있습니다. 그런 다음 특정 데이터 형식 (decimal 및 nvarchar)의 두 매개 변수를 추가했습니다. 이러한 유형은 Price 및 ParamToCheck에 대한 열의 데이터 유형과 일치해야합니다.

+0

고마워요. 지금 많은 일이 잘됩니다 !! – shlezz

관련 문제