首页 新闻 会员 周边 捐助

C#获取数据表类型的问题

0
悬赏园豆:10 [已解决问题] 解决于 2010-07-21 18:41

部分程序为:

代码
SqlCommand cmd = new SqlCommand("select * from table", conn);
conn.Open();
//打开网络数据库连接
SqlDataAdapter sda = new SqlDataAdapter(cmd); //用SqlDataAdapter执行cmd

DataTable dtt
= new DataTable(); //填充数据表元数据信息
sda.FillSchema(dtt, SchemaType.Mapped);//这里用FillSchema方法,从网络数据库获取数据表元数据信息
for (int i = 0; i < dtt.Columns.Count; i++)
{
string columnName = "";
string type = "";
string Lenght = "";

columnName
= dtt.Columns[i].ColumnName;
type
= dtt.Columns[i].DataType.Name;
Lenght
= dtt.Columns[i].MaxLength.ToString();

   
switch (type.ToLower())
{
case "string":
createTableSql
= createTableSql + columnName + " [varchar] (" + Lenght + "),";
break;
case "int32":
createTableSql
= createTableSql + columnName + " [int],";
break;
case "int64":
createTableSql
= createTableSql + columnName + " [bigint],";
break;
case "int16":
createTableSql
= createTableSql + columnName + " [smallint],";
break;
case "object":
createTableSql
= createTableSql + columnName + " [binary],";
break;
case "boolean":
createTableSql
= createTableSql + columnName + " [bit],";
break;
case "datetime":
createTableSql
= createTableSql + columnName + " [datetime],";
break;
case "decimal":
createTableSql
= createTableSql + columnName + " [decimal],";
break;
case "double":
createTableSql
= createTableSql + columnName + " [float],";
break;
case "single":
createTableSql
= createTableSql + columnName + " [real],";
break;
case "byte":
createTableSql
= createTableSql + columnName + " [tinyint],";
break;
case "byte[]":
createTableSql
= createTableSql + columnName + " [image],";
break;
default:
createTableSql
= createTableSql + columnName + " [varchar](255),";
break;

}

}

 

 

我这里得到的type类型是int32、Byte[],但是在数据库中的类型是int、Image。我用什么方法可以得到“Image”这个字符串,并在程序中输出啊?

用上述方法对一些类型无法处理,比如数据库中money、decimal类型在c#中得到的type都是decimal,无法还原为money类型。(如果可以转化的话,提出来同样感谢!)

补充说明:程序的作用是获取网络数据库上查询出来字段的元数据(名称、类型、长度等),然后在本地建立一个具有相同类型的数据表,并导入查询的数据,导入的方法为:

         SqlDataReader drdata = cmd.ExecuteReader();     //用SqlDataReader再次执行cmd
                           SqlBulkCopy bulk = new SqlBulkCopy(NewConn);    //创建本地的SqlBulkCopy
                           bulk.DestinationTableName = "[" + temptable + "]";
                           bulk.WriteToServer(drdata);     //把网络数据表的数据COPY到本地临时数据表

因为SqlBulkCopy要求导入的目标表的结构要和原表结构完全相同,所以要得到原表字段类型。

如果哪位大侠能用其他方式实现同样操作,同样感谢!(本人第一次做此类型功能,方法如果过于复杂,请提出建议!)

flatter的主页 flatter | 初学一级 | 园豆:170
提问于:2010-07-21 17:41
< >
分享
最佳答案
0

SqlDataReader.GetSchemaTable()

然后查看 DataTypeName 列的值,这里记录的是数据库中的数据类型.

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2010-07-21 18:03
其他回答(1)
0

select * from sys.columns where [object_id]=object_id(table)
SELECT * FROM sys.types

查询系统表得到指定table的所有列属性。(需要有查询的用户有相关权限)

可以去查询一下上面二个系统表的字段代表的意思。

snryang | 园豆:24 (初学一级) | 2010-07-21 17:58
谢谢您的关注,但是我上面的查询的sql语句是随便写的,真正的sql有可能是多表联合查询的结果,所以查询系统表比较麻烦的
支持(0) 反对(0) flatter | 园豆:170 (初学一级) | 2010-07-21 18:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册