c# - para - ¿Qué pasa con estos parámetros?
oledb para access 2013 (3)
OleDb no admite parámetros con nombre, por lo que la respuesta de Dreas es correcta.
Cuando utiliza OleDb, debe agregar los parámetros en el mismo orden en que aparecen en la consulta, ya que no se utilizan los nombres que usted les da.
Tengo un archivo de acceso con 7 campos:
DocID - text - primary
SourceID - text
ReceivedDay - Date/Time
Summary - text
DueDay - Date/Time
Person - text
Status - Yes/No
Ahora quiero actualizar este archivo con el siguiente código:
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();
Pero tengo una excepción:
Data type mismatch in criteria expression.
¿Cómo puedo arreglar esto?
EDITAR: Lo arreglé, usando un enfoque diferente:
Construí una consulta como esa:
INSERT INTO Docs
(DocID, SourceID, ReceivedDay, Summary, Person, DueDay, Status)
VALUES (?, ?, ?, ?, ?, ?, ?)
y luego usé un TableAdapter para llamarlo:
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);
Mucho más simple, y funciona bien ahora. Gracias a todos
El problema se debe a que los parámetros no están en el mismo orden cuando los está agregando.
Por ejemplo, en su línea comentada ( //adapter.InsertQuery...
), tiene DocID
y luego RecievedDay
... pero cuando los está agregando, primero agrega DocID
y luego agrega SourceID
.
Asegúrese de que estén en el mismo orden ... y esto se aplica tanto a las sentencias sql como a los procedimientos almacenados.
Esto se debe a que ADO.NET no admite parámetros con nombre cuando se utiliza un proveedor OLEDB, y como se está conectando a un Access DB, de hecho está utilizando un proveedor OLEDB ... por lo que el orden de los parámetros sí importa.
Si están en orden y aún no funciona, entonces creo que podría ser un problema con DateTime
s;
Intente convertirlo en cadena antes de agregarlo como parámetro:
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString());
cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString());
Y también asegúrese de que el formato de la fecha esté en formato de EE. UU. ( m/d/yyyy
) o en formato ISO ( yyyy-mm-dd
)
Simplemente pregúntale a Google , creo que más de 10000 visitas es bastante impresionante. Su argumento "No creo que ..." no es válido hasta que lo haya probado.
Esto es lo que dice MSDN :
El proveedor OLE DB.NET no admite parámetros con nombre para pasar parámetros a una instrucción SQL o un procedimiento almacenado llamado por un
OleDbCommand
cuando CommandType está establecido en Texto. En este caso, se debe usar el marcador de posición de interrogación (?
). Por ejemplo:
SELECT * FROM Customers WHERE CustomerID = ?
Por lo tanto, el orden en el que se
OleDbParameter
objetosOleDbParameter
aOleDbParameterCollection
debe corresponder directamente con la posición del marcador de posición del signo de interrogación para el parámetro en el texto del comando.