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();
}
}
- 创建 SQL 服务器 CE 文件和示例 table (
t_TypeConfig
) -> 确定。
- 从 SQL 服务器连接获取数据到 reader -> ok。
但是当我想通过 SqlCeBulkCopy
填充我的本地数据库 table 和我之前刚刚填充的 reader 时,我通过 Visual Studio 观察者看到 reader
不再包含数据!
我不知道为什么。仍在寻找解决方案,但我不明白?也许是因为使用?
我还尝试将 SqlDataReader
转换为 SqlCeDataReader
变量以提供 SqlCeBulkCopy.WriteToServer()
参数,但它无法从一个转换为另一个。
有什么想法吗?
非常感谢,
地狱猫。
好的,感谢评论中的各位,解决方案是将 SqlCeBulkCopy.WriteToServer()
作为参数提供 DataTable
而不是 SqlDataReader
或 IDataReader
。
它现在对我有用。
添加了这个:
SqlDataReader reader = SourceCmd.ExecuteReader();
DataTable SqlDatatable = new DataTable();
SqlDatatable.Load(reader);
然后:
bulkCopy.WriteToServer(SqlDatatable);
谢谢大家。
我正在尝试将数据从 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();
}
}
- 创建 SQL 服务器 CE 文件和示例 table (
t_TypeConfig
) -> 确定。 - 从 SQL 服务器连接获取数据到 reader -> ok。
但是当我想通过 SqlCeBulkCopy
填充我的本地数据库 table 和我之前刚刚填充的 reader 时,我通过 Visual Studio 观察者看到 reader
不再包含数据!
我不知道为什么。仍在寻找解决方案,但我不明白?也许是因为使用?
我还尝试将 SqlDataReader
转换为 SqlCeDataReader
变量以提供 SqlCeBulkCopy.WriteToServer()
参数,但它无法从一个转换为另一个。
有什么想法吗?
非常感谢,
地狱猫。
好的,感谢评论中的各位,解决方案是将 SqlCeBulkCopy.WriteToServer()
作为参数提供 DataTable
而不是 SqlDataReader
或 IDataReader
。
它现在对我有用。
添加了这个:
SqlDataReader reader = SourceCmd.ExecuteReader();
DataTable SqlDatatable = new DataTable();
SqlDatatable.Load(reader);
然后:
bulkCopy.WriteToServer(SqlDatatable);
谢谢大家。