/* CONEXION JDBC MEDIANTE DRIVER SQL SERVER 2000 DE MICROSOFT
EJERCICIO 2 */

import java.sql.*;

//CLASE PRINCIPAL
public class Jdbc_sqls3
{

   private Connection con = null;

   // constantes para utlizar en la cadena de conexion
   private final String url = "jdbc:microsoft:sqlserver:"//";
   private final String servidor= "localhost";
   private final String puerto = "1433";
   private final String db= "pubsSQL";
   private final String user = "sa";
   private final String pass = "chispa";

   /* la contraseña es facilmente localizable, es recomendable
   * solicitarla al usario en la aplicacion definitiva */

   /* hacer que el driver use cursor en el lado del servidor
   * lo que permite mas de una instruccion SQL activa en lla conexion */
   private final String metodo = "cursor";

   //METODO PRINCIPAL DE ENTRADA AL PROGRAMA
   public static void main(String[] args) throws Exception {
     Jdbc_sqls2 pruebaJdbc = new Jdbc_sqls2();
     pruebaJdbc.mostrarDatos();
   }

   // METODO CONSTRUCTOR
   public Jdbc_sqls3() {
     try {

       // cadena de conexion
       String Url = ""+url+servidor+":"+puerto+";databaseName="+db+";selectMethod="+metodo+";";

       System.out.println("\nJDBC SQL Server");
       System.out.println("===============\n");

       // registrar el driver JDBC usando el cargador de clases Class.forName
       Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
       con = DriverManager.getConnection (Url,user,pass);

       // si hay conexion activa
       if(con!=null) System.out.println("Conexion con " + db + " creada con exito.");
     }

     catch(Exception pollo) {
       System.out.println("Error: no se ha podido crear la conexion con " + db + ".\n"); }
     }

     // muestra informacion sobre el driver, SQL Server y catalogo de BD
     public void mostrarDatos(){
       DatabaseMetaData dm = null;
       /* la interfaz ResultSet representa un conjunto de datos resultado de una consulta SQL
       * para acceder a los registros se emplea un cursor que inicialmente apunta antes del primer registro
       * para avanzar por los registros se emplea el metodo ResultSet.next() */
       ResultSet rs = null;
       try {
         // si hay conexion activa
         if(con!=null){

            // obtener lnformacion de los distintos objetos
            dm = con.getMetaData();
            System.out.println("\nInformacion sobre el Driver:\n");
            System.out.println("\tDriver Name: "+ dm.getDriverName());
            System.out.println("\tDriver Version: "+ dm.getDriverVersion ());
            System.out.println("\nInformacion sobre SQL Server:\n");
            System.out.println("\tDatabase Name: "+ dm.getDatabaseProductName());
            System.out.println("\tDatabase Version: "+ dm.getDatabaseProductVersion());
            System.out.println("Catalogo disponible de bases de datos:\n");
            rs = dm.getCatalogs();
            //entero para contar por el catalogo de BD
            int n = 1;
            while(rs.next()){
              /* ResultSet.getString() recupera como String el valor de la columna
              * de la fila actual (columna referenciada por su nº de orden en la colección de columnas) */
              System.out.println("\t" + n + " - " + rs.getString(1));
              n+=1;
            }
            // liberar recursos
            rs.close();
            rs = null;
            dm = null;
            System.out.println("");

            // ejecutar una sentencia SQL SELECT
            Statement select = con.createStatement();
            ResultSet nombres = select.executeQuery("SELECT TOP 10 * FROM authors");
            System.out.println("Mostrar los 10 primeros registros de la tabla:");
            System.out.println("");
            //System.out.println("\tNOMBRE");
            //System.out.println("");
            int col = nombres.findColumn ("au_lname");
            boolean seguir = nombres.next();
            while (seguir) {
              System.out.println ("\t" + nombres.getString(col));
            seguir = nombres.next(); }
            System.out.println("");

            // liberar recursos
            nombres.close();
            select.close();
         cerrarCon(); }

         // si no hay conexion activa
         else System.out.println("Error: no hay conexiones activas con " + db + ".\n"); }

         catch(Exception pollo) {
            System.out.println("Error: no se pueden mostrar los datos.\n"); }
         }

         //cerrar la conexion
         private void cerrarCon(){
            try{
              if(con!=null)
              con.close();
            con=null; }

            catch(Exception pollo){
              System.out.println("\nError al cerrar la conexion con " + db + ".\n"); }
            }

         }