[Error 1] SqlServer genera un error: se deben declarar variables escalares OleDbException
Hoy en día, uso .net para operar SqlServer usando Oledb, pero siempre informa "Se debe declarar una variable escalar ..." de manera inexplicable. He adoptado los dos métodos siguientes en el código, pero fue en vano:
Método 1: OleDbParameter[] p = nuevo OleDbParameter[] {
nuevo OleDbParameter("@aa",1),
nuevo OleDbParameter("@bb","shelley"),
nuevo OleDbParameter("@cc",DateTime.Now)
};
Objcmd.Parameters.AddRange(p);
Método 2: OleDbParameter pp;
pp = nuevo OleDbParameter("@aa",OleDbType.Integer);
pp.Valor = 1;
Objcmd.Parameters.Add(pp);
pp = nuevo OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "shelley";
Objcmd.Parameters.Add(pp);
pp = nuevo OleDbParameter("@cc", OleDbType.Date);
pp.Value = FechaHora.Ahora;
Objcmd.Parameters.Add(pp); No importa cómo lo escriba, aparecerá el mensaje "Se debe declarar la variable escalar @aa". El motivo final es la siguiente oración: OleDbCommand Objcmd = new OleDbCommand("insertar en prueba (a, b,c) valores(@aa,@bb,@cc)", Objconn);Escritura correcta: OleDbCommand Objcmd = new OleDbCommand("insertar en prueba (a,b,c)valores(?,?,?)", Objconn); De esta manera pasó normalmente. [Error 2] Sybase genera un error: esta interfaz no es compatible (la excepción proviene de HRESULT:0x80004002 (E_NOINTERFACE)).net usa Oledb para operar Sybase porque el mismo parámetro se puede usar varias veces en una declaración SQL. El código es. como sigue:
OleDbCommand Objcmd = new OleDbCommand("actualizar conjunto de pruebas a=@aa donde a=@aa ", Objconn);
OleDbParameter[] p = nuevo OleDbParameter[] {
nuevo OleDbParameter("aa",1),
nuevo OleDbParameter("aa",1)
};
Objcmd.Parameters.AddRange(p);
Objconn.Open();
Objcmd.ExecuteNonQuery();
Objconn.Close(); El código anterior generará el error "Esta interfaz no es compatible (la excepción proviene de HRESULT: 0x80004002 (E_NOINTERFACE))". La causa del problema es que hay dos nombres idénticos en los parámetros. En este caso, solo necesita escribir un parámetro. Los cambios son los siguientes:
OleDbCommand Objcmd = new OleDbCommand("actualizar conjunto de pruebas a=@aa donde a=@aa ", Objconn);
OleDbParameter[] p = nuevo OleDbParameter[] {
nuevo OleDbParameter("aa",1)
};o
OleDbCommand Objcmd = new OleDbCommand("actualizar conjunto de pruebas a=@aa donde a=@aa2 ", Objconn);
OleDbParameter[] p = nuevo OleDbParameter[] {
nuevo OleDbParameter("aa",1),
nuevo OleDbParameter("aa2",1)
};【Resumir】
Si escribe un programa que necesita ser compatible con SqlServer y Sybase, debe prestar especial atención a este punto:
1.SqlServer necesita usar "?" como marcador de posición de parámetro, lo que requiere que incluso si se usa el mismo parámetro, el parámetro debe agregarse varias veces;
2. Si Sybase usa el mismo parámetro varias veces, el parámetro no se puede agregar varias veces; de lo contrario, se informará un error;
http://www.cnblogs.com/shelley/archive/2010/05/25/1743438.html