2011-05-03 56 views
6

我正在嘗試更新一個簡單的ms訪問數據庫。我在某些表格上遇到例外情況,經過搜索,我發現Microsoft Support - Syntax Error。我相信這意味着其中一個列名使用保留字。這似乎是這種情況,因爲除了那些以「GUID」作爲列名之一的保留字外,所有的表都更新。此頁面還聲明我應該使用OleDbAdapter和DataSet,它應該可以解決問題。很遺憾,我無法更改該列的名稱。這超出了我的控制範圍,所以我必須處理給我的東西。使用OleDbDataAdapter和DataSet來更新Access.mdb

我沒有必要用數據庫做很多工作,並且我從互聯網上的例子中學到的所有知識(可能都是壞的)。那麼使用OleDbAdapter和dataSet更新數據庫的正確方法是什麼?

我不認爲我應該使用DataTable或OleDbCommandBuilder,我相信該解決方案與參數有關。但我的谷歌技術很薄弱。

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

問題可能是列名(特別是名稱爲保留字的那些)應該用方括號包圍。該OleDbCommandBuilder,當它會創建自己的InsertCommand,不會用方括號括名稱,所以解決方案是手動定義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」列的表,你應該嘗試類似以下內容:

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'異常'''「對象不是ADODB.RecordSet或ADODB.Record。\ r \ n參數名稱:adodb」}「。謝謝馬特。 – SaulBack 2011-05-04 18:38:39

+0

謝謝,這是我的第一個回答,所以我很高興它爲你工作! – Matt 2011-05-04 19:19:12

+0

如果您使用'OleDbCommandBuilder',則可以使用'cmdBuilder.QuotePrefix =「[」;'和'cmdBuilder.QuoteSuffix =「]」;'。 – 2017-10-11 18:52:17

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

一個良好的開端將使用DataSetDesigner和類型化的DataSet開始 試試這個穿行:http://msdn.microsoft.com/en-us/library/ms171893(v=vs.80).aspx

一個很好的長期辦法是使用SQL Server Express,而不是,那麼你就必須使用一個選擇:實體框架,LINQ to SQL的或仍繼續使用DataSetDesigner和T yped DataSet。