2009-08-01 7 views
2

Ich habe eine Access-Datei mit 7 Feldern:Was stimmt nicht mit diesen Parametern?

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

Jetzt möchte ich diese Datei mit dem folgenden Code aktualisieren:

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(); 

Aber ich erhalte eine Ausnahme:

Data type mismatch in criteria expression. 

Wie kann ich das beheben?

EDIT: Ich reparierte diese, einen anderen Ansatz:

ich eine Abfrage wie die gebaut:

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

und verwendet dann eine Table es zu nennen:

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); 

Much einfacher, und es funktioniert jetzt gut. Vielen Dank alle

+0

Könnten Sie bitte den Text von InsertQuery zeigen? –

+0

Ich habe es hinzugefügt, :)! – Vimvq1987

+0

Gibt es Einschränkungen für eine der Spalten? –

Antwort

6

Das Problem liegt daran, dass die Parameter nicht in der gleichen Reihenfolge sind, wenn Sie sie hinzufügen.

Zum Beispiel in Ihrer Kommentarzeile (//adapter.InsertQuery...), haben Sie DocID und dann RecievedDay ... doch wenn Sie sie hinzufügen, Sie zuerst DocID hinzufügen und dann SourceID hinzufügen.

Stellen Sie sicher, dass sie in der gleichen Reihenfolge sind ... und dies gilt für SQL-Anweisungen oder gespeicherten Prozeduren.

Dies ist, weil ADO.NET benannte Parameter nicht unterstützt, wenn Sie einen OLEDB-Provider verwenden, und da Sie eine Verbindung zu einem Access DB herstellen, verwenden Sie eigentlich einen OLEDB-Provider ... also spielt die Reihenfolge der Parameter eine Rolle.


Wenn sie in Ordnung sind, und es funktioniert immer noch nicht, dann denke ich, dass es ein Problem sein könnte mit dem DateTime s;
Versuchen Sie es zu String konvertieren, bevor es als Parameter hinzu:

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

Und auch sicher, dass das Format des Datums ist in US-Format (m/d/yyyy) oder ISO-Format (yyyy-mm-dd)

+0

@Dreas: DocID und SourceID sind String, ich glaube nicht, sie zu Integer zu analysieren ist notwendig! – Vimvq1987

1

OleDb tut benannte Parameter nicht unterstützen, so ist die Antwort von Dreas korrekt.

Wenn Sie OleDb verwenden, müssen Sie die Parameter in derselben Reihenfolge hinzufügen, wie sie in der Abfrage angezeigt werden, da die Namen, die Sie ihnen geben, nicht verwendet werden.

+0

Warum gibt es eine 'AddWithValue' Methode, wenn sie nicht funktioniert? – Coops

9

Einfach ask google, ich denke mehr als 10000 Treffer ist ziemlich beeindruckend. Ihr Argument "Ich denke nicht, dass ..." ist nicht gültig, bis Sie es bewiesen haben.

Dies ist, was MSDN sagt:

Der OLE DB.NET Provider unterstützt keine benannten Parameter für die Übergabe von Parametern an eine SQL-Anweisung oder eine gespeicherte Prozedur, die von OleDbCommand aufgerufen wird, wenn CommandType auf Text festgelegt ist. In diesem Fall muss der Platzhalter für das Fragezeichen (?) verwendet werden. Zum Beispiel:

SELECT * FROM Customers WHERE 
CustomerID = ? 

daher bei dem die Reihenfolge OleDbParameter Objekte der OleDbParameterCollection hinzugefügt werden muss direkt an die Position des Fragezeichen Platzhalter für den Parameter in dem Befehlstext entspricht.

+0

Ich habe das gelöst. Vielen Dank! – Vimvq1987

+0

+1 Nun, das erklärt es. –

Verwandte Themen