WinForms C # - SQL Server CE - SqlCeDataReader perd ses données?

c# sqlbulkcopy sql-server sql-server-ce winforms

Question

J'essaie de copier des données d'une base de données SQL Server vers une base de données locale SQL Server CE.

Voici ma méthode:

private const string LOCAL_SDF_FILE = "LocalDB.sdf";
private const string LOCAL_CONN_STRING = "Data Source='|DataDirectory|LocalDB.sdf'; LCID=1033; Password=3C670F044A; Encrypt=TRUE;";
private const string SOURCE_CONN_STRING = "Data Source=SQL\\SERVER;Initial Catalog=DB;Integrated Security=True;Pooling=False";

public static void CreateDB()
{
        if (File.Exists(LOCAL_SDF_FILE))
        {
            File.Delete(LOCAL_SDF_FILE);
        }

        SqlCeEngine engine = new SqlCeEngine(LOCAL_CONN_STRING);
        engine.CreateDatabase();
        engine.Dispose();

        SqlCeConnection localCnx = null;

        try
        {
            localCnx = new SqlCeConnection(LOCAL_CONN_STRING);
            localCnx.Open();

            SqlCeCommand localCmd = localCnx.CreateCommand();

            #region CREATE TABLE t_TypeConfig
            localCmd.CommandText = @"CREATE TABLE t_TypeConfig(
                                        TypeConfig_ID int IDENTITY(1,1) NOT NULL,
                                        TypeConfig_Name nvarchar(50) NOT NULL,
                                        TypeConfig_IsVisible bit NOT NULL,
                                        CONSTRAINT pk_TypeConfigID PRIMARY KEY (TypeConfig_ID)
                                    )";

            localCmd.ExecuteNonQuery();
            #endregion

            using (SqlConnection sourceCnx = new SqlConnection(SOURCE_CONN_STRING))
            {
                try
                {
                    sourceCnx.Open();

                    SqlCommand SourceCmd = sourceCnx.CreateCommand();
                    SourceCmd.CommandText = "SELECT * FROM t_TypeConfig";
                    SqlDataReader reader = SourceCmd.ExecuteReader();

                    using (SqlCeBulkCopy bulkCopy = new SqlCeBulkCopy(LOCAL_CONN_STRING))
                    {
                        bulkCopy.DestinationTableName = "t_TypeConfig";

                        try
                        {
                            // Write from the source (DB server) to the destination (local wibe)
                            bulkCopy.WriteToServer(reader);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        finally
                        {
                            reader.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    sourceCnx.Close();
                }
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString(), "An error occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            localCnx.Close();
        }
    }
  • Créer un fichier SQL Server CE et un exemple de table ( t_TypeConfig ) -> ok.
  • Obtenir des données dans le lecteur à partir d'une connexion SQL Server -> ok.

Mais lorsque je veux remplir, via SqlCeBulkCopy , ma table de base de données locale avec le lecteur que je viens de remplir précédemment, je vois via Visual Studio Watcher que le reader ne contient plus les données!

Je ne sais pas pourquoi. Toujours à la recherche d'une solution mais je ne comprends pas? Peut-être parce que l'utilisation?

J'ai également essayé de convertir le SqlDataReader en une variable SqlCeDataReader à donner dans le paramètre SqlCeBulkCopy.WriteToServer() mais il ne peut pas convertir d'un SqlCeBulkCopy.WriteToServer() à l'autre.

Des idées?

Merci beaucoup,

Hellcat.

Réponse acceptée

La solution consiste donc, grâce aux gars dans les commentaires, à donner comme paramètre à SqlCeBulkCopy.WriteToServer() un DataTable au lieu d'un SqlDataReader ou IDataReader . Cela fonctionne pour moi en ce moment.

Ajouté ceci:

SqlDataReader reader = SourceCmd.ExecuteReader();
DataTable SqlDatatable = new DataTable();
SqlDatatable.Load(reader);

Alors :

bulkCopy.WriteToServer(SqlDatatable);

Merci les gars.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi