2011-05-03 48 views
6

Tôi đang cố cập nhật cơ sở dữ liệu truy cập ms đơn giản. Tôi nhận được Ngoại lệ trên một số bảng nhất định, sau khi tìm kiếm, tôi đã tìm thấy Microsoft Support - Syntax Error. Tôi tin rằng nó có nghĩa là một trong những tên cột sử dụng một từ dành riêng. Điều này có vẻ là trường hợp, vì tất cả các bảng cập nhật ngoại trừ những người có "GUID" là một trong những tên cột, một từ dành riêng. Trang này cũng nói rằng tôi nên sử dụng OleDbAdapter và DataSet, điều này sẽ giải quyết được vấn đề. Rất tiếc, tôi không thể thay đổi tên của cột. Đó là ngoài tầm kiểm soát của tôi, vì vậy tôi phải làm việc với những gì được cho tôi.Sử dụng OleDbDataAdapter và Số liệu để cập nhật Access.mdb

Tôi không phải làm việc với cơ sở dữ liệu nhiều, và mọi thứ tôi biết tôi đã học được từ các ví dụ từ internet (có lẽ là những điều xấu ở đó). Vậy cách thích hợp để cập nhật cơ sở dữ liệu bằng OleDbAdapter và dataSet là gì?

Tôi không nghĩ mình nên sử dụng DataTable hoặc OleDbCommandBuilder, và tôi tin rằng giải pháp có liên quan đến các tham số. Nhưng kỹ năng googleing của tôi yếu.

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 

Trả lời

4

Sự cố có thể là tên cột (đặc biệt là tên cột được đặt trước) nên được bao quanh bởi dấu ngoặc vuông. Các OleDbCommandBuilder, khi nó tạo ra InsertCommand của riêng mình, không bao quanh tên với dấu ngoặc, do đó, một giải pháp là để tự xác định InsertCommand của OleDbDataAdapter:

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

Xác định các thông số cho mỗi cột và sau đó tự thêm các giá trị của tham số;

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

Vì vậy, tổng hợp, đối với các bảng trong đó có một cột có tên là "GUID", bạn nên thử một cái gì đó như sau:

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

Điều này đã thực hiện thủ thuật, trừ khi tôi vẫn phải sử dụng Số liệu. Nếu không nó sẽ ném một ngoại lệ tại 'adapter.Fill'. Ngoại lệ là đối tượng 'System.ArgumentException'' {"không phải là ADODB.RecordSet hoặc ADODB.Record. \ R \ nParameter name: adodb"} '. Cảm ơn Matt. – SaulBack

+0

Cảm ơn, đó là câu trả lời đầu tiên của tôi về SO, vì vậy tôi rất vui vì nó đã làm việc cho bạn! – Matt

+0

Nếu bạn đang sử dụng 'OleDbCommandBuilder', bạn có thể sử dụng' cmdBuilder.QuotePrefix = "["; 'và' cmdBuilder.QuoteSuffix = "]"; '. –

0

Về vấn đề # 1. Hãy thử làm một tiêu chuẩn đầy đủ của tên cột tức là table.columnName (có thể khắc phục vấn đề trong MySQL vì vậy có thể nó cũng có trong Access), hãy thử đặt [] xung quanh tên cột.

Chọn * thường là tùy chọn không tốt để chỉ định tên cột và sử dụng bí danh. Ví dụ sử dụng Chọn Column1 là 'Column1', Column2 là 'Column2' .... điều này làm cho tập dữ liệu của bạn và dữ liệu dễ dàng hơn nhiều khi bạn có thể truy cập cột bằng bí danh thay vì theo chỉ mục cột.

Tôi thấy rằng DataAdapter hữu ích hơn nhiều khi làm đầy bộ dữ liệu hơn là thực sự sửa đổi cơ sở dữ liệu. Tôi khuyên bạn nên sử dụng một cái gì đó như:

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

Bạn có thể điền số liệu của mình bằng bộ điều hợp và thực hiện như đã thực hiện các lệnh cập nhật trên DB.

0

Một nơi tốt để bắt đầu sẽ được sử dụng DataSetDesigner và DataSets Typed để bắt đầu , hãy thử bước này qua: http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

Cách tiếp cận lâu dài tốt là sử dụng Sql Server Express thay vào đó, bạn sẽ có lựa chọn sử dụng: Entity Framework, LINQ to Sql hoặc vẫn tiếp tục sử dụng DataSetDesigner và T yped DataSets.

Các vấn đề liên quan