C # WinForms - SQL Server CE - SqlCeDataReader verliert seine Daten?

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

Frage

Ich versuche, Daten von der SQL Server-Datenbank in die lokale SQL Server CE-Datenbank zu kopieren.

Hier ist meine Methode:

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();
        }
    }
  • Erstellen Sie die SQL Server CE-Datei und die Beispieltabelle ( t_TypeConfig ) -> ok.
  • Holen Sie Daten in den Leser von SQL Server Verbindung -> ok.

Aber wenn ich via SqlCeBulkCopy meine lokale Datenbanktabelle mit dem Leser, den ich gerade gefüllt habe, füllen möchte, SqlCeBulkCopy ich via Visual Studio Watcher, dass der reader die Daten nicht mehr enthält!

Ich weiß nicht warum. Immer noch auf der Suche nach einer Lösung, aber ich verstehe es nicht? Vielleicht weil die Verwendung?

Ich habe auch versucht, den SqlDataReader in eine SqlCeDataReader Variable zu konvertieren, um den Parameter SqlCeBulkCopy.WriteToServer() , aber er kann nicht von einem in den anderen konvertieren.

Irgendwelche Ideen?

Danke vielmals,

Hellcat.

Akzeptierte Antwort

Okay, also ist die Lösung, dank Jungs in Kommentaren, SqlCeBulkCopy.WriteToServer() eine DataTable als Parameter anstelle von SqlDataReader oder IDataReader . Es funktioniert jetzt für mich.

Hinzugefügt:

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

Dann :

bulkCopy.WriteToServer(SqlDatatable);

Danke Leute.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow