系列文章导航: 如何将数据导入到 SQL Server Compact Edition 数据库中(一) 如何将数据导入到 SQL Server Compact Edition 数据库中(二) 摘要:时隔近半年了,不知道大家是否还记得,我在本系列的第一篇文章的总结中提到,创建 SQL Server CE 数据库表

系列文章导航:

如何将数据导入到 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 语句的主要代码:

//生成创建数据库表结构的 SQL 语句。///privatestaticstringGenerateTableSchemaSql(IDbConnection connection,stringqueryString)

{

StringBuilder tableSql=newStringBuilder();

IDbCommand command=connection.CreateCommand();

command.CommandText=queryString;try{/*获取查询结果各列的元数据*/DataTable schemaTable=null;using(IDataReader reader=command.ExecuteReader(CommandBehavior.KeyInfo))

{

schemaTable=reader.GetSchemaTable();

}/*生成创建表定义语句*/stringtableName=schemaTable.Rows[0]["BaseTableName"].ToString();

tableSql.Append("CREATE TABLE [").Append(tableName).AppendLine("] (");/*生成各列的定义语句*/stringcolumnName;stringallowDBNull;

DataRow row;boolhasKey=false;

StringBuilder sbPKFields=newStringBuilder();for(inti=0; i

{if(i!=0) tableSql.AppendLine(",");

row=schemaTable.Rows[i];

columnName=(string)row["ColumnName"];

allowDBNull=((bool)row["AllowDBNull"]==true?"NULL":"NOT NULL");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("CONSTRAINT PK_").Append(tableName.Replace(" ", "_")).Append("PRIMARY KEY(").Append(pkFields).AppendLine(")");

}

tableSql.AppendLine(");");

}catch(Exception ex)

{

Debug.WriteLine(ex);

}returntableSql.ToString();

}

同样的,该方法也使用了 ADO.NET 的接口类,不依赖于具体的数据库类型。该方法的核心就是通过 IDataReader.GetSchemaTable 方法获取查询结果各列元数据,相关代码如下:

IDbCommand command=connection.CreateCommand();

command.CommandText=queryString;

DataTable schemaTable=null;using(IDataReader reader=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 数据类型。这个方法的代码如下所示:

//从 .NET 数据类型获取对应的 SQL Server CE 类型名称。///privatestaticstringGetSqlCeNativeType(Type systemType)

{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} 类型对应的 SQL Server CE 数据类型。", typeName));

}

}

当然,仅仅知道列的数据类型还不够,我们需要为某些列的数据类型加上长度、精度或小数位数等列大小信息。可以通过下面的方法实现:

//从 ColumnSchemaRow 获取 SQL Server CE 数据类型。///privatestaticstringGetSqlCeDataType(DataRow columnSchemaRow)

{

Type type=columnSchemaRow["DataType"]asType;stringdataType=GetSqlCeNativeType(type);switch(dataType)

{case"numeric":

Int16 precision=(Int16)columnSchemaRow["NumericPrecision"];

Int16 scale=(Int16)columnSchemaRow["NumericScale"];

Int32 colsize=(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 数据库所有用户表名的数组:

//从一个打开的 SQL Server 数据库连接获取数据库的表名数组。///privatestaticstring[] GetTableNames(IDbConnection connection)

{

IDbCommand command=connection.CreateCommand();//从 SQL Server 信息架构视图获取 Northwind 数据库所有表的名称command.CommandText=@"SELECT * FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_TYPE='BASE TABLE' AND TABLE_CATALOG='Northwind'";

ListtableNames=newList();using(IDataReader reader=command.ExecuteReader())

{while(reader.Read())

{

tableNames.Add(reader["TABLE_NAME"].ToString());

}

}returntableNames.ToArray();

}

有了 GetTableNames 方法,我们就可以一次性对 Northwind 数据库的所有用户表生成相应的创建 SQL Server CE 数据库表结构的 SQL 语句。

staticvoidMain(string[] args)

{stringconnectionString="Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";

IDbConnection connection=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日

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(三)相关推荐

  1. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(五)

    系列文章导航: 如何将数据导入到 SQL Server Compact Edition 数据库中(一) 如何将数据导入到 SQL Server Compact Edition 数据库中(二) 如何将数 ...

  2. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(四)

    系列文章导航: 如何将数据导入到 SQL Server Compact Edition 数据库中(一) 如何将数据导入到 SQL Server Compact Edition 数据库中(二) 如何将数 ...

  3. 如何将数据导入到 SQL Server Compact Edition 数据库中(四)

    系列文章导航: 如何将数据导入到 SQL Server Compact Edition 数据库中(一) 如何将数据导入到 SQL Server Compact Edition 数据库中(二) 如何将数 ...

  4. 将excel数据导入到SQL server数据库,SQL server引入导入excel报表,如何解决“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”问题

    目录 版本: 文章主要内容: 未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序 新版本不同的设置的地方: 版本: SQL server2018.ex ...

  5. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息"is formatted to support  1 media fami ...

  6. java sqlldr导入_使用SQL*LOADER将TXT或CSV数据导入ORACLE(转)

    一.简介 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件迁移到ORACLE数据库中.SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIREC ...

  7. excel导入mysql语句_求助:用SQL语句从Excel将数据导入到SQL数据库

    这个是Excel的,比如是test.xls 欠费年份 欠费开始月份 欠费结束月份 应缴金额(月租) 2001             9                 12            9 ...

  8. 超大Sql文件_超大文件_mysql数据导入到mycat数据库_亲测好用---Linux运维工作笔记053

    对于mycat数据导入,最近一直在研究,因为有个客户的mysql数据库中,单表数据已经30多个GB, 存了上亿条的数据. 查询速度远远跟不上需求了,这个时候,我做了一个mycat集群,用了22台cen ...

  9. 怎样将Excel中的数据导入到SQL Server 2000数据库中

    1.打开企业管理器,打开要导入数据的数据库,在表上按右键,所有任务-->导入数据,弹出DTS导入/导出向导,按 下一步 , 2.选择数据源 Microsoft Excel 97-2000,文件名 ...

最新文章

  1. ipv6下单播。组播 泛播
  2. 静态链接库和动态链接库(转)
  3. 前端基础知识整理汇总(上)
  4. 在HTML打开已安装的App,未安装跳转到对应的下载链接
  5. 【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作
  6. Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)
  7. 限定位宽比较大小_自己之前买电脑整理的一些电脑知识,比较粗糙,仅供参考。...
  8. 万份销量,五星好评!这门Python神作刷爆朋友圈!
  9. mongodb mapreduce用法
  10. mysql的数据类型5---enum与set类型
  11. 10款开源网上教学课程管理系统
  12. 灯谜大全查询易语言代码
  13. 《锋利的JQuery》读书笔记
  14. 直播带货软件开发,android的仿制直播点赞功能特效
  15. I2C | i2c_msg
  16. keras.datasets.imdb.py 源码分析
  17. 【Python】迭代法求解非线性方程及方程组
  18. 陶森大学计算机专业收入水平,2019PayScale计算机专业本科薪水排行
  19. android源码模块编译错误,【转】Android 源码编译make的错误处理--不错
  20. java考试真题6_JAVA认证考试历年真题:SCJP认证试题解析6

热门文章

  1. 邂逅你,是我最美的相遇
  2. 驾驶证学法减分助手小程序源码(带搭建视频教程)
  3. 学好英语的42个经典要诀
  4. 5Gwifi和手机5G区别
  5. GitHub基本操作
  6. vue-cropper图片裁剪网络图片展示时跨域
  7. 苹果ipad有哪几款_iPad 已经出品十年了,缅怀一下
  8. matlab半小提琴图,不会编程,也可以画小提琴图啦!
  9. 【系统测试二】移动端测试类型和测试点
  10. echarts实现各省市地图、中国地图