Índice de la sección dedicada a .NET (en el Guille)

La clase authors generada por la utilidad

Basada en la tabla authors de la base pubs

Código para Visual Basic.NET (VB.NET)

Código para C Sharp (C#)

Actualizado: 14/Jul/2004
Autor: Guillermo 'guille' Som

Volver al índice de Generar clases para acceder a una tabla

 

Código para Visual Basic.NET (VB.NET) El código de Visual Basic .NET

'------------------------------------------------------------------------------
' Clase authors generada automáticamente con CrearClaseSQL
' de la tabla 'authors' de la base 'pubs'
' Fecha: 14/jul/2004 03:48:02
'
' ©Guillermo 'guille' Som, 2004
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
'
Imports System
Imports System.Data
Imports System.Data.SqlClient
'
Public Class authors
    ' Las variables privadas
    ' TODO: Revisar los tipos de los campos
    Private _au_id As System.String
    Private _au_lname As System.String
    Private _au_fname As System.String
    Private _phone As System.String
    Private _address As System.String
    Private _city As System.String
    Private _state As System.String
    Private _zip As System.String
    Private _contract As System.Boolean
    '
    ' Este método se usará para ajustar los anchos de las propiedades
    Private Function ajustarAncho(cadena As String, ancho As Integer) As String
        Dim sb As New System.Text.StringBuilder(New String(" "c, ancho))
        ' devolver la cadena quitando los espacios en blanco
        ' esto asegura que no se devolverá un tamaño mayor ni espacios "extras"
        Return (cadena & sb.ToString()).Substring(0, ancho).Trim()
    End Function
    '
    ' Las propiedades públicas
    ' TODO: Revisar los tipos de las propiedades
    Public Property au_id() As System.String
        Get
            Return ajustarAncho(_au_id,11)
        End Get
        Set(value As System.String)
            _au_id = value
        End Set
    End Property
    Public Property au_lname() As System.String
        Get
            Return ajustarAncho(_au_lname,40)
        End Get
        Set(value As System.String)
            _au_lname = value
        End Set
    End Property
    Public Property au_fname() As System.String
        Get
            Return ajustarAncho(_au_fname,20)
        End Get
        Set(value As System.String)
            _au_fname = value
        End Set
    End Property
    Public Property phone() As System.String
        Get
            Return ajustarAncho(_phone,12)
        End Get
        Set(value As System.String)
            _phone = value
        End Set
    End Property
    Public Property address() As System.String
        Get
            Return ajustarAncho(_address,40)
        End Get
        Set(value As System.String)
            _address = value
        End Set
    End Property
    Public Property city() As System.String
        Get
            Return ajustarAncho(_city,20)
        End Get
        Set(value As System.String)
            _city = value
        End Set
    End Property
    Public Property state() As System.String
        Get
            Return ajustarAncho(_state,2)
        End Get
        Set(value As System.String)
            _state = value
        End Set
    End Property
    Public Property zip() As System.String
        Get
            Return ajustarAncho(_zip,5)
        End Get
        Set(value As System.String)
            _zip = value
        End Set
    End Property
    Public Property contract() As System.Boolean
        Get
            Return  _contract
        End Get
        Set(value As System.Boolean)
            _contract = value
        End Set
    End Property
    '
    Public Default Property Item(index As Integer) As String
        ' Devuelve el contenido del campo indicado en index
        ' (el índice corresponde con la columna de la tabla)
        Get
            If index = 0 Then
                Return Me.au_id.ToString()
            ElseIf index = 1 Then
                Return Me.au_lname.ToString()
            ElseIf index = 2 Then
                Return Me.au_fname.ToString()
            ElseIf index = 3 Then
                Return Me.phone.ToString()
            ElseIf index = 4 Then
                Return Me.address.ToString()
            ElseIf index = 5 Then
                Return Me.city.ToString()
            ElseIf index = 6 Then
                Return Me.state.ToString()
            ElseIf index = 7 Then
                Return Me.zip.ToString()
            ElseIf index = 8 Then
                Return Me.contract.ToString()
            End If
            ' Para que no de error el compilador de C#
            Return ""
        End Get
        Set(value As String)
            If index = 0 Then
                Me.au_id = value
            ElseIf index = 1 Then
                Me.au_lname = value
            ElseIf index = 2 Then
                Me.au_fname = value
            ElseIf index = 3 Then
                Me.phone = value
            ElseIf index = 4 Then
                Me.address = value
            ElseIf index = 5 Then
                Me.city = value
            ElseIf index = 6 Then
                Me.state = value
            ElseIf index = 7 Then
                Me.zip = value
            ElseIf index = 8 Then
                Try
                    Me.contract = System.Boolean.Parse(value)
                Catch
                    Me.contract = False
                End Try
            End If
        End Set
    End Property
    Public Default Property Item(index As String) As String
        ' Devuelve el contenido del campo indicado en index
        ' (el índice corresponde al nombre de la columna)
        Get
            If index = "au_id" Then
                Return Me.au_id.ToString()
            ElseIf index = "au_lname" Then
                Return Me.au_lname.ToString()
            ElseIf index = "au_fname" Then
                Return Me.au_fname.ToString()
            ElseIf index = "phone" Then
                Return Me.phone.ToString()
            ElseIf index = "address" Then
                Return Me.address.ToString()
            ElseIf index = "city" Then
                Return Me.city.ToString()
            ElseIf index = "state" Then
                Return Me.state.ToString()
            ElseIf index = "zip" Then
                Return Me.zip.ToString()
            ElseIf index = "contract" Then
                Return Me.contract.ToString()
            End If
            ' Para que no de error el compilador de C#
            Return ""
        End Get
        Set(value As String)
            If index = "au_id" Then
                Me.au_id = value
            ElseIf index = "au_lname" Then
                Me.au_lname = value
            ElseIf index = "au_fname" Then
                Me.au_fname = value
            ElseIf index = "phone" Then
                Me.phone = value
            ElseIf index = "address" Then
                Me.address = value
            ElseIf index = "city" Then
                Me.city = value
            ElseIf index = "state" Then
                Me.state = value
            ElseIf index = "zip" Then
                Me.zip = value
            ElseIf index = "contract" Then
                Try
                    Me.contract = System.Boolean.Parse(value)
                Catch
                    Me.contract = False
                End Try
            End If
        End Set
    End Property
    '
    ' Campos y métodos compartidos (estáticos) para gestionar la base de datos
    '
    ' La cadena de conexión a la base de datos
    Private Shared cadenaConexion As String = "Data Source=(local)\NETSDK; Initial Catalog=pubs; Integrated Security=yes;"
    ' La cadena de selección
    Public Shared CadenaSelect As String = "SELECT * FROM authors"
    '
    Public Sub New()
    End Sub
    Public Sub New(conex As String)
        cadenaConexion = conex
    End Sub
    '
    ' Métodos compartidos (estáticos) privados
    '
    ' asigna una fila de la tabla a un objeto authors
    Private Shared Function row2authors(r As DataRow) As authors
        ' asigna a un objeto authors los datos del dataRow indicado
        Dim oauthors As New authors
        '
        oauthors.au_id = r("au_id").ToString()
        oauthors.au_lname = r("au_lname").ToString()
        oauthors.au_fname = r("au_fname").ToString()
        oauthors.phone = r("phone").ToString()
        oauthors.address = r("address").ToString()
        oauthors.city = r("city").ToString()
        oauthors.state = r("state").ToString()
        oauthors.zip = r("zip").ToString()
        Try
            oauthors.contract = System.Boolean.Parse(r("contract").ToString())
        Catch
            oauthors.contract = False
        End Try
        '
        Return oauthors
    End Function
    '
    ' asigna un objeto authors a la fila indicada
    Private Shared Sub authors2Row(oauthors As authors, r As DataRow)
        ' asigna un objeto authors al dataRow indicado
        r("au_id") = oauthors.au_id
        r("au_lname") = oauthors.au_lname
        r("au_fname") = oauthors.au_fname
        r("phone") = oauthors.phone
        r("address") = oauthors.address
        r("city") = oauthors.city
        r("state") = oauthors.state
        r("zip") = oauthors.zip
        r("contract") = oauthors.contract
    End Sub
    '
    ' crea una nueva fila y la asigna a un objeto authors
    Private Shared Sub nuevoauthors(dt As DataTable, oauthors As authors)
        ' Crear un nuevo authors
        Dim dr As DataRow = dt.NewRow()
        Dim oa As authors = row2authors(dr)
        '
        oa.au_id = oauthors.au_id
        oa.au_lname = oauthors.au_lname
        oa.au_fname = oauthors.au_fname
        oa.phone = oauthors.phone
        oa.address = oauthors.address
        oa.city = oauthors.city
        oa.state = oauthors.state
        oa.zip = oauthors.zip
        oa.contract = oauthors.contract
        '
        authors2Row(oa, dr)
        '
        dt.Rows.Add(dr)
    End Sub
    '
    ' Métodos públicos
    '
    ' devuelve una tabla con los datos indicados en la cadena de selección
    Public Shared Function Tabla() As DataTable
        Return Tabla(CadenaSelect)
    End Function
    Public Shared Function Tabla(sel As String) As DataTable
        ' devuelve una tabla con los datos de la tabla authors
        Dim da As SqlDataAdapter
        Dim dt As New DataTable("authors")
        '
        Try
            da = New SqlDataAdapter(sel, cadenaConexion)
            da.Fill(dt)
        Catch
            Return Nothing
        End Try
        '
        Return dt
    End Function
    '
    Public Shared Function Buscar(sWhere As String) As authors
        ' Busca en la tabla los datos indicados en el parámetro
        ' el parámetro contendrá lo que se usará después del WHERE
        Dim oauthors As authors = Nothing
        Dim da As SqlDataAdapter
        Dim dt As New DataTable("authors")
        Dim sel As String = "SELECT * FROM authors WHERE " & sWhere
        '
        da = New SqlDataAdapter(sel, cadenaConexion)
        da.Fill(dt)
        '
        If dt.Rows.Count > 0 Then
            oauthors = row2authors(dt.Rows(0))
        End If
        Return oauthors
    End Function
    '
    ' Actualizar: Actualiza los datos en la tabla usando la instancia actual
    '             Si la instancia no hace referencia a un registro existente, se creará uno nuevo
    '             Para comprobar si el objeto en memoria coincide con uno existente,
    '             se comprueba si el au_id existe en la tabla.
    '             TODO: Si en lugar de au_id usas otro campo, indicalo en la cadena SELECT
    '                   También puedes usar la sobrecarga en la que se indica la cadena SELECT a usar
    Public Function Actualizar() As String
        ' TODO: Poner aquí la selección a realizar para acceder a este registro
        '       yo uso el au_id que es el identificador único de cada registro
        Dim sel As String = "SELECT * FROM authors WHERE au_id = '" & Me.au_id & "'"
        Return Actualizar(sel)
    End Function
    Public Function Actualizar(sel As String) As String
        ' Actualiza los datos indicados
        ' El parámetro, que es una cadena de selección, indicará el criterio de actualización
        '
        ' En caso de error, devolverá la cadena empezando por ERROR.
        Dim cnn As SqlConnection
        Dim da As SqlDataAdapter
        Dim dt As New DataTable("authors")
        '
        cnn = New SqlConnection(cadenaConexion)
        'da = New SqlDataAdapter(CadenaSelect, cnn)
        da = New SqlDataAdapter(sel, cnn)
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey
        '
        '-------------------------------------------
        ' Esta no es la más óptima, pero funcionará
        '-------------------------------------------
        'Dim cb As New SqlCommandBuilder(da)
        'da.UpdateCommand = cb.GetUpdateCommand()
        '
        '--------------------------------------------------------------------
        ' Esta está más optimizada pero debes comprobar que funciona bien...
        '--------------------------------------------------------------------
        Dim sCommand As String
        '
        ' El comando UPDATE
        ' TODO: Comprobar cual es el campo de índice principal (sin duplicados)
        '       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        '       Ese campo, (en mi caso au_id) será el que hay que poner al final junto al WHERE.
        sCommand = "UPDATE authors SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone, address = @address, city = @city, state = @state, zip = @zip, contract = @contract  WHERE (au_id = @au_id)"
        da.UpdateCommand = New SqlCommand(sCommand, cnn)
        da.UpdateCommand.Parameters.Add("@au_id", SqlDbType.NVarChar, 11, "au_id")
        da.UpdateCommand.Parameters.Add("@au_lname", SqlDbType.NVarChar, 40, "au_lname")
        da.UpdateCommand.Parameters.Add("@au_fname", SqlDbType.NVarChar, 20, "au_fname")
        da.UpdateCommand.Parameters.Add("@phone", SqlDbType.NVarChar, 12, "phone")
        da.UpdateCommand.Parameters.Add("@address", SqlDbType.NVarChar, 40, "address")
        da.UpdateCommand.Parameters.Add("@city", SqlDbType.NVarChar, 20, "city")
        da.UpdateCommand.Parameters.Add("@state", SqlDbType.NVarChar, 2, "state")
        da.UpdateCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 5, "zip")
        ' TODO: Comprobar el tipo de datos a usar...
        da.UpdateCommand.Parameters.Add("@contract", SqlDbType.Bit, 0, "contract")
        '
        Try
            da.Fill(dt)
        Catch ex As Exception
            Return "ERROR: " & ex.Message
        End Try
        '
        If dt.Rows.Count = 0 Then
            ' crear uno nuevo
            Return Crear()
        Else
            authors2Row(Me, dt.Rows(0))
        End If
        '
        Try
            da.Update(dt)
            dt.AcceptChanges()
            Return "Actualizado correctamente"
        Catch ex As Exception
            Return "ERROR: " & ex.Message
        End Try
    End Function
    '
    Public Function Crear() As String
        ' Crear un nuevo registro
        ' En caso de error, devolverá la cadena de error empezando por ERROR:.
        Dim cnn As SqlConnection
        Dim da As SqlDataAdapter
        Dim dt As New DataTable("authors")
        '
        cnn = New SqlConnection(cadenaConexion)
        da = New SqlDataAdapter(CadenaSelect, cnn)
        'da = New SqlDataAdapter(CadenaSelect, cadenaConexion)
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey
        '
        '-------------------------------------------
        ' Esta no es la más óptima, pero funcionará
        '-------------------------------------------
        'Dim cb As New SqlCommandBuilder(da)
        'da.InsertCommand = cb.GetInsertCommand()
        '
        '--------------------------------------------------------------------
        ' Esta está más optimizada pero debes comprobar que funciona bien...
        '--------------------------------------------------------------------
        Dim sCommand As String
        '
        ' El comando INSERT
        ' TODO: No incluir el campo de clave primaria incremental
        '       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        sCommand = "INSERT INTO authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract)  VALUES(@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract)"
        da.InsertCommand = New SqlCommand(sCommand, cnn)
        da.InsertCommand.Parameters.Add("@au_id", SqlDbType.NVarChar, 11, "au_id")
        da.InsertCommand.Parameters.Add("@au_lname", SqlDbType.NVarChar, 40, "au_lname")
        da.InsertCommand.Parameters.Add("@au_fname", SqlDbType.NVarChar, 20, "au_fname")
        da.InsertCommand.Parameters.Add("@phone", SqlDbType.NVarChar, 12, "phone")
        da.InsertCommand.Parameters.Add("@address", SqlDbType.NVarChar, 40, "address")
        da.InsertCommand.Parameters.Add("@city", SqlDbType.NVarChar, 20, "city")
        da.InsertCommand.Parameters.Add("@state", SqlDbType.NVarChar, 2, "state")
        da.InsertCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 5, "zip")
        ' TODO: Comprobar el tipo de datos a usar...
        da.InsertCommand.Parameters.Add("@contract", SqlDbType.Bit, 0, "contract")
        '
        '
        Try
            da.Fill(dt)
        Catch ex As Exception
            Return "ERROR: " & ex.Message
        End Try
        '
        nuevoauthors(dt, Me)
        '
        Try
            da.Update(dt)
            dt.AcceptChanges()
            Return "Se ha creado un nuevo authors"
        Catch ex As Exception
            Return "ERROR: " & ex.Message
        End Try
    End Function
    '
    Public Function Borrar() As String
        ' TODO: Poner aquí la selección a realizar para acceder a este registro
        '       yo uso el au_id que es el identificador único de cada registro
        Dim sel As String = "SELECT * FROM authors WHERE au_id = '" & Me.au_id & "'"
        '
        Return Borrar(sel)
    End Function
    Public Function Borrar(sel As String) As String
        ' Borrar el registro al que apunta esta clase
        ' En caso de error, devolverá la cadena de error empezando por ERROR:.
        Dim cnn As SqlConnection
        Dim da As SqlDataAdapter
        Dim dt As New DataTable("authors")
        '
        cnn = New SqlConnection(cadenaConexion)
        da = New SqlDataAdapter(sel, cnn)
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey
        '
        '-------------------------------------------
        ' Esta no es la más óptima, pero funcionará
        '-------------------------------------------
        'Dim cb As New SqlCommandBuilder(da)
        'da.DeleteCommand = cb.GetDeleteCommand()
        '
        '
        '--------------------------------------------------------------------
        ' Esta está más optimizada pero debes comprobar que funciona bien...
        '--------------------------------------------------------------------
        Dim sCommand As String
        '
        ' El comando DELETE
        ' TODO: Sólo incluir el campo de clave primaria incremental
        '       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        sCommand = "DELETE FROM authors WHERE (au_id = @p1)"
        da.DeleteCommand = New SqlCommand(sCommand, cnn)
        da.DeleteCommand.Parameters.Add("@p1", SqlDbType.NVarChar, 11, "au_id")
        da.DeleteCommand.Parameters.Add("@p2", SqlDbType.Int, 0, "")
        '
        '
        da.Fill(dt)
        '
        If dt.Rows.Count = 0 Then
            Return "ERROR: No hay datos"
        Else
            dt.Rows(0).Delete()
        End If
        '
        Try
            da.Update(dt)
            dt.AcceptChanges()
            Return "Borrado satisfactoriamente"
        Catch ex As Exception
            Return "ERROR: " & ex.Message
        End Try
    End Function
    '
End Class

...


Código para C Sharp (C#) El código de C#

//------------------------------------------------------------------------------
// Clase authors generada automáticamente con CrearClaseSQL
// de la tabla 'authors' de la base 'pubs'
// Fecha: 14/jul/2004 03:48:06
//
// ©Guillermo 'guille' Som, 2004
//------------------------------------------------------------------------------
using System;
using System.Data;
using System.Data.SqlClient;
//
public class authors{
    // Las variables privadas
    // TODO: Revisar los tipos de los campos
    private System.String _au_id;
    private System.String _au_lname;
    private System.String _au_fname;
    private System.String _phone;
    private System.String _address;
    private System.String _city;
    private System.String _state;
    private System.String _zip;
    private System.Boolean _contract;
    //
    // Este método se usará para ajustar los anchos de las propiedades
    private string ajustarAncho(string cadena, int ancho){
        System.Text.StringBuilder sb = new System.Text.StringBuilder(new String(' ', ancho));
        // devolver la cadena quitando los espacios en blanco
        // esto asegura que no se devolverá un tamaño mayor ni espacios "extras"
        return (cadena + sb.ToString()).Substring(0, ancho).Trim();
    }
    //
    // Las propiedades públicas
    // TODO: Revisar los tipos de las propiedades
    public System.String au_id{
        get{
            return ajustarAncho(_au_id,11);
        }
        set{
            _au_id = value;
        }
    }
    public System.String au_lname{
        get{
            return ajustarAncho(_au_lname,40);
        }
        set{
            _au_lname = value;
        }
    }
    public System.String au_fname{
        get{
            return ajustarAncho(_au_fname,20);
        }
        set{
            _au_fname = value;
        }
    }
    public System.String phone{
        get{
            return ajustarAncho(_phone,12);
        }
        set{
            _phone = value;
        }
    }
    public System.String address{
        get{
            return ajustarAncho(_address,40);
        }
        set{
            _address = value;
        }
    }
    public System.String city{
        get{
            return ajustarAncho(_city,20);
        }
        set{
            _city = value;
        }
    }
    public System.String state{
        get{
            return ajustarAncho(_state,2);
        }
        set{
            _state = value;
        }
    }
    public System.String zip{
        get{
            return ajustarAncho(_zip,5);
        }
        set{
            _zip = value;
        }
    }
    public System.Boolean contract{
        get{
            return  _contract;
        }
        set{
            _contract = value;
        }
    }
    //
    public string this[int index]{
        // Devuelve el contenido del campo indicado en index
        // (el índice corresponde con la columna de la tabla)
        get{
            if(index == 0){
                return this.au_id.ToString();
            }else if(index == 1){
                return this.au_lname.ToString();
            }else if(index == 2){
                return this.au_fname.ToString();
            }else if(index == 3){
                return this.phone.ToString();
            }else if(index == 4){
                return this.address.ToString();
            }else if(index == 5){
                return this.city.ToString();
            }else if(index == 6){
                return this.state.ToString();
            }else if(index == 7){
                return this.zip.ToString();
            }else if(index == 8){
                return this.contract.ToString();
            }
            // Para que no de error el compilador de C#
            return "";
        }
        set{
            if(index == 0){
                this.au_id = value;
            }else if(index == 1){
                this.au_lname = value;
            }else if(index == 2){
                this.au_fname = value;
            }else if(index == 3){
                this.phone = value;
            }else if(index == 4){
                this.address = value;
            }else if(index == 5){
                this.city = value;
            }else if(index == 6){
                this.state = value;
            }else if(index == 7){
                this.zip = value;
            }else if(index == 8){
                try{
                    this.contract = System.Boolean.Parse(value);
                }catch{
                    this.contract = false;
                }
            }
        }
    }
    public string this[string index]{
        // Devuelve el contenido del campo indicado en index
        // (el índice corresponde al nombre de la columna)
        get{
            if(index == "au_id"){
                return this.au_id.ToString();
            }else if(index == "au_lname"){
                return this.au_lname.ToString();
            }else if(index == "au_fname"){
                return this.au_fname.ToString();
            }else if(index == "phone"){
                return this.phone.ToString();
            }else if(index == "address"){
                return this.address.ToString();
            }else if(index == "city"){
                return this.city.ToString();
            }else if(index == "state"){
                return this.state.ToString();
            }else if(index == "zip"){
                return this.zip.ToString();
            }else if(index == "contract"){
                return this.contract.ToString();
            }
            // Para que no de error el compilador de C#
            return "";
        }
        set{
            if(index == "au_id"){
                this.au_id = value;
            }else if(index == "au_lname"){
                this.au_lname = value;
            }else if(index == "au_fname"){
                this.au_fname = value;
            }else if(index == "phone"){
                this.phone = value;
            }else if(index == "address"){
                this.address = value;
            }else if(index == "city"){
                this.city = value;
            }else if(index == "state"){
                this.state = value;
            }else if(index == "zip"){
                this.zip = value;
            }else if(index == "contract"){
                try{
                    this.contract = System.Boolean.Parse(value);
                }catch{
                    this.contract = false;
                }
            }
        }
    }
    //
    // Campos y métodos compartidos (estáticos) para gestionar la base de datos
    //
    // La cadena de conexión a la base de datos
    private static string cadenaConexion = @"Data Source=(local)\NETSDK; Initial Catalog=pubs; Integrated Security=yes;";
    // La cadena de selección
    public static string CadenaSelect = "SELECT * FROM authors";
    //
    public authors(){
    }
    public authors(string conex){
        cadenaConexion = conex;
    }
    //
    // Métodos compartidos (estáticos) privados
    //
    // asigna una fila de la tabla a un objeto authors
    private static authors row2authors(DataRow r){
        // asigna a un objeto authors los datos del dataRow indicado
        authors oauthors = new authors();
        //
        oauthors.au_id = r["au_id"].ToString();
        oauthors.au_lname = r["au_lname"].ToString();
        oauthors.au_fname = r["au_fname"].ToString();
        oauthors.phone = r["phone"].ToString();
        oauthors.address = r["address"].ToString();
        oauthors.city = r["city"].ToString();
        oauthors.state = r["state"].ToString();
        oauthors.zip = r["zip"].ToString();
        try{
            oauthors.contract = System.Boolean.Parse(r["contract"].ToString());
        }catch{
            oauthors.contract = false;
        }
        //
        return oauthors;
    }
    //
    // asigna un objeto authors a la fila indicada
    private static void authors2Row(authors oauthors, DataRow r){
        // asigna un objeto authors al dataRow indicado
        r["au_id"] = oauthors.au_id;
        r["au_lname"] = oauthors.au_lname;
        r["au_fname"] = oauthors.au_fname;
        r["phone"] = oauthors.phone;
        r["address"] = oauthors.address;
        r["city"] = oauthors.city;
        r["state"] = oauthors.state;
        r["zip"] = oauthors.zip;
        r["contract"] = oauthors.contract;
    }
    //
    // crea una nueva fila y la asigna a un objeto authors
    private static void nuevoauthors(DataTable dt, authors oauthors){
        // Crear un nuevo authors
        DataRow dr = dt.NewRow();
        authors oa = row2authors(dr);
        //
        oa.au_id = oauthors.au_id;
        oa.au_lname = oauthors.au_lname;
        oa.au_fname = oauthors.au_fname;
        oa.phone = oauthors.phone;
        oa.address = oauthors.address;
        oa.city = oauthors.city;
        oa.state = oauthors.state;
        oa.zip = oauthors.zip;
        oa.contract = oauthors.contract;
        //
        authors2Row(oa, dr);
        //
        dt.Rows.Add(dr);
    }
    //
    // Métodos públicos
    //
    // devuelve una tabla con los datos indicados en la cadena de selección
    public static DataTable Tabla(){
        return Tabla(CadenaSelect);
    }
    public static DataTable Tabla(string sel){
        // devuelve una tabla con los datos de la tabla authors
        SqlDataAdapter da;
        DataTable dt = new DataTable("authors");
        //
        try{
            da = new SqlDataAdapter(sel, cadenaConexion);
            da.Fill(dt);
        }catch{
            return null;
        }
        //
        return dt;
    }
    //
    public static authors Buscar(string sWhere){
        // Busca en la tabla los datos indicados en el parámetro
        // el parámetro contendrá lo que se usará después del WHERE
        authors oauthors = null;
        SqlDataAdapter da;
        DataTable dt = new DataTable("authors");
        string sel = "SELECT * FROM authors WHERE " + sWhere;
        //
        da = new SqlDataAdapter(sel, cadenaConexion);
        da.Fill(dt);
        //
        if(dt.Rows.Count > 0){
            oauthors = row2authors(dt.Rows[0]);
        }
        return oauthors;
    }
    //
    // Actualizar: Actualiza los datos en la tabla usando la instancia actual
    //             Si la instancia no hace referencia a un registro existente, se creará uno nuevo
    //             Para comprobar si el objeto en memoria coincide con uno existente,
    //             se comprueba si el au_id existe en la tabla.
    //             TODO: Si en lugar de au_id usas otro campo, indicalo en la cadena SELECT
    //                   También puedes usar la sobrecarga en la que se indica la cadena SELECT a usar
    public string Actualizar(){
        // TODO: Poner aquí la selección a realizar para acceder a este registro
        //       yo uso el au_id que es el identificador único de cada registro
        string sel = "SELECT * FROM authors WHERE au_id = '" + this.au_id + "'";
        return Actualizar(sel);
    }
    public string Actualizar(string sel){
        // Actualiza los datos indicados
        // El parámetro, que es una cadena de selección, indicará el criterio de actualización
        //
        // En caso de error, devolverá la cadena empezando por ERROR.
        SqlConnection cnn;
        SqlDataAdapter da;
        DataTable dt = new DataTable("authors");
        //
        cnn = new SqlConnection(cadenaConexion);
        //da = new SqlDataAdapter(CadenaSelect, cnn);
        da = new SqlDataAdapter(sel, cnn);
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        //
        //-------------------------------------------
        // Esta no es la más óptima, pero funcionará
        //-------------------------------------------
        //SqlCommandBuilder cb = new SqlCommandBuilder(da);
        //da.UpdateCommand = cb.GetUpdateCommand();
        //
        //--------------------------------------------------------------------
        // Esta está más optimizada pero debes comprobar que funciona bien...
        //--------------------------------------------------------------------
        string sCommand;
        //
        // El comando UPDATE
        // TODO: Comprobar cual es el campo de índice principal (sin duplicados)
        //       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        //       Ese campo, (en mi caso au_id) será el que hay que poner al final junto al WHERE.
        sCommand = "UPDATE authors SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone, address = @address, city = @city, state = @state, zip = @zip, contract = @contract  WHERE (au_id = @au_id)";
        da.UpdateCommand = new SqlCommand(sCommand, cnn);
        da.UpdateCommand.Parameters.Add("@au_id", SqlDbType.NVarChar, 11, "au_id");
        da.UpdateCommand.Parameters.Add("@au_lname", SqlDbType.NVarChar, 40, "au_lname");
        da.UpdateCommand.Parameters.Add("@au_fname", SqlDbType.NVarChar, 20, "au_fname");
        da.UpdateCommand.Parameters.Add("@phone", SqlDbType.NVarChar, 12, "phone");
        da.UpdateCommand.Parameters.Add("@address", SqlDbType.NVarChar, 40, "address");
        da.UpdateCommand.Parameters.Add("@city", SqlDbType.NVarChar, 20, "city");
        da.UpdateCommand.Parameters.Add("@state", SqlDbType.NVarChar, 2, "state");
        da.UpdateCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 5, "zip");
        // TODO: Comprobar el tipo de datos a usar...
        da.UpdateCommand.Parameters.Add("@contract", SqlDbType.Bit, 0, "contract");
        //
        try{
            da.Fill(dt);
        }catch(Exception ex){
            return "ERROR: " + ex.Message;
        }
        //
        if(dt.Rows.Count == 0){
            // crear uno nuevo
            return Crear();
        }else{
            authors2Row(this, dt.Rows[0]);
        }
        //
        try{
            da.Update(dt);
            dt.AcceptChanges();
            return "Actualizado correctamente";
        }catch(Exception ex){
            return "ERROR: " + ex.Message;
        }
    }
    //
    public string Crear(){
        // Crear un nuevo registro
        // En caso de error, devolverá la cadena de error empezando por ERROR:.
        SqlConnection cnn;
        SqlDataAdapter da;
        DataTable dt = new DataTable("authors");
        //
        cnn = new SqlConnection(cadenaConexion);
        da = new SqlDataAdapter(CadenaSelect, cnn);
        //da = new SqlDataAdapter(CadenaSelect, cadenaConexion);
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        //
        //-------------------------------------------
        // Esta no es la más óptima, pero funcionará
        //-------------------------------------------
        //SqlCommandBuilder cb = new SqlCommandBuilder(da);
        //da.InsertCommand = cb.GetInsertCommand();
        //
        //--------------------------------------------------------------------
        // Esta está más optimizada pero debes comprobar que funciona bien...
        //--------------------------------------------------------------------
        string sCommand;
        //
        // El comando INSERT
        // TODO: No incluir el campo de clave primaria incremental
        //       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        sCommand = "INSERT INTO authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract)  VALUES(@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract)";
        da.InsertCommand = new SqlCommand(sCommand, cnn);
        da.InsertCommand.Parameters.Add("@au_id", SqlDbType.NVarChar, 11, "au_id");
        da.InsertCommand.Parameters.Add("@au_lname", SqlDbType.NVarChar, 40, "au_lname");
        da.InsertCommand.Parameters.Add("@au_fname", SqlDbType.NVarChar, 20, "au_fname");
        da.InsertCommand.Parameters.Add("@phone", SqlDbType.NVarChar, 12, "phone");
        da.InsertCommand.Parameters.Add("@address", SqlDbType.NVarChar, 40, "address");
        da.InsertCommand.Parameters.Add("@city", SqlDbType.NVarChar, 20, "city");
        da.InsertCommand.Parameters.Add("@state", SqlDbType.NVarChar, 2, "state");
        da.InsertCommand.Parameters.Add("@zip", SqlDbType.NVarChar, 5, "zip");
        // TODO: Comprobar el tipo de datos a usar...
        da.InsertCommand.Parameters.Add("@contract", SqlDbType.Bit, 0, "contract");
        //
        //
        try{
            da.Fill(dt);
        }catch(Exception ex){
            return "ERROR: " + ex.Message;
        }
        //
        nuevoauthors(dt, this);
        //
        try{
            da.Update(dt);
            dt.AcceptChanges();
            return "Se ha creado un nuevo authors";
        }catch(Exception ex){
            return "ERROR: " + ex.Message;
        }
    }
    //
    public string Borrar(){
        // TODO: Poner aquí la selección a realizar para acceder a este registro
        //       yo uso el au_id que es el identificador único de cada registro
        string sel = "SELECT * FROM authors WHERE au_id = '" + this.au_id + "'";
        //
        return Borrar(sel);
    }
    public string Borrar(string sel){
        // Borrar el registro al que apunta esta clase
        // En caso de error, devolverá la cadena de error empezando por ERROR:.
        SqlConnection cnn;
        SqlDataAdapter da;
        DataTable dt = new DataTable("authors");
        //
        cnn = new SqlConnection(cadenaConexion);
        da = new SqlDataAdapter(sel, cnn);
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        //
        //-------------------------------------------
        // Esta no es la más óptima, pero funcionará
        //-------------------------------------------
        //SqlCommandBuilder cb = new SqlCommandBuilder(da);
        //da.DeleteCommand = cb.GetDeleteCommand();
        //
        //
        //--------------------------------------------------------------------
        // Esta está más optimizada pero debes comprobar que funciona bien...
        //--------------------------------------------------------------------
        string sCommand;
        //
        // El comando DELETE
        // TODO: Sólo incluir el campo de clave primaria incremental
        //       Yo compruebo que sea un campo llamado au_id, pero en tu caso puede ser otro
        sCommand = "DELETE FROM authors WHERE (au_id = @p1)";
        da.DeleteCommand = new SqlCommand(sCommand, cnn);
        da.DeleteCommand.Parameters.Add("@p1", SqlDbType.NVarChar, 11, "au_id");
        da.DeleteCommand.Parameters.Add("@p2", SqlDbType.Int, 0, "");
        //
        //
        da.Fill(dt);
        //
        if(dt.Rows.Count == 0){
            return "ERROR: No hay datos";
        }else{
            dt.Rows[0].Delete();
        }
        //
        try{
            da.Update(dt);
            dt.AcceptChanges();
            return "Borrado satisfactoriamente";
        }catch(Exception ex){
            return "ERROR: " + ex.Message;
        }
    }
    //
}

...


la Luna del Guille o... el Guille que está en la Luna... tanto monta...