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

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

VB6中,可以通过recordSet来获取。但Datatable.Columns[i]中,好像没有这个小数位数的属性?
...全文
1533 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)
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 Altium Designer 18是一款功能丰富的电子设计自动化工具,其集成了电路原理图绘制、PCB布局规划、三维视图展示、电路仿真分析以及生产文件生成等多项核心功能,为电子工程师们提供了一个全面的硬件设计解决方案。该软件的官方文指导材料系统地阐述了从项目初始阶段到最终完成的全过程操作方法。 在“AD18 官方文指导材料”,使用者可以掌握以下核心内容要点: 1. **系统配置与界面认知**:熟悉Altium Designer 18的工作平台,涵盖菜单选项、工具栏配置、工作区域安排,以及个性化工作界面的设定方法。 2. **项目创建流程**:掌握如何建立新的项目工程,包括工程参配置、项目模板选取,以及项目文件的添加操作。 3. **电路图绘制技术**:学习电路原理图的绘制流程,包括元件库的维护管理、元件放置技巧、连接线路绘制、属性编辑操作,以及网络表的自动生成方法。 4. **元件库构建与管理**:了解如何建立自定义元件库,执行元件的导入与导出任务,以及利用Altium Designer自带的元件资源库。 5. **PCB布局设计方法**:掌握PCB设计的基本准则,如元件布局策略、布线技巧、层叠结构调整、布线规则优化,以及冲突检测与短路处理技术。 6. **设计规范与约束条件**:理解设定设计规范和电气约束条件的关键性,包括间距参设定、焊盘尺寸规格、过孔尺寸要求等,以及运用规则检查进行设计验证的流程。 7. **三维模型整合应用**:学习如何将三维模型与PCB设计内容相结合,以实现更为直观的机械配合验证。 8. **电路性能仿真技术**:掌握使用Altium Des...
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### 接口测试知识要点说明 #### 一、接口测试的定义及分类 1. **概念阐释**: - 接口测试作为软件测试的关键环节,主要对系统之间的交互点进行验证。 - 它旨在核实接口的正确性、稳定性和功能性,保障各个系统组件能够依照预期执行交互操作。 2. **实施情境**: - 适用于多系统联合开发的环境。 - 适用于包含多个子系统的复杂应用系统开发过程。 3. **适用范围**: - 为其他系统提供支持的底层基础架构系统。 - 负责协调心服务的系统架构。 4. **分类标准**: - **模块接口测试**:通常作为单元测试的一部分,适用于独立构建的功能模块。 - **Web接口测试**: - **服务端接口测试**:针对客户端与服务器端之间的接口进行验证。 - **外部接口测试**:对第三方提供的接口进行测试,例如支付平台提供的授权登录接口。 5. **测试角度**: - **接口功能验证**:核实接口功能是否满足预期要求。 - **接口性能评估**:衡量接口的处理能力及响应间。 - **接口稳定性考察**:检测接口在长间运行的表现情况。 - **接口安全检测**:确保接口能够抵御非法访问或据篡改。 6. **测试手法**: - **参细致测试**:深入测试接口的输入参和输出结果。 - **场景模拟测试**:依据实际业务场景进行测试验证。 #### 二、接口测试的详细流程 1. **测试规划**: - 明确测试范围、目标及所需资源。 - 规划测试策略,选择适宜的工具和技术手段。 2. **测试用例设计**: - 依据需求文档和接口规格文档设计测试用例。 - 覆...
内容概要:本文研究基于遗传算法(GA)与粒子群算法(PSO)相结合的无人机三维路径规划方法,旨在解决无人机在复杂三维环境避障与路径优化的关键问题。通过构建包含障碍物、威胁区域等约束的三维仿真环境,系统实现了GA与PSO两种智能优化算法的Matlab代码,并对其在路径规划的性能进行全面对比分析,重点关注路径长度、飞行安全性、算法收敛速度等核心指标。研究充分利用GA的全局搜索能力与PSO的快速局部收敛特性,提出一种混合优化策略,有效克服单一算法易陷入局部最优或收敛缓慢的缺陷。文不仅详细阐述了算法的设计流程、学模型与实现细节,还提供了完整的仿真结果,验证了所提混合方法在复杂动态场景下的优越性、有效性和鲁棒性,为无人机自主导航提供了可靠的理论依据和技术方案。; 适合人群:具备一定Matlab编程基础和优化算法理论知识,从事无人机系统设计、智能控制、路径规划、人工智能应用等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市峡谷、山区、灾害救援等复杂三维环境的无人机自主避障与最优任务路径规划;②为智能优化算法(GA、PSO及其混合策略)的学习、性能对比与工程化应用提供详实的实践案例和代码参考;③服务于高校科研教学、算法原型快速复现、以及在此基础上的进一步改进与创新研究。; 阅读建议:建议读者结合所提供的Matlab代码进行仿真运行与调试,深入理解两种算法的参设置、适应度函设计及路径生成机制,可通过修改环境地图、增加动态障碍物或调整优化目标函等方式进行扩展性研究,以深化对算法本质和应用场景的理解。
内容概要:LTK8870S是一款单通道H桥有刷直流电机驱动器,支持6.5V至20V工作电压,具备3.0A峰值电流驱动能力,适用于打印机、家用电器及工业设备等机电一体化应用。该芯片采用PWM控制接口,可通过IN1和IN2逻辑输入实现电机正转、反转、滑行与制动等多种工作模式,并支持快衰减和慢衰减两种电流衰减方式以优化电机控制性能。器件集成电流调节功能,通过VREF引脚和外部检测电阻设定限流值,有效控制电机电流并降低系统功耗。同具备低功耗休眠模式,在IN1和IN2均为低电平自动进入,显著节省能耗。LTK8870S还集成了多重保护机制,包括VM欠压锁定(UVLO)、过温保护(TSD)、过流保护(OCP)及自动故障恢复功能,提升系统可靠性。其ESOP-8封装带裸露焊盘,利于散热,符合无铅环保标准。; 适合人群:电子硬件工程师、电机控制系统开发者、嵌入式系统设计人员,尤其适用于从事电机驱动电路设计的级技术人员。; 使用场景及目标:①用于控制小型有刷直流电机的正反转与调速;②应用于需要电流限制和节能休眠功能的电池供电设备;③作为工业自动化、智能家电或办公设备的核心驱动模块;④帮助开发者理解H桥驱动、PWM调速、电流衰减模式及保护电路的设计原理。; 阅读建议:此资源技术细节丰富,建议结合典型应用电路图与电气参表进行硬件设计参考,重点关注PWM控制逻辑、电流调节设置及保护机制的实现方式,并在实际应用配合示波器调试输出波形与电流响应。

111,129

社区成员

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

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

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