2012-06-07 2 views
6

나는 MS 액세스oledb를 사용하여 액세스 테이블에 레코드를 삽입하는 방법은 무엇입니까?

Items(Table)  
Item_Id(autonumber) 
Item_Name(text) 
Item_Price(currency) 

에이 항목의 테이블을 가지고 있고 나는이 코드를 사용하여 레코드를 삽입하기 위해 노력하고있어.

OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString()); 
     OleDbCommand cmd = new OleDbCommand(); 
     cmd.CommandType = CommandType.Text; 
     cmd.CommandText = "insert into Items ([Item_Name],[Item_Price]) values ('" + itemNameTBox.Text + "','" + Convert.ToDouble(itemPriceTBox.Text) + "')"; 
     cmd.Connection = myCon; 
     myCon.Open(); 
     cmd.ExecuteNonQuery(); 
     System.Windows.Forms.MessageBox.Show("An Item has been successfully added", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
     myCon.Close(); 

코드는 오류없이 실행 중이지만 결국에는 어떤 실수가 있는지 테이블에 기록이 없습니다.

+2

cmd.Parameters.Add("@price", OleDbType.Decimal).Value = Convert.ToDecimal(itemPriceTBox.Text); 

더 많은 정보를 사용하는 것이 더 나은 항상 생각 당신이 Convert.ToDouble (itemPriceTBox.Text) 주위에 따옴표를 제거 같은 문제가받을 수 있나요? –

답변

11

SQL 삽입 텍스트는 매개 변수를 사용하지 않습니다.
이것은 버그의 원인입니다. (SqlInjection)

이렇게하면 코드가 바뀝니다.

using(OleDbConnection myCon = new OleDbConnection(ConfigurationManager.ConnectionStrings["DbConn"].ToString())) 
{ 
    OleDbCommand cmd = new OleDbCommand(); 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "insert into Items ([Item_Name],[Item_Price]) values (?,?); 
    cmd.Parameters.AddWithValue("@item", itemNameTBox.Text); 
    cmd.Parameters.AddWithValue("@price", Convert.ToDouble(itemPriceTBox.Text)); 
    cmd.Connection = myCon; 
    myCon.Open(); 
    cmd.ExecuteNonQuery(); 
    System.Windows.Forms.MessageBox.Show("An Item has been successfully added", "Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); 
} 

물론 여기에서는 price 텍스트 상자에 올바른 숫자 값이 포함되어 있다고 가정합니다.
는이 대답은 업데이 트를 필요로하는 매개 변수 @price

** 4 년 후 편집 **

에 대한 값으로 price을 사용

double price; 
if(double.TryParse(itemPriceTBox.Text, out price) == false) 
{ 
    MessageBox.Show("Invalid price"); 
    return; 
} 

위의 코드를 호출하기 전에이 줄을 추가해야합니다 . 위의 코드에서 AddWithValue를 사용하여 매개 변수 컬렉션에 매개 변수를 추가합니다. 작동하지만 모든 독자는 AddWithValue에 몇 가지 단점이 있음을 알려야합니다. 특히 대상 열에 10 진수 값 또는 날짜가 필요한 경우 쉽게 경로를 사용하여 문자열 만 추가하면됩니다. 이 문맥에서 내가 썼다면

cmd.Parameters.AddWithValue("@price", itemPriceTBox.Text); 

결과가 구문 오류 또는 값의 이상한 변환 일 수 있으며 같은 날짜에 발생할 수 있습니다. AddWithValue는 문자열 매개 변수를 만들고 데이터베이스 엔진은 값을 예상되는 열 유형으로 변환해야합니다. 그러나 클라이언트와 서버 간의 로케일 차이로 인해 값의 오해가 생길 수 있습니다.

나는 AddWithValue problems can be found here

+0

하나의 문제는 레코드가 삽입되고 런타임에 gridview에서 볼 수 있지만 테이블에서 프로젝트 실행 및 미리보기 데이터를 중지하면 데이터가없고 다시 프로젝트를 실행할 때 gridview에 데이터가 없습니다. – mepk

+0

연결 문자열을 확인하는 것이 어렵습니다. 위의 코드가 작동해야합니다. 표 안에 Access가있는 일부 레코드를 추가하고 눈금에 표시되는지 확인하십시오. – Steve

+0

액세스 테이블에 데이터를 삽입 한 후 gridview가 레코드를 보여줍니다. 그러나 새 레코드는 테이블에 삽입되지 않습니다. – mepk

관련 문제