C#. NET, problemas con la base de datos
Existen cuatro tipos de clases de conexión: SqlConnection, OleDbConnection, OdbcConnection y OracleConnection.
Los objetos de la clase SqlConnection están conectados a la base de datos de SQL Server; los objetos de la clase OracleConnection están conectados a la base de datos de Oracle.
Los objetos de la clase OleDbConnection están conectados a bases de datos que admiten; OLE DB, como Access; clase OdbcConnection El objeto se conecta a cualquier base de datos habilitada para ODBC. Toda la comunicación con la base de datos se realiza en última instancia a través del objeto de conexión.
Clase SqlConnection
Las conexiones se utilizan para "hablar" con la base de datos y están representadas por una clase específica del proveedor, como SqlConnection. Aunque la clase SqlConnection es específica de Sql Server, muchas de las propiedades y métodos de esta clase son similares a los de eventos y clases como OleDbConnection y OdbcConnection. Este capítulo se centrará en las propiedades y métodos específicos de SqlConnection. Para otras clases de conexión, puede consultar los documentos de ayuda correspondientes.
Nota: El uso de diferentes objetos de conexión requiere importar diferentes espacios de nombres. El espacio de nombres de OleDbConnection es System. El espacio de nombres de SqlConnection es System. El espacio de nombres de OdbcConnection es System. El espacio de nombres de OracleConnection es System. OracleClinet
Propiedad SqlConnection:
Descripción de la propiedad
La cadena de conexión cuyo tipo de retorno es cadena obtiene o establece la cadena utilizada para abrir la base de datos de SQL Server.
El tipo de retorno de ConnectionTimeOut es int, que obtiene el tiempo de espera antes de finalizar el intento y generar un error al intentar establecer una conexión.
La base de datos, cuyo tipo de retorno es cadena, obtiene el nombre de la base de datos actual o de la base de datos que se utilizará después de abrir la conexión.
El tipo de retorno de DataSource es cadena, que obtiene el nombre de la instancia de SQL Server a conectar.
State, cuyo tipo de retorno es ConnectionState, obtiene el estado actual de la conexión: desconectada, cerrada, conectando, obteniendo o abierta.
El tipo de retorno de ServerVersion es cadena, que obtiene una cadena que contiene la versión de la instancia de SQL Server a la que está conectado el cliente.
PacketSize obtiene el tamaño, en bytes, de los paquetes de red utilizados para comunicarse con la instancia de SQL Server. Esta propiedad solo se aplica al tipo SqlConnection.
Método SqlConnection:
Descripción del método
Close(), cuyo tipo de retorno es void, cierra la conexión con la base de datos.
El tipo de retorno de CreateCommand() es SqlCommand, que crea y devuelve un objeto SqlCommand asociado con SqlConnection.
Open(), cuyo tipo de retorno es nulo, abre una conexión de base de datos utilizando las propiedades especificadas por el atributo de cadena de conexión.
Evento SqlConnection:
Descripción del evento
StateChange ocurre cuando cambia el estado del evento. (Heredado de DbConnection.
)
InfoMessage ocurre cuando SQL Server devuelve un mensaje informativo o de advertencia.
Consejo: Puedes utilizar eventos para permitir que un objeto notifique a otro objeto sobre algo de alguna manera. Por ejemplo, cuando seleccionamos el menú "Inicio" en un sistema Windows, una vez que se hace clic con el mouse, se producirá un evento para notificar al sistema operativo que muestre el menú "Inicio".
Utilice el objeto SqlConnection para conectarse a la base de datos de SQL Server
Podemos utilizar el constructor SqlConnection() para generar un nuevo objeto SqlConnection. Esta función está sobrecargada, lo que significa que podemos llamar a diferentes versiones del constructor. La siguiente tabla muestra el constructor de SqlConnection():
Descripción del constructor
SqlConnection() inicializa una nueva instancia de la clase SqlConnection.
Si se proporciona una cadena que contiene la cadena de conexión, SqlConnection (String) inicializará una nueva instancia de la clase SqlConnection.
Supongamos que importamos el sistema. Espacio de nombres Data.SqlClient, podemos usar la siguiente declaración para generar un nuevo objeto SqlConnection:
Conexión MySQL SqlConnection = nueva conexión SQL();
Descripción del código del programa: en la sintaxis anterior ejemplo En el código del programa, generamos un nuevo objeto SqlConnection usando la palabra clave "nueva" y lo llamamos mySqlConnection.
Ahora podemos conectarnos a la base de datos usando los dos métodos siguientes: usar la autenticación integrada de Windows y usar la autenticación del servidor Sql para iniciar sesión en la base de datos.
Ejemplo de sintaxis de autenticación integrada de Windows
cadena conexiónCadena = "servidor = localhost; base de datos = Northwind
Seguridad integrada = SSPI";
Descripción del código del programa: en el código del programa del ejemplo de sintaxis anterior, configuramos una cadena de conexión para la base de datos del servidor Sql. Servidor representa el nombre de la computadora que ejecuta Sql Server. Debido a que el programa ASP.NET y el sistema de base de datos de este libro están ubicados en la misma computadora, podemos usar localhost en lugar del nombre de la computadora actual. La base de datos representa el nombre de la base de datos utilizada, que está configurada en Sql Server, la base de datos de muestra incluida con Northwind. Como queremos utilizar el método de autenticación integrada de Windows, solo necesitamos configurar la seguridad integrada en SSPI.
El modo de autenticación de Windows en Sql Server 2005 es el siguiente:
Nota: Cuando utilizamos el método de autenticación de Windows integrado, no necesitamos ingresar el nombre de usuario y la contraseña, pero sí ingrese al iniciar sesión en Windows. El nombre de usuario y la contraseña se pasan al servidor Sql. Luego, Sql Server verifica la lista de usuarios para ver si tienen permiso para acceder a la base de datos. Y la cadena de conexión de la base de datos no distingue entre mayúsculas y minúsculas.
Ejemplo de sintaxis para usar la autenticación del servidor Sql
cadena conexiónString = " server = localhost; base de datos = Northwinduid = sapwd = sa ";
Descripción del código del programa: En En el código de programa del ejemplo de sintaxis anterior, el inicio de sesión en la base de datos se realiza mediante autenticación de nombre de usuario y contraseña conocidos. Uid es el nombre de usuario de la base de datos especificada y pwd es la contraseña de usuario especificada. Por razones de seguridad, los nombres de usuario y las contraseñas generalmente no se incluyen en el código. Puede aumentar la seguridad de su programa utilizando el método de autenticación integrado de Windows o cifrando cadenas de conexión en la web. archivo de configuración.
El modo de autenticación de Sql Server en Sql Server 2005 es el siguiente:
Si utiliza otros proveedores de datos, la cadena de conexión generada tiene una forma similar. Por ejemplo, queremos conectarnos a la base de datos Oracle como OLE DB. La cadena de conexión se ve así:
cadena cadena de conexión = "fuente de datos = localhost; directorio inicial = ventas;
use id = sa contraseña = proveedor = MSDAORA ";
Descripción del código del programa: en el código del programa del ejemplo de sintaxis anterior, la conexión a la base de datos se realiza a través del proveedor OLE DB específicamente para la base de datos Oracle. La fuente de datos representa el nombre de la computadora que ejecuta la base de datos Oracle y el directorio inicial representa el nombre de la base de datos utilizada. Proveedor indica que el proveedor OLE DB utilizado es MSDAORA.
La cadena de conexión para la base de datos de Access toma la siguiente forma:
cadena conexiónCadena = " proveedor = Microsoft. Jet. OLEDB.4.0
@ " fuente de datos = c :\ data source \ north wind . MDB ";
Descripción del código del programa: en el código del programa del ejemplo de sintaxis anterior, la conexión a la base de datos se implementa a través del proveedor OLE DB específicamente para la base de datos Access. para esto, el proveedor OLE DB para este propósito es Microsoft Jet.OLEDB.4.0 y la base de datos se almacena en el directorio c:\DataSource y su archivo de base de datos es Northwind.mdb
Ahora podemos pasar la conexión de la base de datos cadena al constructor SqlConnection(), por ejemplo:
string connectString = " server = localhost; base de datos = Northwinduid = sapwd = sa ";
SqlConnection Conexión MySQL = new SqlConnection(connectionString) ;
O escriba
SqlConnection Conexión MySQL = new SqlConnection(
"server=localhost base de datos=Northwinduid=sapwd=sa");
En el ejemplo anterior, se generó un nuevo objeto SqlConnection usando la palabra clave "nueva". Por lo tanto, también podemos establecer la propiedad ConnectionString del objeto y especificarle una cadena de conexión de base de datos. La función del constructor SqlConnection() es. lo mismo.
Conexión SqlConnection MySQL = nueva conexión SQL();
mySqlConnection. ConnectionString = "servidor = localhost; base de datos = Northwinduid = sapwd = sa" ;
Nota: La propiedad ConnectionString solo se puede establecer cuando el objeto Connection está cerrado.
Abre y cierra la conexión de la base de datos.
Después de generar un objeto Connection y configurar su propiedad ConnectionString con los detalles apropiados de la conexión de la base de datos, puede abrir la conexión de la base de datos. Para ello, llame al método Open() del objeto Connection.
El método es el siguiente:
mySqlConnection. open();
Una vez completada la conexión de la base de datos, podemos llamar al método Close() del objeto Connection para cerrar la conexión de la base de datos. Por ejemplo:
mySqlConnection. close();
El siguiente es un programa de muestra que muestra cómo usar el objeto SqlConnection para conectarse a la base de datos del servidor Sql Northwind y muestra algunas propiedades de este objeto SqlConnection.
El código del programa de muestra es el siguiente:
01 clase de parte pública _Predeterminado: System. Interfaz web
02 {
03 Protected void Page_Load(objeto remitente, EventArgs e)
04 {
05 //Establecer base de datos cadena de conexión
06 cadena cadena de conexión = "servidor = localhost; base de datos = Northwind
07 Seguridad integral = SSPI";
08 //Será La cadena de conexión es pasado al constructor del objeto SqlConnection.
09 SqlConnection Conexión MySQL = new SqlConnection(connectionString);
Prueba 10
11 {
12 //Abre la conexión
13 conexión mySql. open();
14 //Utilice el control de etiqueta para mostrar la propiedad ConnectionString del objeto mySqlConnection.
15 lb info . text = " < b > La propiedad ConnectionString del objeto de conexión MySQL es: < b >"+
16 mySqlConnection. ConnectionString+" < br > ";
17 LBL info . text+= " < b > La propiedad ConnectionTimeout del objeto de conexión MySQL es < b >"+
18 mySqlConnection. tiempo de espera de conexión+" < br > ";
19 LBL info . Base de datos+" < br > ";
21 lblinfo . text+= " < b > La propiedad DataSource del objeto de conexión MySQL es < b >"+
22 mySqlConnection. Fuente de datos+" < br > ";
23 LBL info . text+= " < b > La propiedad PacketSize del objeto de conexión MySQL es < b >"+
24 mySqlConnection. tamaño del paquete+" < br > ";
25 LBL info . text+= " < b > La propiedad ServerVersion del objeto de conexión MySQL es < b >"+
26 mySqlConnection. versión del servidor+" < br > ";
27 LBL info . text+= " < b > El estado actual del objeto de conexión MySQL es < b >"+
28 mySqlConnection.
state+" < br > ";
29 }
30 captura (error de excepción)
31 {
32 libras Lin Fu. Text = "Error al leer la base de datos";
33 lblInfo. texto+=error. Mensaje;
34 }
Finalmente 35
36 {
37 //Cerrar la conexión a la base de datos
38 conexión mySql. close();
39 LBL info .text+= " < br > < b > El estado del objeto de conexión MySQL después de cerrar la conexión es: "; . Texto += mySqlConnection. state .ToString();
41 }
42 }
43 }
Descripción del código del programa: el código del programa anterior Por ejemplo, usamos try catch finalmente para manejar las excepciones de conexión de la base de datos. Cuando la base de datos no se puede conectar, se lanza una excepción y se muestra un mensaje de error como se muestra en el bloque de código de captura. En este programa, independientemente de si existe una excepción, la conexión de la base de datos se puede cerrar mediante el bloqueo final, lo que ahorra recursos de la computadora y mejora la eficiencia y escalabilidad del programa.
Resultados de la implementación:
Por supuesto, también podemos utilizar métodos más simples para realizar las funciones del programa anterior. Esto es para incluir el objeto SqlConnection en el bloque de uso, de modo que el programa llame automáticamente al método Dispose () para liberar los recursos del sistema ocupados por el objeto SqlConnection sin usar el método Close () del objeto SqlConnection.
El código del programa de muestra es el siguiente:
01 clase de parte pública _Predeterminado: System. Interfaz web
02 {
03 Page_Load vacío protegido (remitente del objeto, EventArgs e)
04 {
05 cadena cadena de conexión = " servidor = localhost; base de datos = Northwind
06 Seguridad integral = SSPI";
07 SqlConnection Conexión MySQL = new SqlConnection(connectionString);
08 Uso (mySqlConnection) )
09 {
10 mySqlConnection. open();
11 lblinfo . text = " < b > La propiedad ConnectionString del objeto de conexión MySQL es: < b >"+
12 mySqlConnection. ConnectionString+" < br > ";
13 LBL info . text+= " < b > La propiedad ConnectionTimeout del objeto de conexión MySQL es < b >"+
14 mySqlConnection. tiempo de espera de conexión+" < br > ";
15 lb info . Base de datos+" < br > ";
17 LBL info . text+= " < b > La propiedad DataSource del objeto de conexión MySQL es < b >"+
18 mySqlConnection.
Fuente de datos+" < br > ";
19 LBL info . text+= " < b > La propiedad PacketSize del objeto de conexión MySQL es < b >"+
20 mySqlConnection. tamaño del paquete+" < br > ";
21 lb info . text+= " < b > La propiedad ServerVersion del objeto de conexión MySQL es < b >"+
22 mySqlConnection. versión del servidor+" < br > ";
23 LBL info . text+= " < b > El estado actual del objeto de conexión MySQL es < b >"+
24 mySqlConnection. state+" < br > ";
25 }
26 LBL info . text+= " < br > < b > El estado del objeto de conexión MySQL después de cerrar la conexión es: " ;
p>27 lblInfo. Texto += mySqlConnection. state . ToString();
28 }
29 }
Descripción del código del programa: en el código del programa del ejemplo anterior, el uso (mySqlConnection) crea el El código es más simple, su mayor ventaja es que puede cerrar automáticamente la conexión a la base de datos sin escribir finalmente el código de bloque.
Agrupación de conexiones
Abrir y cerrar la base de datos lleva mucho tiempo. Por lo tanto, ADO.NET almacena automáticamente las conexiones de bases de datos en el grupo de conexiones. La agrupación de conexiones puede mejorar en gran medida el rendimiento y la eficiencia del programa, porque no tenemos que esperar a que se establezca un nuevo proceso de conexión de base de datos, sino que utilizamos directamente la conexión de base de datos existente. Tenga en cuenta que cuando cierra una conexión utilizando el método Close(), la conexión en realidad no se cierra, sino que se marca como no utilizada y se coloca en el grupo de conexiones para su reutilización la próxima vez.
Si proporciona los mismos detalles en la cadena de conexión, es decir, la misma base de datos, nombre de usuario, contraseña, etc. , Puede obtener y devolver la conexión directamente en el grupo de conexiones. Luego puede utilizar esta conexión para acceder a la base de datos.
Al utilizar el objeto SqlConnection, puede especificar el tamaño máximo del grupo en la cadena de conexión, lo que significa el número máximo de conexiones permitidas por el grupo de conexiones (el valor predeterminado es 100), o puede especificar el tamaño mínimo del grupo, que significa el número mínimo de conexiones permitidas por el grupo de conexiones (el valor predeterminado es 0). El siguiente código especifica que el tamaño máximo del grupo del objeto SqlConnection es 10 y el tamaño mínimo del grupo es 5.
SqlConnection Conexión MySQL = new SqlConnection(" servidor = localhost; base de datos = Northwind
seguridad integral = SSPI; "+" tamaño máximo del grupo = 10; tamaño mínimo del grupo = 5") ;
Descripción del código del programa: en el código del programa del ejemplo anterior, el programa genera inicialmente cinco objetos SqlConnection en el grupo. Un grupo puede almacenar hasta 10 objetos SqlConnection. Si todos los objetos del grupo están en uso cuando se va a abrir un nuevo objeto SqlConnection, es necesario que el objeto SqlConnection se cierre antes de poder utilizar el nuevo objeto SqlConnection. Si la solicitud espera más que la cantidad de segundos especificada por la propiedad ConnectionTimeout, se generará una excepción.
A continuación se muestran las ventajas de rendimiento de la agrupación de conexiones a través de un programa. En el proceso de aplicación de este programa, primero debe consultar el sistema. datos. SqlClinet y sistema. Espacio de nombres de texto.
El código del programa de muestra es el siguiente:
01 clase de parte pública _Predeterminado: System.
Interfaz web
02 {
03 Protected void Page_Load(remitente del objeto, EventArgs e)
04 {
05 //Establece el número máximo de conexiones en el grupo de conexiones a 5 y el número mínimo de conexiones a 1.
06 Conexión SqlConnection MySQL = nueva SqlConnection(
07 "servidor=base de datos localhost=Northwind Comprehensive Security=SSPI;" +
08 tamaño máximo del grupo = 5 ; tamaño mínimo del grupo = 1");
09 //Crea un nuevo objeto StringBuilder.
10 StringBuilder htmStr = new StringBuilder(" ");
11 for(int count = 1; count < = 5; count++)
12 {
13 //Utiliza el método Append() para agregar la cadena al final de StringBuilder objeto.
14 htmStr. Append("Objeto de conexión"+count);
15 htmStr. /Establecer la hora de inicio de la conexión.
17 fecha y hora inicio = fecha y hora
18 mySqlConnection
19 //Hora de conexión. p>
20 TimeSpan timeTaken = DateTime. Ahora-Inicio;
21 htmStr.("El tiempo de conexión es "+timeTaken. Milisegundos + "Milisegundos"); htmStr. append(" < br > ");
23 htmstr. append("El estado del objeto de conexión MySQL es "+mySqlConnection. status); < br > ");
25 mySqlConnection. close();
26 }
27 //Muestra la cadena contenida en el objeto StringBuilder en la etiqueta control .
Text = htmStr();
29 }
Descripción del código del programa: En el código del programa del ejemplo anterior, abriremos una conexión Sql. objeto en el grupo de conexiones cinco veces. El TimeTaken ahora representa la hora actual. Se puede ver que la primera conexión se abre que el intervalo de tiempo. La apertura de conexiones posteriores lleva más tiempo porque la primera conexión es en realidad a la base de datos. Después del cierre, esta conexión se almacena en el grupo de conexiones. Cuando vuelvas a abrir la conexión, simplemente lee directamente desde el grupo, lo cual es muy rápido.
Consejo: Los objetos String son inmutables. Cada vez que utiliza un método en el sistema. La clase String necesita crear un nuevo objeto de cadena en la memoria, por lo que es necesario asignar un nuevo espacio para el nuevo objeto. Cuando es necesario modificar cadenas repetidamente, la sobrecarga asociada con la creación de nuevos objetos de cadena puede resultar muy costosa. Si desea modificar una cadena sin crear un nuevo objeto, puede utilizar system. Clase StringBuilder. Por ejemplo, el uso de la clase StringBuilder puede mejorar el rendimiento cuando se concatenan muchas cadenas en un bucle. El método Append se puede utilizar para agregar texto o una representación de cadena de un objeto al final de la cadena representada por el objeto StringBuilder actual.
En ASP.NET 2.0, se utiliza una nueva sintaxis de expresión declarativa que se resuelve en un valor de cadena de conexión en tiempo de ejecución para hacer referencia a cadenas de conexión de bases de datos por nombre.
Las cadenas de conexión en sí se almacenan en el archivo Web.config en la sección de configuración <
El código del programa de muestra es el siguiente:
< add name = " Pubs " connectString = " Server = localhost;
Seguridad integrada = True Database = pubs información de seguridad persistente = True "
providerName="System.Data.SqlClient" />
< add name = " viento del norte " connectString = " Server = localhost;
Seguridad integrada = Verdadero Base de datos = Northwind Información de seguridad persistente = Verdadero "
providerName="System.Data.SqlClient" />
< system.web
< página estilo hoja tema = " Predeterminado "/>
Descripción del código del programa: en el código del programa del ejemplo anterior, configuramos dos cadenas de conexión de base de datos en el nodo de configuración en la Web. Los archivos de configuración apuntan a las dos bases de datos de muestra, pubs y Northwind, respectivamente. Tenga en cuenta que los controles de fuente de datos (como el control SqlDataSource) se introdujeron en 2.0. Podemos establecer la propiedad ConnectionString del control SqlDataSource en una expresión que el analizador ASP.NET analiza en una cadena de conexión en tiempo de ejecución. También puede especificar una expresión para la propiedad ProviderName de SqlDataSource, como por ejemplo. Su uso específico y sus nuevas características se presentarán en detalle en capítulos posteriores. Ahora solo tengo una comprensión básica.
Por supuesto, también podemos leer la cadena de conexión de la base de datos directamente desde el archivo de configuración de la siguiente manera. Primero, debemos hacer referencia al sistema de uso. Espacio de nombres Web.Configuration, que contiene clases para establecer la configuración de ASP.NET.
Conexión de cadenaCadena = administrador de configuración. Cadenas de conexión["Northwind"]. ConnectionString
Descripción del código del programa: en el código del programa del ejemplo anterior, podemos usar cadenas de conexión ["Northwind"] para leer la cadena de viento del norte correspondiente. De manera similar, puede usar cadenas de conexión ["Pubs"] para leer la cadena de Pubs correspondiente.