C# WinForms - SQL Server CE - SqlCeDataReader 丢失数据?

C# WinForms - SQL Server CE - SqlCeDataReader loses its data?

我正在尝试将数据从 SQL 服务器数据库复制到 SQL 服务器 CE 本地数据库。

这是我的方法:

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();
        }
    }

但是当我想通过 SqlCeBulkCopy 填充我的本地数据库 table 和我之前刚刚填充的 reader 时,我通过 Visual Studio 观察者看到 reader 不再包含数据!

我不知道为什么。仍在寻找解决方案,但我不明白?也许是因为使用?

我还尝试将 SqlDataReader 转换为 SqlCeDataReader 变量以提供 SqlCeBulkCopy.WriteToServer() 参数,但它无法从一个转换为另一个。

有什么想法吗?

非常感谢,

地狱猫。

好的,感谢评论中的各位,解决方案是将 SqlCeBulkCopy.WriteToServer() 作为参数提供 DataTable 而不是 SqlDataReaderIDataReader。 它现在对我有用。

添加了这个:

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

然后:

bulkCopy.WriteToServer(SqlDatatable);

谢谢大家。