none
No existe la tabla SQL Compact 3.5 y Visual.net

    Pregunta

  • Buenos días,

    si alguno seguis el foro lo mas seguro esque vereis que he ido consultando mis dudas por el foro, algunas han sido respondidas y otras no,

     

    bien pues ahora me encuentro con el siguiente problema:

     

    Creo la el fichero .sfv y la tabla, genero la consulta pero a la hora de vera en un DataGridV me dice que la tabla no existe, a ver si me podeis ayudar (la tabla no la tengo adjunta en ningun sitio el sistema la crea

     

    Os dejo el codigo fuente a ver si me podeis ayudar que yo ya estoy medio loco de no encontrar solución.

     

     

    Saludos y Gracias!!

    Public Class Form1
    #Region "btnCreateDatabase_Click"
        Private Sub btnCreateDatabase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateDatabase.Click
            Dim connectString As String = ""
            Dim fileName As String = "Check.sdf"
            Dim password As String = "Control12"
            If File.Exists(fileName) Then
                File.Delete(fileName)
            End If
            connectString = String.Format("DataSource=""{0}""; Password='{1}'", fileName, password)
            Dim eng As SqlCeEngine = New SqlCeEngine(connectString)
            eng.CreateDatabase()
            Dim cn As New SqlCeConnection(connectString)
            If cn.State = ConnectionState.Closed Then
                cn.Open()
            End If
            Dim cmd As SqlCeCommand
            Dim sql As String = "CREATE TABLE Codigos(CodigoBolsa nvchar (14) not null, CodigoPrenda nvchar (14),Estado nvchar (5))"
            cmd = New SqlCeCommand(sql, cn)
            cn.Close()
            lblResults.Text = "Table created."
        End Sub
    #End Region
    #Region "ConnectionString"
        Private Function connectString() As String
            Dim connectionString As String
            Dim fileName As String = "Check.sdf"
            Dim password As String = "Control12"
            connectionString = String.Format("DataSource=""{0}""; Password='{1}'", fileName, password)
            Return connectionString
        End Function
    #End Region
    #Region "BtnAddItems_Click"
        Private Sub btnAddItems_click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdditems.Click
            Dim cn As New SqlCeConnection(connectString())
            If cn.State = ConnectionState.Closed Then
                cn.Open()
            End If
            Dim cmd As SqlCeCommand
            Dim sql As String = "INSERT INTO Codigos" + "(CodigoBolsa, CodigoPrenda, Estado)" + " VALUES (@CB, @CP, @ES)"
            Try
                cmd = New SqlCeCommand(sql, cn)
                cmd.Parameters.AddWithValue("@CB", TextCB.Text)
                cmd.Parameters.AddWithValue("@CP", TextCP.Text)
                cmd.Parameters.AddWithValue("@ES", Estado.Text)
                lblResults.Text = "Consulta Cargada"
            Catch ex As Exception
            End Try
        End Sub
    #End Region
        Private Sub TextCP_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextCP.TextChanged
            Dim CB, CP As String
            CB = TextCB.Text
            CP = TextCP.Text
            If CB = CP Then
                Estado.Text = "OK"
            Else
                Estado.Text = "ERROR"
            End If
        End Sub
        Private Sub btnLoadGrid_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadGrid.Click
            Dim cn As New SqlCeConnection(connectString())
            If cn.State = ConnectionState.Closed Then
                cn.Open()
            End If
            Dim cmd As SqlCeCommand = New SqlCeCommand("Codigos", cn)
            cmd.CommandType = CommandType.TableDirect
            Dim rs As SqlCeResultSet = cmd.ExecuteResultSet(ResultSetOptions.Scrollable)
            dgvCodigos.DataSource = rs
        End Sub
    End Class
    martes, 22 de mayo de 2012 9:54

Respuestas

  • Hola:

    Observando el código fuente que has publicado, creo que hay algunos errores:

    > connectString = _
    > String.Format("DataSource=""{0}""; Password='{1}'", fileName, password)

    El parámetro es "Data Source", con un espacio en blanco.

    No encierres los valores entre comillas dobles, y menos el valor del parámetro Password, porque a la contraseña definida le estarás añadiendo dos comillas simples, una al principio y otra al final, con lo que la contraseña sería 'Control12' (con las comillas simples) en lugar de Control12.

    La cadena de conexión correcta sería:

      Dim fileName As String = "Check.sdf"
      Dim password As String = "Control12"

      Dim connectString As String = _
        String.Format("Data Source={0}; Password={1}", fileName, password)

    Se comprende que el archivo Check.sdf se creará en la misma carpeta que contiene el ejecutable final de tu aplicación.

    > Dim cn As New SqlCeConnection(connectString)
    > If cn.State = ConnectionState.Closed Then
    >    cn.Open()
    > End If

    Si declaras un nuevo objeto SqlCeConnection, la conexión siempre estará cerrada, por lo que sobra la verificación que haces. Aparte, la declaración la deberías de realizar dentro de un bloque Using ... End Using, a fin de que la conexión se cierre y destruya automáticamente cuando deje de ser útil:

    Try
      Using cn As New SqlCeConnection(connectString)
      Dim cmd As SqlCeCommand cn.CreateCommand()
            cmd.CommandText = "CREATE TABLE Codigos(" & _
              "CodigoBolsa nvarchar (14) not null, " & _
              "CodigoPrenda nvarchar (14), Estado nvarchar (5))"
            ' Abrimos la conexión.
            cn.Open()
            ' Ejecutamos el comando.
            cmd.ExecuteNonQuery()
      End Using
    Catch ex As Exception
      MessageBox.Show(ex.Message)
    End Ty

    > CREATE TABLE Codigos(CodigoBolsa nvchar ...

    Salvo que esté equivocado, creo que el tipo de datos nvchar no existe; existe el tipo de datos nvarchar

      CREATE TABLE Codigos (CodigoBolsa nvarchar ...

    >  Dim sql As String = "INSERT INTO Codigos" +
    >   "(CodigoBolsa, CodigoPrenda, Estado)" +
    >   " VALUES (@CB, @CP, @ES)"

    Como todos es una cadena alfanumérica (String), no es necesario que concatenes los valores con el signo +. Para separar el código en varias línea, utiliza el guión bajo:

      Dim sql As String = "INSERT INTO Codigos" _
       "(CodigoBolsa, CodigoPrenda, Estado)" _
       " VALUES (@CB, @CP, @ES)"

    Y protege todo tu código de errores no controlados encerrándo las instrucciones entre bloques Try ... Catch ... End Try.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Sockar miércoles, 30 de mayo de 2012 10:58
    martes, 29 de mayo de 2012 11:17
    Moderador

Todas las respuestas

  • Buenas Sockar.

    Lo único que te faltaría es llamar a la función ExecuteNonQuery:

    cmd = New SqlCeCommand(sql, cn)
    
    Dim rdr As SqlCeDataReader = cmd.ExecutNonQuery()
    
    cn.Close()
    
    Un saludo.

    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es

    • Editado lopezatienza martes, 22 de mayo de 2012 10:04
    • Marcado como respuesta Eder CostaModerator jueves, 24 de mayo de 2012 13:37
    • Desmarcado como respuesta Sockar martes, 29 de mayo de 2012 3:31
    martes, 22 de mayo de 2012 10:02
  • algo que no entiendo porque creas la tabla desde codigo ? porque haces

    Dim sql As String = "CREATE TABLE Codigos(CodigoBolsa nvchar (14) not null, CodigoPrenda nvchar (14),Estado nvchar (5))"

    porque no defines la estructura de tablas desde el diseñador del server explorer

    ademas el connecton string defineslo en el archivo de configuracion

    Archivos de Configuración - Una introducción (1/3)

    como explcio en la seccion "1- Agregar un archivo de configuración a nuestro proyecto"

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 22 de mayo de 2012 13:14
  • Buenas Sockar.

    Lo único que te faltaría es llamar a la función ExecuteNonQuery:

    cmd = New SqlCeCommand(sql, cn)
    
    Dim rdr As SqlCeDataReader = cmd.ExecutNonQuery()
    
    cn.Close()
    
    Un saludo.

    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples

    http://www.lopezatienza.es

    Hola Antonio al intentar marcar el cmd.ExecuteNonQuery()

    me lanza el siguiente Error: "Un valor de Tipo '

    Integer' no se puede convertir en 'System.Data.SQLCeServer.SQLCeDataReader'"

    ya casi lo tenemos! en cuanto a Leando.

    Intente hacerlo mediante la estructura de tabals del diseñador pero no me aclaraba si consigo que funcione de esta forma no tengas la menor duda que pienso hacerlo mediante el server explorer que es mas comodo.

    martes, 29 de mayo de 2012 3:34
  • hola

    deberia ser

    Dim rdr As SqlCeDataReader = cmd.ExecuteReader()

    o sino

    Dim rowsafectadas As Integer = cmd.ExecuteNonQuery()

    segun necesites

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    martes, 29 de mayo de 2012 9:32
  • Hola:

    Observando el código fuente que has publicado, creo que hay algunos errores:

    > connectString = _
    > String.Format("DataSource=""{0}""; Password='{1}'", fileName, password)

    El parámetro es "Data Source", con un espacio en blanco.

    No encierres los valores entre comillas dobles, y menos el valor del parámetro Password, porque a la contraseña definida le estarás añadiendo dos comillas simples, una al principio y otra al final, con lo que la contraseña sería 'Control12' (con las comillas simples) en lugar de Control12.

    La cadena de conexión correcta sería:

      Dim fileName As String = "Check.sdf"
      Dim password As String = "Control12"

      Dim connectString As String = _
        String.Format("Data Source={0}; Password={1}", fileName, password)

    Se comprende que el archivo Check.sdf se creará en la misma carpeta que contiene el ejecutable final de tu aplicación.

    > Dim cn As New SqlCeConnection(connectString)
    > If cn.State = ConnectionState.Closed Then
    >    cn.Open()
    > End If

    Si declaras un nuevo objeto SqlCeConnection, la conexión siempre estará cerrada, por lo que sobra la verificación que haces. Aparte, la declaración la deberías de realizar dentro de un bloque Using ... End Using, a fin de que la conexión se cierre y destruya automáticamente cuando deje de ser útil:

    Try
      Using cn As New SqlCeConnection(connectString)
      Dim cmd As SqlCeCommand cn.CreateCommand()
            cmd.CommandText = "CREATE TABLE Codigos(" & _
              "CodigoBolsa nvarchar (14) not null, " & _
              "CodigoPrenda nvarchar (14), Estado nvarchar (5))"
            ' Abrimos la conexión.
            cn.Open()
            ' Ejecutamos el comando.
            cmd.ExecuteNonQuery()
      End Using
    Catch ex As Exception
      MessageBox.Show(ex.Message)
    End Ty

    > CREATE TABLE Codigos(CodigoBolsa nvchar ...

    Salvo que esté equivocado, creo que el tipo de datos nvchar no existe; existe el tipo de datos nvarchar

      CREATE TABLE Codigos (CodigoBolsa nvarchar ...

    >  Dim sql As String = "INSERT INTO Codigos" +
    >   "(CodigoBolsa, CodigoPrenda, Estado)" +
    >   " VALUES (@CB, @CP, @ES)"

    Como todos es una cadena alfanumérica (String), no es necesario que concatenes los valores con el signo +. Para separar el código en varias línea, utiliza el guión bajo:

      Dim sql As String = "INSERT INTO Codigos" _
       "(CodigoBolsa, CodigoPrenda, Estado)" _
       " VALUES (@CB, @CP, @ES)"

    Y protege todo tu código de errores no controlados encerrándo las instrucciones entre bloques Try ... Catch ... End Try.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    • Marcado como respuesta Sockar miércoles, 30 de mayo de 2012 10:58
    martes, 29 de mayo de 2012 11:17
    Moderador
  • SI SEÑOR!!!!! ya funciona!! me habeis echo un hombre feliz gracias a todos !!!!

    parece ser que habia algo mal en el codigo me base en la idea de Enrique y lo saque en 0, MUCHAS Gracias.

    siento haber sido tan pesado :D

    ahora toca un poquito mas, no tendreis 1 ejemplo de como pasar los datos que cree en el sdf a un csv o txt? voy a ver si encuentro 1 ejemplo en la red :D pero si lo teneis a mano seria el hombre mas feliz del mundo! :D

    miércoles, 30 de mayo de 2012 11:00
  • "Sockar" preguntó:

    > no tendreis 1 ejemplo de como pasar los datos que cree en el sdf
    > a un csv o txt?

    Tanto uno como otro son archivos de texto plano: la extensión *.csv son registros separados por comas, y la extensión *.txt pueden también estar los registros separados por comas o por cualquier otro carácter delimitador de campos.

    Una vez que tengas relleno un objeto DataTable con los datos de la tabla de tu archivo de SQL Server Compact, para generar un archivo de texto lo único que tienes que hacer es pasarle ese objeto DataTable a la función CreateTextDelimiterFile que encontrarás en el siguiente artículo, al cual te remito para su lectura completa, que no es mucha:

    Cómo crear un archivo de texto delimitado con los datos existentes en un objeto DataTable


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 30 de mayo de 2012 14:09
    Moderador