2011-05-03 2 views
6

간단한 ms 액세스 데이터베이스를 업데이트하려고합니다. 검색을 한 후 Microsoft Support - Syntax Error이라는 특정 표에 예외가 발생했습니다. 열 이름 중 하나가 예약어를 사용한다는 의미입니다. 모든 테이블은 "GUID"가있는 테이블을 제외한 열 이름, 예약어 중 하나로 업데이트되므로이 경우가 될 수 있습니다. 또한이 페이지는 OleDbAdapter와 DataSet을 사용해야한다고 말하면서 문제를 해결할 수 있습니다. 불행히도 열 이름을 변경할 수 없습니다. 그것은 내 통제를 넘어서서, 나에게 주어진 것을 가지고 일해야한다.OleDbDataAdapter 및 DataSet을 사용하여 Access.mdb 업데이트

나는 데이터베이스에서 많은 일을 할 필요가 없었으며 인터넷에서 예제를 통해 배웠던 모든 것을 배웠다. 그렇다면 OleDbAdapter와 dataSet을 사용하여 데이터베이스를 업데이트하는 올바른 방법은 무엇입니까?

DataTable 또는 OleDbCommandBuilder를 사용해야한다고 생각하지 않습니다. 솔루션에 매개 변수와 관련이 있다고 생각합니다. 그러나 나의 googleing 기술은 약하다.

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " + 
          Data Souce=" + source); 
conn.Open(); 
OleDbAdapter adapter = new OleDbDataAdapter("SELECT * From " + table, conn); 
OleDbCommandBuiler cmdBuiler = new OleDbCommandBuilder(adapter); 
DataSet = new DatSet(); 
adapter.InsertCommand = cmdBuilder.GetInertCommand(true); // Is this necessary? 
adapter.Fill(dataSet, table); 
DataTable dataTable = dataSet.Tables[table]; // Do I need a DataTable? 
DataRow row = dataTable. 
row [ attribute ] = field; // Do this for all attributes/fields. I think this is wrong. 
dataTable.rows.Add(row); 
adapter.Update(dataTable); //<--"Syntax error in INSERT INTO statement." Exception 

답변

4

열 이름 (특히 이름이 예약어 인 사용자)은 대괄호로 묶어야하는 것이 문제 일 수 있습니다. 그 자체에 InsertCommand 생성 OleDbCommandBuilder이 때문에 용액은 직접 정의 위해 OleDbDataAdapter의에 InsertCommand이고, 괄호로 이름을 둘러싸는 않는다 :

adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO {0} ([GUID], [fieldName]) Values (@guid,@fieldName);", table), conn); 

정의 각 열의 파라미터와 수동으로 파라미터의 값을 추가하는 단계;

adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["GUID"])); 

그래서 "GUID"라는 이름의 열이있는 테이블의 경우, 합산, 다음과 같은 것을 시도해야한다 : DataSetDesigner 및 형식화 된 데이터 집합을 사용하는 것입니다 시작

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + 
"Data Souce=" + source);       
conn.Open(); 

OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * From " + table, conn); 
OleDbCommandBuilder cmdBuilder = new OleDbCommandBuilder(adapter); 

adapter.InsertCommand = new OleDbCommand(String.Format("INSERT INTO {0} ([GUID], [fieldName]) Values (@guid,@fieldName);", table), conn); 

DataTable dataTable = new DataTable(table); 
adapter.Fill(dataTable); 
DataRow row = dataTable.NewRow(); 
row [ fieldName ] = fieldValue; 
// eg: row [ "GUID" ] = System.Guid.NewGuid().ToString(); // Do this for all attributes/fields. 
dataTable.Rows.Add(row); 

adapter.InsertCommand.Parameters.Add(new OleDbParameter("@fieldName",row[fieldName])); 
// eg: adapter.InsertCommand.Parameters.Add(new OleDbParameter("@guid",row["GUID"])); 

adapter.Update(dataTable); 
+0

데이터 세트를 계속 사용해야한다는 점을 제외하면이 방법이 성공했습니다. 그렇지 않으면'adapter.Fill'에서 예외를 던질 것입니다. 예외는'System.ArgumentException''{ "Object는 ADODB.RecordSet 또는 ADODB.Record가 아닙니다. \ r \ n 매개 변수 이름 : adodb"}'입니다. Matt 감사합니다. – SaulBack

+0

고마워, 내 첫 번째 답변 그래서, 나는 당신을 위해 일한 것을 기쁘게 생각합니다! – Matt

+0

'OleDbCommandBuilder'를 사용한다면'cmdBuilder.QuotePrefix = "[";'and'cmdBuilder.QuoteSuffix = "]";'를 사용할 수 있습니다. –

0

문제 1. 컬럼 이름, 즉 table.columnName의 완전한 자격을 시험해보십시오. (MySQL의 문제를 Access에서 해결할 수도 있습니다) 또한 컬럼 이름 주위에 []를 넣으십시오.

Select *는 일반적으로 열 이름을 지정하고 별칭을 사용하는 데 좋지 않은 옵션입니다. 예를 들어 Column1을 'Column1', Column2를 'Column2'...로 선택하십시오. 이렇게하면 열 인덱스 대신 별칭을 사용하여 열에 액세스 할 수 있으므로 데이터 집합과 데이터 테이블 작업이 훨씬 쉬워집니다.

DataAdapter는 실제 데이터베이스를 수정하는 것보다 데이터 집합을 채우기에 훨씬 더 유용하다는 것을 알게되었습니다. 나는 다음과 같이 추천한다 :

string updateQuery = "Update ..... Where ...."; //do your magic here 
OldDbcommand command = new OleDbCommand(updateQuery); 
command.Connection = conn; 
conn.Open(); 
con.ExecuteNonQuery(); 
conn.Close(); 

데이터 세트를 어댑터로 채운 다음 DB에서 업데이트 명령을 실행하기 만하면된다.

0

좋은 장소 을 시작하는 것은이 통해 걸어보십시오 : SQL의 엔티티 프레임 워크, Linq에 또는 아직도 DataSetDesigner 및 T를 계속 사용 : http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

좋은 장기적인 접근 방식 대신는 SQL Server Express를 사용하는 것입니다, 당신은 사용의 선택을해야합니다 yped 데이터 셋.

관련 문제