2011-05-03 17 views
6

Próbuję zaktualizować prostą bazę danych dostępu MS. Dostaję wyjątek na niektórych tabelach, które po wyszukaniu znalazłem Microsoft Support - Syntax Error. Sądzę, że oznacza to, że jedna z nazw kolumn używa zarezerwowanego słowa. Wydaje się, że tak jest, ponieważ wszystkie tabele są aktualizowane, z wyjątkiem tych o identyfikatorze "GUID" jako jednej z nazw kolumn, słowem zastrzeżonym. Ta strona mówi również, że powinienem używać OleDbAdapter i DataSet, które powinny rozwiązać problem. Niestety nie mogę zmienić nazwy kolumny. To jest poza moją kontrolą, więc muszę pracować z tym, co jest mi dane.Używanie OleDbDataAdapter i DataSet do aktualizacji Access.mdb

Nie musiałem dużo pracować z bazami danych, a wszystko, co wiem, nauczyłem się na przykładach z Internetu (prawdopodobnie złe). Jaki jest więc właściwy sposób aktualizacji bazy danych za pomocą OleDbAdapter i DataSet?

Nie sądzę, że powinienem używać DataTable lub OleDbCommandBuilder i uważam, że rozwiązanie ma coś wspólnego z parametrami. Ale moje umiejętności googleingowe są słabe.

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 

Odpowiedz

4

Problem może być taki, że nazwy kolumn (szczególnie te, których nazwa jest słowem zastrzeżonym) powinny być otoczone nawiasami kwadratowymi. OleDbCommandBuilder, gdy tworzy własny InsertCommand, nie otaczają nazwy z nawiasami, a więc rozwiązaniem jest ręcznie zdefiniować OleDbDataAdapter za InsertCommand:

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

Definiowanie parametrów dla każdej kolumny, a następnie ręcznie dodanie wartości parametru;

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

Więc podsumowując, na tablicach, które mają kolumnę o nazwie „GUID”, należy spróbować coś jak następuje:

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

Zrobiłem to, ale musiałem nadal używać DataSet. W przeciwnym razie wygenerowałby wyjątek w 'adapter.Fill'. Wyjątkiem był 'System.ArgumentException'' {"Obiekt nie jest obiektem ADODB.RecordSet ani ADODB.Record. \ R \ nIdentyfikacja parametru: adodb"} '. Dzięki Matt. – SaulBack

+0

Dzięki, to była moja pierwsza odpowiedź na SO, więc cieszę się, że udało się to dla ciebie! – Matt

+0

Jeśli używasz 'OleDbCommandBuilder', możesz użyć' cmdBuilder.QuotePrefix = "["; 'i' cmdBuilder.QuoteSuffix = "]"; '. –

0

Co do problemu nr 1. Spróbuj wykonać pełną kwalifikację nazwy kolumny, np. Table.columnName (która rozwiązuje problem w MySQL, więc może robi to również w Access), i spróbuj umieścić [] wokół nazwy kolumny.

Opcja * jest zwykle kiepską opcją określania nazw kolumn i używania aliasów. Na przykład użyj opcji Wybierz kolumnę1 jako "Kolumna1", Kolumna2 jako "Kolumna2" ... , co znacznie ułatwia pracę z zestawem danych i datatablem, ponieważ dostęp do kolumny można uzyskać za pomocą aliasu zamiast indeksów kolumn.

Uważam, że DataAdapter jest o wiele bardziej przydatny do wypełniania zbiorów danych niż do faktycznej modyfikacji bazy danych. Polecam coś takiego:

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

Można wypełnić swój zestaw danych z adaptera, a następnie zrobić jak ja po prostu nie do wykonania poleceń twój zmiana na DB.

0

Dobrym miejscem na rozpoczęcie będzie za pomocą DataSetDesigner i wpisałem DataSetów aby rozpocząć spróbować przejść przez: http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

dobrym podejściem długoterminowym jest użycie SQL Server Express zamiast, wtedy będziesz miał do wyboru: przy użyciu Entity Framework, LINQ do SQL lub nadal zachować używając DataSetDesigner i T yed DataSets.

Powiązane problemy