#####如何知道datatable中,每一列为数字类型时的小数位数??

tongki 2010-02-09 12:15:06
在Fill后,如何知道datatable中,每一列为数字类型时的小数位数??

VB6中,可以通过recordSet来获取。但Datatable.Columns[i]中,好像没有这个小数位数的属性?
...全文
1443 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongki 2010-02-22
  • 打赏
  • 举报
回复
用GetSchemaTable是个好办法,稍微改动一下qldsrx(青龙白虎)的代码。
只是这个办法要求改变以前的SQLHelper,以及多转一个SchemaTable参数给表格控制对象。

测试代码如下:

public partial class Form2 : Form
{
private DataTable dtSchema = new DataTable();
public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
DataTable dt = ExecuteDataTableAndSchema("select * from Cg_PurSort", null, CommandType.Text, "myTable", out dtSchema);

string s = "";
for (int i = 0; i < dtSchema.Rows.Count; i++)
{
//for (int j = 0; j < dtSchema.Columns.Count; j++)
//{
// s += dtSchema.Columns[j].ToString(); ;
//}
s += dtSchema.Rows[i]["ColumnName"].ToString() + "小数位:" + dtSchema.Rows[i]["NumericScale"].ToString();
s += "\r\n";
}

MessageBox.Show(s);
}


public static IDbConnection GetConnection()
{
IDbConnection connection = null;

if (connection == null)//判断连接是否为空
{
connection = new SqlConnection();

connection.ConnectionString = "server=.;user id=sa;pwd=;database=C1Grid";//连接数据库的字符串 }

if (connection.State == ConnectionState.Closed)
{
connection.Open();//打开数据库连接

}
}

return connection;
}

/// <summary>
/// 执行一个 SQL 语句,返回一个数据表带表结构信息(传递连接)
/// </summary>
public static DataTable ExecuteDataTableAndSchema(string sqltext, Dictionary<string, object> parameters, CommandType ctyp, IDbConnection conn, string tableName, out DataTable dtSchema)
{
DataTable dt = null;
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.Connection = conn;
cmd.CommandType = ctyp;
cmd.CommandText = sqltext;
if (parameters != null)
foreach (KeyValuePair<string, object> p in parameters)
{
IDataParameter idparam = cmd.CreateParameter();
idparam.ParameterName = p.Key;
idparam.Value = p.Value;
cmd.Parameters.Add(idparam);
}

using (IDataReader idr = cmd.ExecuteReader())
{
dtSchema = idr.GetSchemaTable();
dt = new DataTable(tableName);
dt.Load(idr);
}
}
return dt;
}

/// <summary>
/// 执行一个 SQL 语句,返回一个数据表带表结构信息(传递连接名)
/// </summary>
public static DataTable ExecuteDataTableAndSchema(string sqltext, Dictionary<string, object> parameters, CommandType ctyp, string tableName, out DataTable dtSchema)
{
using (IDbConnection conn = GetConnection())
{
return ExecuteDataTableAndSchema(sqltext, parameters, ctyp, conn,tableName, out dtSchema);
}
}

}
toxuecheng111 2010-02-22
  • 打赏
  • 举报
回复
学习了。。。。。。。。
tongki 2010-02-22
  • 打赏
  • 举报
回复
感谢qldsrx(青龙白虎),放假刚回来。我试试
flyerwing 2010-02-12
  • 打赏
  • 举报
回复
引用 7 楼 loginczh 的回复:
显示的时候TOString("F5")表示后面保留5位小数点 F1 是1位 F2 2位 以此类推

需要这么搞地
就是忘了不进行类型转换能不能搞通了!
qldsrx 2010-02-12
  • 打赏
  • 举报
回复
引用 37 楼 lzsh0622 的回复:
引用 36 楼 tongki_8 的回复:几乎所有的报表都是通过存储过程返回的。只是如果通过ado6.0的recordset可以获得,而不是ado.net没有recordset,如果DataTable没有存储列的数据精度信息,看来这个问题就很难解决了

直接查询出DataTable,也没有完整的结构信息.

我用过列的宽度信息,也是通过通过执行两次select语句完成的。

你的这个做法倒是给我了启发,其实也不用两次select语句,一次即可完成,只要稍作改动即可。
分享下我的DBManager中获取DataTable的函数,添加了Schema的获取。

public static IDbConnection GetConnection(string name)
{
IDbConnection connection = null;
string connectionString = ConfigurationManager.ConnectionStrings[name].ConnectionString;
string providerName = ConfigurationManager.ConnectionStrings[name].ProviderName;

if (providerName == "System.Data.SqlClient")
{
connection = new SqlConnection(connectionString);
}
else if (providerName == "System.Data.OracleClient")
{
connection = new OracleConnection(connectionString);
}
connection.Open();
return connection;
}

/// <summary>
/// 执行一个 SQL 语句,返回一个数据表带表结构信息(传递连接)
/// </summary>
public static DataTable ExecuteDataTableAndSchema(string sqltext, Dictionary<string, object> parameters, CommandType ctyp, IDbConnection conn, List<string> oracleCursors, out DataTable dtSchema)
{
DataTable dt = null;
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.Connection = conn;
cmd.CommandType = ctyp;
cmd.CommandText = sqltext;
if (parameters != null)
foreach (KeyValuePair<string, object> p in parameters)
{
IDataParameter idparam = cmd.CreateParameter();
idparam.ParameterName = p.Key;
idparam.Value = p.Value;
cmd.Parameters.Add(idparam);
}
if (oracleCursors != null)
foreach (var oracleCursor in oracleCursors)
{
cmd.Parameters.Add(new OracleParameter(oracleCursor, OracleType.Cursor) { Direction = ParameterDirection.Output });
}
using (IDataReader idr = cmd.ExecuteReader())
{
dtSchema = idr.GetSchemaTable();
dt = new DataTable("Table1");
dt.Load(idr);
}
}
return dt;
}

/// <summary>
/// 执行一个 SQL 语句,返回一个数据表带表结构信息(传递连接名)
/// </summary>
public static DataTable ExecuteDataTableAndSchema(string sqltext, Dictionary<string, object> parameters, CommandType ctyp, string dbname, List<string> oracleCursors, out DataTable dtSchema)
{
using (IDbConnection conn = GetConnection(dbname))
{
return ExecuteDataTableAndSchema(sqltext, parameters, ctyp, conn, oracleCursors, out dtSchema);
}
}

这里的参数之所以用Dictionary<string, object> parameters,是为了通用化,在任何数据库下使用,同时方便了序列化。
oracleCursors是Oracle存储过程专用的,用不到可以为null。
既然要用到这个方法,dtSchema肯定是要给个变量接收的啦,里面存放了数据结构。
zhouwei7682719 2010-02-12
  • 打赏
  • 举报
回复
天天向上,得好好学习!
xray2005 2010-02-09
  • 打赏
  • 举报
回复
ToString("F3");//小数点后3位
小学码农 2010-02-09
  • 打赏
  • 举报
回复
比如:100.12 TOString(“F5”)后 为 100.12000
小学码农 2010-02-09
  • 打赏
  • 举报
回复
显示的时候TOString("F5")表示后面保留5位小数点 F1 是1位 F2 2位 以此类推
tongki 2010-02-09
  • 打赏
  • 举报
回复
col1 col2 col3
1 255.1 1000.02
1.2 30 201.256
8 58.21 3333.1

以上的样子出来后,当然通过表格格式设置,可以处理为以下样子,但我想得到列的小数位数后,去自动默认处理,除非客户再另行设置显示格式:
col1 col2 col3
1.0 255.10 1000.020
1.2 30.00 201.256
8.0 58.21 3333.100
Snowdust 2010-02-09
  • 打赏
  • 举报
回复
比如数据库中某字段类型为numberic(9, 4),有这些数据:
1.2000
1.2300
1.2340
1.0000
楼主想显示成什么样子?
QQ450659882 2010-02-09
  • 打赏
  • 举报
回复
关注中!不知道楼主想要做到什么效果
tongki 2010-02-09
  • 打赏
  • 举报
回复
引用 1 楼 snowdust 的回复:
你可以不管这个位数,在显示的时候格式化就行了。


嗯,一般情况下是不用理它。但现在我要在表格中自动格式化显示格式,由于涉及到1位、2位或3位不等的小数位时,自动根据实际数据的小数位数进行格式化显示并向右对齐。

这样的话,客户就可以在大多数时候省掉手工设置格式的工作,得到比较高的满意度,尤其在报表比较多的时候。
tianliang1 2010-02-09
  • 打赏
  • 举报
回复
好好学习,天天向上。
Snowdust 2010-02-09
  • 打赏
  • 举报
回复
你可以不管这个位数,在显示的时候格式化就行了。
lzsh0622 2010-02-09
  • 打赏
  • 举报
回复
引用 36 楼 tongki_8 的回复:
几乎所有的报表都是通过存储过程返回的。只是如果通过ado6.0的recordset可以获得,而不是ado.net没有recordset,如果DataTable没有存储列的数据精度信息,看来这个问题就很难解决了


直接查询出DataTable,也没有完整的结构信息.

我用过列的宽度信息,也是通过通过执行两次select语句完成的。
tongki 2010-02-09
  • 打赏
  • 举报
回复
引用 35 楼 lzsh0622 的回复:
引用 31 楼 tongki_8 的回复:嗯,以上方式可以从表或视图取得字段信息。但如果结果集是由存储过程返回的,如何处理?

这种方法可以独立使用,对应原始表的数据类型。与存储过程没关系。

不能依靠存储过程的返回结果,有可能在存储过程中已经改变了数据精度,甚至改变了数据类型。


几乎所有的报表都是通过存储过程返回的。只是如果通过ado6.0的recordset可以获得,而不是ado.net没有recordset,如果DataTable没有存储列的数据精度信息,看来这个问题就很难解决了
lzsh0622 2010-02-09
  • 打赏
  • 举报
回复
引用 31 楼 tongki_8 的回复:
嗯,以上方式可以从表或视图取得字段信息。但如果结果集是由存储过程返回的,如何处理?


这种方法可以独立使用,对应原始表的数据类型。与存储过程没关系。

不能依靠存储过程的返回结果,有可能在存储过程中已经改变了数据精度,甚至改变了数据类型。
wxm3630478 2010-02-09
  • 打赏
  • 举报
回复
//搞错了string
string a = "12345.10000";
string d = Convert.ToDouble(a).ToString("0.00");
//输出12345.10
string d = Convert.ToDouble(a).ToString("0.000");
//输出12345.100
string a = "1.10000";
string d = Convert.ToDouble(a).ToString("00.00");//输出01.10
wxm3630478 2010-02-09
  • 打赏
  • 举报
回复

string a = "12345.10000";
double d = Convert.ToDouble(a).ToString("0.00");
//输出12345.10
double d = Convert.ToDouble(a).ToString("0.000");
//输出12345.100
string a = "1.10000";
double d = Convert.ToDouble(a).ToString("00.00");//输出01.10
加载更多回复(23)
本课程是PowerBI系列课程之DAX函专题讲解,包含以下内容 1.  DAX函基础知识什么是DAX函学函:ABS、DIVIDE、MOD、RAND、ROUND、FIXED等日期和间函: CALENDAR、CALENDARAUTO、MONTH、YEAR、DATE、DT等信息函:USERNAME、USERPRINCIPALNAME、HASONEFILTER、HASONEVALUE、ISFILTERED、ISCROSSFILTERED、ISINSCOPE、ISBLANK、SELECTEDMEASURE、SELECTEDMEASURENAME等逻辑函:AND、OR、IF、IFERROR、SWITCH、TRUE、FALSE、COALESCE(官方文档含糊不清-结合实例)等关系函:CROSSFILTER、RELATED、RELATEDTABLE等筛选器函:FILTER、CALCULATE、ALL、ALLEXCEPT、ALLSELECTED、EARLIER、KEEPFILTERS、REMOVEFILTERS、SELECTEDVALUE、LOOKUPVALUE等父子函:PATH、PATHCONTAINS、PATHITEM、PATHLENGTH等统计函:AVERAGE、COUNT、MAX、MIN、SUM等迭代统计函:AVERAGEX、COUNTX、MAXX、MINX、SUMX、RANKX等表函: FILTERS 、ADDCOLUMNS、 SELECTCOLUMNS、 CROSSJOIN、 EXCEPT、 GENERATE、 GROUPBY、 SUMMARIZE、 SUMMARIZECOLUMNS、 TOPN、 TREATAS、 UNION、 VALUES、DISTINCT、DATATABLE、NATUALINNERJOIN、NATRUALLEFTOUTERJOIN等文本函: EXACT、MID、 FIND、 LEN、 REPT、 LOWER、 UPPER、 UNICHAR等间智能函:DATEADD、DATESMTD、FIRSTDATE、LASTDATE、SAMEPERIODLASTYEAR等财务函:2020.7之后发布的,和Excel财务函相似,网页和demo pbix简单介绍其他函:BLANK、ERROR、IFERROR等 DAX函初体验:Max、Sum、Divide、if、Values等值函表函以及表和列的概念DAX函术语、语法、运算符DAX运算符和引擎字母大小写问题DAX编程注释和快捷键DAX与Excel函的共同点和区别(PPT)DAX、xmSQL与SQL表达式的区别(PPT)DAX函的自学途径 2.  PowerBI据建模知识维度建模关系传递和交叉筛选器方向-理解表关系(1v1, 1vM, Mv1,MvM)两个方向上应用安全筛选器关闭关系自动检测新建计算列新建度量值新建计算表:辅助表(五种方式)、日历表类型讲解据格式控制:%、$、千位分隔符、、日期格式Format函自定义据格式Convert函类型转换解决单位 万 的显示问题Date和DT函定义固定日期值显示和隐藏列DAX代码分析器阅读DAX表达式方法:从上至下、由内到外(注意Calculate的计算顺序)调试DAX表达式方法:分布输出或VAR输出3.  DAX函原理 Vertipaq列式据库原理理解度量值和计算列理解行上下文和筛选上下文:Calculate示意图行上下文使用VAR替代EARLIERVAR变量在定义的上下文计算VAR变量是采用惰性计算(使用计算)理解扩展表和RELATED函理解据沿袭Lineage 4.  开始感知DAX函的强大DAX函实现特殊符号的使用DAX函实现切片器默认当前月或天DAX函使切片器默认代表无任何选择DAX函使切片器仅显示有据的选项DAX函使切片器反向筛选和计算DAX函使切片器之间取并集DAX函使关系多端的切片器筛选一端的切片器 DAX函实现年月共同决定据排序DAX函实现动态图表标题DAX函实现动态图表配色和图标DAX函实现动态纵坐标DAX函实现动态横坐标5.  理解重点DAX函之重FILTER 和 CALCULATE和CALCULATETABLE详解调节器REMOVEFILTERS和ALL、ALLEXCEPT函调节器ALL、ALLSELECTED和ISINSCOPE占比分析调节器AllSELECTED和KEEPFILTERS的比较调节器USERELATIONSHIP激活关系调节器TREATAS动态建立关系调节器CROSSFILTER改变筛选器方向重点之ISFILTERED和ISCROSSFILTERED重点之HASONEVALUE和ISINSCOPE的区别重点之表函SELECTEDCOLUMNS和ADDCOLUMNS重点之表函NATUALINNERJOIN和NATRUALLEFTOUTERJOIN重点之表函FILTERS和VALUES比较重点之VALUES和DISTINCT的区别重点之分组函SUMMARIZECOLUMNS详解重点之函LOOKUPVALUE vs RELATED vs VLOOKUP 重点之集合函UNION、INTERSECT、EXCEPT重点之集合函CROSSJOIN和GENERATE 笛卡尔积重点之值合并、列合并、表合并CONCATENATEX重点之BLANK行产生的原因和BLANK相关函重点之COALESCE函处理空重点之FIRSTNOBLANK和FIRSTNOBLANKVALUE函重点之使用VAR变量表的列重点之Error和IfError函6.  实际案例-日期间和间智能相关关键点-日期表和事实表关联问题间智能-同比环比分析间智能-累计聚合、滚动聚合、移动平均间智能-期初期末库存分析日期分析-计算任意所选月份的环比日期分析-周的同比环比和周聚合日期分析-指定月份的同比环比和季度环比日期分析-计算季末或季末月份的据日期分析-趋势图根据最近月份取TopN日期分析-动态指定某个日期区间分析日期分析-动态任意区间段做据对比日期分析-实现两个日期列的范围筛选日期分析-按工作日计算日期差日期分析-计算最近两次购买日期差日期分析-根据历史据做销售预测日期间函间智能函使用总结7.  实际案例-DAX函进阶进阶-解决列排序对计算的影响进阶-实现切片器筛选之间的OR逻辑进阶-矩阵Matrix高亮显示最大值最小值进阶-DAX列转行 vs 矩阵列转行和逆透视进阶-非日期类型的累计聚合进阶-排名逻辑的4种实现-RANKX详解进阶-分组内排名的实现和理解迭代函进阶-TopN/BottomN和Others的实现进阶-TopN实现动态指标进阶-TopN实现N的动态进阶-分组内动态TopN和Others 进阶-商品折上折-迭代函SUMX详解 进阶-分析客户购买行为进阶-找出无购买行为的客户进阶-客户购买商品关联度分析 进阶-新客户分析进阶-流失客户分析进阶-回流客户分析进阶-客户购买频次和区间分析进阶-RFM客户价值分析进阶-帕累托分析进阶-盈亏平衡分析报表性能优化思路(PPT)  

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧