系列文章导航:
如何将数据导入到 SQL Server Compact Edition 数据库中(一)
如何将数据导入到 SQL Server Compact Edition 数据库中(二)
摘要:时隔近半年了,不知道大家是否还记得,我在本系列的第一篇文章的总结中提到,创建 SQL Server CE 数据库表结构的 SQL 语句是可以自动生成的。那么本系列的第三篇文章就向大家介绍一种比较简单的方法。
ADO.NET 中的 IDataReader.GetSchemaTable 方法可以返回一个 DataTable,它描述了 IDataReader 查询结果中各列的元数据。列的元数据包含了列的名称、数据类型、大小、是否为主键字段、是否为自动增长字段……等等。有了这些元数据,我们就可以通过编写几段 C#/VB.NET 代码,实现创建 SQL Server CE 数据库表结构的 SQL 语句的自动生成。以下方法是生成创建表 SQL 语句的主要代码:
///<summary>
///生成创建数据库表结构的SQL语句。
///</summary>
privatestaticstringGenerateTableSchemaSql(IDbConnectionconnection,stringqueryString)
{
StringBuildertableSql=newStringBuilder();
IDbCommandcommand=connection.CreateCommand();
command.CommandText=queryString;
try
{
/*获取查询结果各列的元数据*/
DataTableschemaTable=null;
using(IDataReaderreader=command.ExecuteReader(CommandBehavior.KeyInfo))
{
schemaTable=reader.GetSchemaTable();
}
/*生成创建表定义语句*/
stringtableName=schemaTable.Rows[0]["BaseTableName"].ToString();
tableSql.Append("CREATETABLE[").Append(tableName).AppendLine("](");
/*生成各列的定义语句*/
stringcolumnName;
stringallowDBNull;
DataRowrow;
boolhasKey=false;
StringBuildersbPKFields=newStringBuilder();
for(inti=0;i<schemaTable.Rows.Count;i++)
{
if(i!=0)tableSql.AppendLine(",");
row=schemaTable.Rows[i];
columnName=(string)row["ColumnName"];
allowDBNull=((bool)row["AllowDBNull"]==true?"NULL":"NOTNULL");
if((bool)row["IsKey"])
{
sbPKFields.AppendFormat("[{0}],",columnName);
hasKey=true;
}
tableSql.AppendFormat("[{0}]{1}{2}",columnName,GetSqlCeDataType(row),allowDBNull);
}
/*生成主键约束语句*/
if(hasKey)
{
stringpkFields=sbPKFields.ToString().TrimEnd(',');
tableSql.AppendLine(",");
tableSql.Append("CONSTRAINTPK_").Append(tableName.Replace(" ", "_")).Append("PRIMARYKEY(").Append(pkFields).AppendLine(")");
}
tableSql.AppendLine(");");
}
catch(Exceptionex)
{
Debug.WriteLine(ex);
}
returntableSql.ToString();
}
同样的,该方法也使用了 ADO.NET 的接口类,不依赖于具体的数据库类型。该方法的核心就是通过 IDataReader.GetSchemaTable 方法获取查询结果各列元数据,相关代码如下:
IDbCommandcommand=connection.CreateCommand();
command.CommandText=queryString;
DataTableschemaTable=null;
using(IDataReaderreader=command.ExecuteReader(CommandBehavior.KeyInfo))
{
schemaTable=reader.GetSchemaTable();
}
首先,IDbCommand 的 CommandText 属性一般是针对一个表的 SELECT 查询语句,如:SELECT * FROM Customers。其次,IDbCommand.ExecuteReader 方法必须传入 CommandBehavior.KeyInfo 参数,这样才能获取到列的主键元数据。最后,通过 IDataReader.GetSchemaTable 方法返回一个包含查询结果所有列的元数据的 DataTable。关于 IDataReader.GetSchemaTable 方法的详细使用说明,请阅读《HOW TO:使用 DataReader GetSchemaTable 方法和 Visual C# .NET 检索列架构》。
IDataReader.GetSchemaTable 返回的 SchemaTable 对列数据类型的描述是用相应的 .NET 数据类型,如 SQL Server CE 的 int 类型对应的是 .NET 的 System.Int32 类型。另外需要注意的是,由于 Windows Mobile 只支持 Unicode 编码,因此 SQL Server CE 只支持 NChar, NVarChar 和 NText 等 Unicode 字符数据类型,而不支持 Char, VarChar 和 Text 等非 Unicode 字符数据类型。所以,我们需要编写一个方法,它根据列的 .NET 数据类型找到对应的 SQL Server CE 数据类型。这个方法的代码如下所示:
///<summary>
///从.NET数据类型获取对应的SQLServerCE类型名称。
///</summary>
privatestaticstringGetSqlCeNativeType(TypesystemType)
{
stringtypeName=systemType.ToString();
switch(typeName)
{
case"System.Boolean":
return"bit";
case"System.Byte":
return"tinyint";
case"System.Byte[]":
return"image";
case"System.DateTime":
return"datetime";
case"System.Decimal":
return"numeric";
case"System.Double":
return"float";
case"System.Guid":
return"uniqueidentifier";
case"System.Int16":
return"smallint";
case"System.Int32":
return"integer";
case"System.Int64":
return"bigint";
case"System.Single":
return"real";
case"System.String":
return"nvarchar";
default:
thrownewApplicationException(string.Format("找不到{0}类型对应的SQLServerCE数据类型。",typeName));
}
}
当然,仅仅知道列的数据类型还不够,我们需要为某些列的数据类型加上长度、精度或小数位数等列大小信息。可以通过下面的方法实现:
///<summary>
///从ColumnSchemaRow获取SQLServerCE数据类型。
///</summary>
privatestaticstringGetSqlCeDataType(DataRowcolumnSchemaRow)
{
Typetype=columnSchemaRow["DataType"]asType;
stringdataType=GetSqlCeNativeType(type);
switch(dataType)
{
case"numeric":
Int16precision=(Int16)columnSchemaRow["NumericPrecision"];
Int16scale=(Int16)columnSchemaRow["NumericScale"];
Int32colsize=(Int32)columnSchemaRow["ColumnSize"];
if(precision!=0&&scale!=0&&scale!=255)
{
dataType=string.Format("{0}({1},{2})",dataType,precision,scale);
}
elseif(scale==255&&colsize==8)
{
dataType="money";
}
break;
case"nvarchar":
intcolumnSize=(int)columnSchemaRow["ColumnSize"];
if(columnSize>4000)
{
dataType="ntext";
}
else
{
dataType=string.Format("{0}({1})",dataType,columnSize);
}
break;
}
returndataType;
}
关于 SQL Server 2005 Compact Edition 数据类型的描述,详细请参考联机丛书。使用上面的几段代码,对 SQL Server 2000 自带的 Northwind 数据库的 Customers 表生成创建数据库表的 SQL 语句,生成结果如下:
CREATETABLE[Customers](
[CustomerID]nvarchar(5)NOTNULL,
[CompanyName]nvarchar(40)NOTNULL,
[ContactName]nvarchar(30)NULL,
[ContactTitle]nvarchar(30)NULL,
[Address]nvarchar(60)NULL,
[City]nvarchar(15)NULL,
[Region]nvarchar(15)NULL,
[PostalCode]nvarchar(10)NULL,
[Country]nvarchar(15)NULL,
[Phone]nvarchar(24)NULL,
[Fax]nvarchar(24)NULL,
CONSTRAINTPK_CustomersPRIMARYKEY([CustomerID])
);
对于 SQL Server 2000,我们可以从信息架构视图查询INFORMATION_SCHEMA.TABLES 出数据库有哪些表,并一次性对所有表进行生成。以下是 INFORMATION_SCHEMA.TABLES 视图各列的说明:
列名
数据类型
说明
TABLE_CATALOG |
nvarchar(128)
|
表限定符。 |
TABLE_SCHEMA |
nvarchar(128)
|
包含该表的架构的名称。 |
TABLE_NAME |
sysname |
表名。 |
TABLE_TYPE |
varchar(10)
|
表的类型。可以是 VIEW 或 BASE TABLE。 |
我们可以通过以下方法获得 Northwind 数据库所有用户表名的数组:
///<summary>
///从一个打开的SQLServer数据库连接获取数据库的表名数组。
///</summary>
privatestaticstring[]GetTableNames(IDbConnectionconnection)
{
IDbCommandcommand=connection.CreateCommand();
//从SQLServer信息架构视图获取Northwind数据库所有表的名称
command.CommandText=@"SELECT*FROMINFORMATION_SCHEMA.TABLES
WHERETABLE_TYPE='BASETABLE'ANDTABLE_CATALOG='Northwind'";
List<string>tableNames=newList<string>();
using(IDataReaderreader=command.ExecuteReader())
{
while(reader.Read())
{
tableNames.Add(reader["TABLE_NAME"].ToString());
}
}
returntableNames.ToArray();
}
有了 GetTableNames 方法,我们就可以一次性对 Northwind 数据库的所有用户表生成相应的创建 SQL Server CE 数据库表结构的 SQL 语句。
staticvoidMain(string[]args)
{
stringconnectionString="DataSource=(local);InitialCatalog=Northwind;IntegratedSecurity=True";
IDbConnectionconnection=newSqlConnection(connectionString);
connection.Open();
string[]tableNames=GetTableNames(connection);
stringqueryString,createTableSql;
foreach(stringtableNameintableNames)
{
queryString=string.Format("select*from[{0}]",tableName);
createTableSql=GenerateTableSchemaSql(connection,queryString);
Console.WriteLine(createTableSql);
Debug.WriteLine(createTableSql);
}
connection.Close();
Console.Read();
}
示例程序运行效果如下图所示:
总结:阅读完本文,相信你已经了解了如何利用 ADO.NET 的IDataReader.GetSchemaTable 方法获得服务器端数据库表的元数据,并用于生成对应的创建 SQL Server CE 数据库表的 SQL 语句。本系列文章可能还会有更精彩的续篇,我会将平时积累的关于 SQL Server CE 数据导入的一些经验充实到本系列中。
示例代码下载:sqlce_data_import3.rar
更新记录:
2008-2-9 修正对money数据类型的支持,修正对包含空格的表名的支持。
作者:黎波
博客:http://upto.cnblogs.com/
日期:2008年1月31日
分享到:
相关推荐
用sqlserver 创建.sdf数据库文件其实很简单 步骤如下: (1)打开sqlserver2008 (2)服务器类型选项中选择sqlserver compact edition (3)数据库文件选项选择新建数据库到新建数据库页面 (4)填写数据库名和密码确认就ok了
3. 数据导入导出:将数据从其他格式导入SQL Server,或将SQL Server数据导出到其他格式。 4. 备份与恢复:定期备份数据库以防止数据丢失,当需要时进行恢复操作。 5. 性能监控:通过工具监控数据库性能,识别瓶颈并...
综上所述,这个程序利用C#语言,实现了SQL Server 2000数据库到适用于PDA的SQL Server Compact Edition数据库的转换,确保了数据的一致性,从而方便用户在移动设备上继续使用和访问原有的数据库内容。对于开发者来说...
这可能涉及到读取PDA数据库中的记录,通过网络连接将数据传输到服务器,然后在SQL Server上进行相应的插入、更新操作。反之亦然,服务器端的数据变化也需要同步到PDA。这个过程可能需要用到触发器、轮询或其他同步...
SQLCEQuery是一个针对SQL Server Compact Edition 3.5(SQLCE3.5)的工具,其主要功能是将数据从其他数据库系统,如SQL Server或Access,转换为SQLCE3.5支持的.SDF文件格式。这个工具对于那些希望在移动设备或资源...
4. **数据导入导出**:支持将数据从其他数据源导入到 SQL Server Compact,或者将数据导出到其他格式,如 CSV 或 Excel。这对于数据迁移或集成提供了便利。 5. **版本兼容性**:SqlCe40Toolbox 是专为 SQL Server ...
综上所述,"3SQLCESample"是一个实用的示例项目,它演示了如何在C#环境中利用Visual Studio 2008和ADO.NET技术,将Access数据库转换为SQL Server Compact Edition数据库,对于学习数据库迁移和C#数据库编程的初学者...
标题“SQL转换为SQLCE”涉及的是将标准的SQL(结构化查询语言)数据库转换成SQL Server Compact Edition(SQLCE)的过程。SQLCE是一个轻量级、嵌入式数据库引擎,适用于移动设备和桌面应用程序,它不需要单独的...
在本示例中,我们将探讨如何使用C#编程语言操作SQL Server Compact Edition(SQL CE)数据库,并将数据导入到SQL Server数据库,以及导出为Excel文件。SQL CE是一个轻量级、嵌入式的关系型数据库管理系统,适合用于...
SQL CE(SQL Server Compact Edition)是微软的一款轻量级数据库,适合移动和嵌入式设备。工具对SQL CE的支持使得开发者能在资源有限的环境下实现数据库管理。 最后,ORACLE作为全球最大的数据库供应商,其数据库...
5. 导入导出数据:支持将数据从其他格式(如CSV、Excel)导入到SqlCE数据库,或者将数据库中的数据导出到这些格式。 6. 错误处理与日志记录:良好的错误处理机制可以及时捕获并报告数据库操作过程中出现的问题,...
8. SQL Server Compact Edition:一个轻量级的、嵌入式数据库引擎,适用于桌面和移动应用。 9. Analysis Services和Reporting Services:提供商业智能和报表服务,用于数据挖掘和复杂数据分析。 在压缩包中的...
SQLCE SDF 数据文件查看器CompactView_1.4.2.0是一款专门设计用于查看Windows CE(wince)系统中使用到的SQL Server Compact Edition(SQLCE)数据文件的应用程序。这款工具允许用户轻松地浏览和分析存储在SDF文件中...
SQLCE(SQL Server Compact Edition)是一款轻量级的数据库管理系统,由微软开发,适用于桌面和移动应用程序。它提供了与标准SQL Server类似的功能,但体积更小,无需单独的服务器进程,可以直接嵌入到应用程序中。...
SDF文件,全称为Structured Data File,通常与Microsoft SQL Server Compact Edition相关联,是一种轻量级的数据库格式,广泛应用于移动设备和嵌入式系统中。尽管小巧,但SDF文件依然具备了SQL数据库的核心功能,如...
CEQuery 是一个针对 SQL Server Compact Edition(SQLCE)数据库的强大管理与操作工具,主要用于简化在移动设备或嵌入式系统上对 SQLCE 数据库的管理和查询。SQLCE 是微软推出的一种轻量级、嵌入式的数据库管理系统...
在Windows CE(简称WinCE)平台上进行开发时,SQL Server Compact Edition(SQL CE)是一个非常重要的数据库管理系统。它为移动设备和嵌入式系统提供了轻量级、离线数据库解决方案。在本文中,我们将深入探讨如何在...
接下来,将Access中的数据逐条导入到SQL CE中,可能需要使用SqlCeCommand对象执行INSERT语句。 在这个过程中,还需要处理一些潜在的问题,例如数据类型不兼容、字段长度限制等。Access和SQL CE的数据类型有所不同,...
数据存储方面,由于这是一个简单的系统,很可能采用了关系型数据库如SQL Server Compact Edition或SQLite。在C#中,可以使用ADO.NET进行数据库操作,通过 SqlConnection、SqlCommand、SqlDataAdapter等类与数据库...