2009-08-01 95 views
2

我有7場Access文件:這些參數有什麼問題?

DocID - text - primary 
SourceID - text 
ReceivedDay - Date/Time 
Summary - text 
DueDay - Date/Time 
Person - text 
Status - Yes/No 

現在我想更新用下面的代碼文件:

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\DocMan.mdb;Persist Security Info=True"; 
const string InsertQuery = "INSERT Into Docs(DocID,ReceivedDay,Summary,Person,DueDay,Status,SourceID) Values(@DocID,@ReceivedDay,@Summary,@Person,@DueDay,@Status,@SourceID)"; 

string DocID = textBox1.Text; 
string SourceID = comboBox1.SelectedIndex.ToString(); 
DateTime ReceivedDay = dateTimePicker1.Value; 
string Summary = richTextBox1.Text; 
string Person = textBox2.Text; 
DateTime DueDay = dateTimePicker2.Value; 
bool Status = false; 

OleDbConnection cnn = new OleDbConnection(ConnectionString); 
cnn.Open(); 
OleDbCommand cmd = new OleDbCommand(InsertQuery, cnn); 
cmd.Parameters.AddWithValue("@DocID", DocID); 
cmd.Parameters.AddWithValue("@SourceID", SourceID); 
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay); 
cmd.Parameters.AddWithValue("@Summary", Summary); 
cmd.Parameters.AddWithValue("@Person", Person); 
cmd.Parameters.AddWithValue("@DueDay", DueDay); 
cmd.Parameters.AddWithValue("@Status", Status); 
cmd.ExecuteNonQuery(); 
cnn.Close(); 

但我得到一個異常:

Data type mismatch in criteria expression. 

我怎樣才能解決這個問題?

編輯:我解決了這個問題,採用了不同的方法:

我建一個這樣的查詢:

INSERT INTO Docs 
    (DocID, SourceID, ReceivedDay, Summary, Person, DueDay, Status) 
VALUES (?, ?, ?, ?, ?, ?, ?) 

,然後用一個TableAdapter叫它:

string DocID = textBox1.Text; 

string SourceID = comboBox1.SelectedIndex.ToString(); 
DateTime ReceivedDay = dateTimePicker1.Value.Date; 
string Summary = richTextBox1.Text; 
string Person = textBox2.Text; 
DateTime DueDay = dateTimePicker2.Value.Date; 
bool Status = false; 

DocManDataSetTableAdapters.DocsTableAdapter docsTableAdapter = new DocManDataSetTableAdapters.DocsTableAdapter(); 
docsTableAdapter.InsertQuery(DocID,SourceID,ReceivedDay,Summary,Person,DueDay,false); 

很多更簡單,現在它工作正常。謝謝大家

+0

您能否顯示InsertQuery的文本? – 2009-08-01 10:08:01

+0

我加了,:)! – Vimvq1987 2009-08-01 10:12:45

+0

任何列都有限制嗎? – 2009-08-01 10:18:52

回答

6

問題是因爲參數在添加它們時與的順序不同。

例如,在你的註釋行(//adapter.InsertQuery...),你有DocID然後RecievedDay ......然而,當你添加它們,你先添加DocID然後添加SourceID

確保它們的順序相同......這適用於sql語句或存儲過程。

這是因爲在使用OLEDB提供程序時,ADO.NET不支持命名參數,並且由於您正在連接到Access數據庫,因此您實際上使用了OLEDB提供程序...因此參數的順序很重要。


如果他們是爲了和它仍然沒有工作,那麼我認爲,這可能是與DateTime秒的問題;
嘗試將其轉換爲字符串添加它作爲一個參數之前:

cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString()); 
cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString()); 

而且還確保日期的格式爲美國格式(m/d/yyyy)或ISO格式(yyyy-mm-dd

1

OleDb的呢不支持命名參數,所以Dreas的答案是正確的。

當您使用OleDb時,您必須以與查詢中顯示的順序相同的順序添加參數,因爲不會使用您提供的名稱。

9

只需ask google,我估計10000多次點擊相當令人印象深刻。你的論點「我不認爲......」直到你證明它是無效的。

這是MSDN說:

的OLE DB。當將CommandType設置爲Text時,NET Provider不支持將參數傳遞給SQL語句或由OleDbCommand調用的存儲過程的命名參數。在這種情況下,必須使用問號(?)佔位符。例如:

SELECT * FROM Customers WHERE 
CustomerID = ? 

因此,在這種OleDbParameter對象添加到OleDbParameterCollection的順序必須直接對應於問號佔位符在命令文本的參數的位置。