部分程序为:
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要求导入的目标表的结构要和原表结构完全相同,所以要得到原表字段类型。
如果哪位大侠能用其他方式实现同样操作,同样感谢!(本人第一次做此类型功能,方法如果过于复杂,请提出建议!)
SqlDataReader.GetSchemaTable()
然后查看 DataTypeName 列的值,这里记录的是数据库中的数据类型.
select * from sys.columns where [object_id]=object_id(table)
SELECT * FROM sys.types
查询系统表得到指定table的所有列属性。(需要有查询的用户有相关权限)
可以去查询一下上面二个系统表的字段代表的意思。