sirve que para example addwithvalue c# sql parameters oledb sqlparameters

c# - que - Devuelve el valor de OleDbCommand



sqlcommand parameters c# (4)

ExecuteNonQuery no devuelve datos, solo las filas afectadas por su comando
Necesita usar ExecuteReader con un OleDbDataReader

OleDbDataReader reader = cmd.ExecuteReader(); if(reader.HasRows) { reader.Read(); var result = reader.GetInt32(0); }

sqlQuery = "SELECT [ID] from [users] WHERE CallerName=@CallerName"; OleDbConnection conn = new OleDbConnection(connectionString); conn.Open(); cmd = new OleDbCommand(sqlQuery, conn); cmd.CommandText = sqlQuery; cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim(); cmd.Parameters["@CallerName"].Value = name; cmd.ExecuteNonQuery(); conn.Close();

Me dijeron que esta es la forma de leer datos de una consulta SELECT utilizando Parámetros, pero no está funcionando. Creo que hice algo mal.

Estoy usando WinForms y Microsoft Access 2007


Si una consulta devuelve un valor, puede usar ExecuteScalar para recuperar el valor. ExecuteNonQuery no devuelve un valor de su base de datos; más bien, está destinado para su uso con instrucciones UPDATE y similares, y devuelve el número de filas afectadas por la declaración.

Probablemente sepa esto, pero en general, las consultas SELECT pueden devolver más de una fila (y más de una columna), por lo que para "leer datos de una consulta SELECT", utiliza ExecuteReader para obtener un DbDataReader .


Para leer datos y cargarlos en DataTable:

OleDataReader rdr = (OleDataReader) cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(rdr);

Para leer los datos de Scalor Value y cargarlos en una variable:

int result = (int)cmd.ExecuteScalar(); //Assume scalar value to be return is int

Espero que ayude


Parece que tienes tu respuesta, pero quería señalar algunas cosas de tu código de ejemplo:

sqlQuery = "SELECT [ID] from [users] WHERE CallerName=@CallerName"; OleDbConnection conn = new OleDbConnection(connectionString); conn.Open(); cmd = new OleDbCommand(sqlQuery, conn); cmd.CommandText = sqlQuery; cmd.Parameters.Add("@CallerName", OleDbType.VarChar).Value = labelProblemDate.Text.Trim(); cmd.Parameters["@CallerName"].Value = name; cmd.ExecuteNonQuery(); conn.Close();

En primer lugar, tenga en cuenta que su consulta SQL está utilizando la sintaxis de Microsoft SQL y que Microsoft Access prefiere una sintaxis ligeramente diferente. En lugar de envolver los nombres de sus columnas entre corchetes, use la marca tilde:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=@CallerName";

A continuación, en su consulta SQL, tenga en cuenta que Microsoft Access no acepta parámetros con nombre. Su texto SQL de arriba usando @CallerName se ejecutará sin problemas, pero todo el objeto OleDb verá es el siguiente:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?";

Si, en algún momento posterior, decide ir con Procedimientos almacenados en lugar de SQL de texto, recuerde llamar a Prepare () en su OleDbCommand después de agregar los parámetros y antes de ejecutar el comando.

Si tiene varios parámetros, asegúrese de agregar estos parámetros a su OleDbCommand en el mismo orden en que los llamó en su texto SQL. A OleDb no le importa cómo los nombre, pero puede usarlos para usted, para ayudarlo; NO se usa en la consulta. @CallerName no intentará hacer coincidir nada con su texto SQL.

Luego, quería ver su uso del elemento OleDbParameter . En las dos líneas a continuación, está agregando un (1) parámetro a su OleDbCommand con el valor labelProblemDate.Text.Trim () y en la siguiente línea está reasignando el valor de ese mismo parámetro a una variable (que es desconocida para nosotros) llamado name . No es bueno para usted declarar el parámetro con un valor y luego reasignarlo a otra cosa.

Podría haber utilizado el fragmento modificado a continuación y obtener los mismos resultados (recuerde agregar el campo de tamaño, como se muestra a continuación y se especifica en su base de datos):

cmd.Parameters.Add("@CallerName", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim(); // cmd.Parameters["@CallerName"].Value = name;

Del mismo modo, su OleDbCommand se está creando con su parámetro sqlQuery , por lo que no es necesario especificar la propiedad CommandText su comando:

cmd = new OleDbCommand(sqlQuery, conn); //cmd.CommandText = sqlQuery;

Finalmente, como han dicho otros, si desea consultar sus datos como sugiere su declaración de SQL, debe leer los datos en lugar de llamar a ExecuteNonQuery() (observe que se llama No Query ).

Para resumir, lo he escrito aquí:

sqlQuery = "SELECT `ID` from `users` WHERE `CallerName`=?"; int result = 0; OleDbConnection conn = new OleDbConnection(connectionString); try { conn.Open(); var cmd = new OleDbCommand(sqlQuery, conn); //cmd.CommandText = sqlQuery; This command was specified by your initializer cmd.Parameters.Add("?", OleDbType.VarChar, 255).Value = labelProblemDate.Text.Trim(); //cmd.Parameters["@CallerName"].Value = name; Possible bug here using (OleDbDataReader reader = cmd.ExecuteReader()) { if(reader.HasRows) { reader.Read(); result = reader.GetInt32(0); } } } finally { conn.Close(); } return result;

Siempre ponga el cierre en un bloque finally en caso de que su programa arroje un error por cualquier motivo. Esto evita que su aplicación se bloquee y deje el archivo abierto. Una cláusula de using , he descubierto, no necesariamente cierra una conexión cuando está hecha (como se supone que deben hacer).

Espero que esto ayude. Estoy refrescando mi conocimiento de OleDb en este momento, y quería señalar algunas cosas.