在 MSSQL 中将 bigint 转换为 varchar

Posted

技术标签:

【中文标题】在 MSSQL 中将 bigint 转换为 varchar【英文标题】:Converted bigint to varchar in MSSQL 【发布时间】:2015-11-10 23:41:52 【问题描述】:

我有这个专栏 ContactNo 和其他类似的专栏,例如 FaxNo 等。

问题在于 MSSQL 中这些列被定义为 bigint,我在 MSSQL 中使用 Management Studio 将它们更改为 varchar:

我想将它从 int 更改为 varchar/string 的唯一原因是我可以在开始时使用“0”。和 int 一样,我不能在开头加上“0”。

我认为我还需要对数据集进行更改,因此我还更新了 WPF 中的数据集。在数据集中将同一表的同一列从 System.Int64 更改为 System.String

但即使我仍然收到此错误:

Specified Cast is not valid

如果我将类型改回它们之前的任何类型,它工作正常,但那些大 int 类型不允许零。

当我进行调试时,看到这个黄色突出显示。之后直接跳转到异常错误:

更新 1

【问题讨论】:

尝试删除DataSet1.xsd中修改的表并重新添加。 您确定要更改数据库只是为了能够显示带有前导 0 的数字吗?当您显示值时,听起来在 GUI 中做得更好?请记住,如果将这些数字转换为字符串,那么根据这些数字进行排序/过滤之类的操作会很痛苦。 完全应该用字符串格式而不是格式化数据库 好的,如果您需要能够区分 001234 和 0001234,那么您是对的,您需要将类型更改为字符串,因为它不再是真正的数字了。 @SizzlingCode:请忽略任何告诉您保留传真号码为BIGINT 的人。电话号码不是“数字”,因为您从不对它们进行数学运算或对其进行排序。它们是字符串,这个字段本来就不应该是BIGINT。所以你改变它是正确的。电话号码的数字类型不仅不能存储前导零,而且也不能存储分机号或国际号码,例如 +1 12 1231 1231。此外,您最后一张带有GetTable<AgentAccount> 的图片是无用的,因为它不是一个定义。 AgentAccount 类的定义是什么? 【参考方案1】:

我怀疑您在 AgentAccount 中有一个尚未更新为字符串的字段,它仍然是一个 int。因此,演员阵容失败。在代码中选择 AgentAccount,按 F12 跳转到定义,然后将字段更新为字符串。那么一切都应该正常。

【讨论】:

【参考方案2】:

由于您已经在底层数据库中进行了更改,您需要在程序中做的所有事情就是重新生成您输入的数据集代码。这应该可以解决所有此类问题。

试试这个:

关闭所有窗口并打开Dataset1.xsd(设计师)。在设计器表面上做一些事情,迫使它重新生成代码。大多数时候,即使只是稍微移动一张桌子也可以解决问题。但如果它不只是右键单击并添加一个虚拟适配器,则保存然后将其删除并再次保存。 (目的是让它重新生成自动生成的代码)。

对您可能拥有的更多类型数据集重复该过程。 (我在屏幕截图中看到一个名为 RMSDatabase2Dataset.xsd)。

最后保存所有内容并完全重建项目。

【讨论】:

【参考方案3】:

如果您只想在 UI 中显示前导零,您可以使用字符串格式进行绑定,也可以使用转换器。 但是如果你需要在数据库中保存前导零的值,那么最好将类型更改为varchar。

其次,您使用的是数据集还是 LINQ to SQL 类?示例代码似乎两者都有,我假设您正在使用 DataClassesDataContext.AgentAccount 属性中的适配器获取数据。

确保查询返回数据,否则您将无法获得异常,因为不会有任何对象要转换。

在一个简单的数据集中执行相同的步骤时,一切正常,因为当您修改 Dataset.ContactNo 并保存文件时,它会反映在所有相关位置。

【讨论】:

【参考方案4】:

编辑

在仔细检查了您的代码(此处未显示)后,有两个方面存在问题。

一个是数据注释,另一个仍在 xaml.cs 中转换为 longint

像这样更改数据类型时,可能会非常繁琐,我们需要遍历代码中处理该字段的每个文件。

很高兴你解决了你的问题,我们都理解碰壁的挫败感:)


这可能是由 MSSERVER 中的设置引起的:

转到选项并取消勾选防止保存需要重新创建表格的更改。因为您可能会在项目的某些部分更改表格,但更改并未保存在数据库中。所以会有一个强制转换异常,因为它正在寻找一个 bigint 而不是一个 varchar。

【讨论】:

更改请救救先生。实施更改后,我得到了这个指定的转换错误.. 先生,我的程序使用 bigint,但是当我更改为 nvarchar 时,我的程序开始出错。所以这意味着列的数据类型会发生变化。我已经勾选了“防止保存更改”, 类似的东西。我还更改了数据集中的值,并且 agentaccount 类具有私有属性,所以我也在那里从 long 更改为 string..private long _ContactNo; 非常感谢问题已解决。【参考方案5】:

从您上传的DataSet1.xsd 图像,ContactNoMaxLength 属性是-1

ContactNoSystem.Int64 更改为System.String 后,您还应该将ContactNoMaxLength-1 更改为30

【讨论】:

已经这样做了.. 但这没有用:( 仍然有同样的错误。 您使用过 Linq To Sql 类?对吗?

以上是关于在 MSSQL 中将 bigint 转换为 varchar的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala 中将 BIGINT 转换为 TIMESTAMP

如何在 JavaScript 中将 BigInt 转换为 Number?

如何在 Redshift 中将 BIGINT 转换为 DATE?

在Postgres中将十六进制字符串转换为bigint [重复]

在 SQL Server 中将 int 主键转换为 bigint

时间戳到 Bigint (MSSQL) 与 DT_BYTES 到 DT_I8 (SSIS)