在 MSSQL 中将 bigint 转换为 varchar
Converted bigint to varchar in MSSQL
我有这个专栏 ContactNo
和其他类似的内容,例如 FaxNo
等等
问题出在 MSSQL 中,这些列被定义为 bigint,我在 MSSQL 中使用 Management Studio 将它们更改为 varchar:
我想将它从 int 更改为 varchar/string 的唯一原因是我可以在开始时使用“0”。与在 int 中一样,我不能在开头输入“0”。
我想我还需要更改数据集,所以我也更新了 WPF 中的数据集。在数据集中,将相同 table 的同一列从 System.Int64
更改为 System.String
但即使我仍然得到这个错误:
Specified Cast is not valid
如果我将类型改回它们之前的任何类型,它工作正常,但那些大的 int 类型不允许零。
当我调试时,看到这个黄色突出显示。之后直接跳转到异常error:
更新 1
根据您上传的 DataSet1.xsd
张图片,ContactNo
的 MaxLength
属性 是 -1
。
将 ContactNo
从 System.Int64
更改为 System.String
后,您还应该将 ContactNo
的 MaxLength
从 -1
更改为 30
.
我怀疑您在 AgentAccount 中有一个字段尚未更新为字符串,它仍然是一个 int。因此,演员表失败了。 Select AgentAccount 在代码中,按F12 跳转到定义,然后将字段更新为字符串。然后一切都应该工作。
由于您已经在基础数据库中进行了更改,您需要在程序中做的就是重新生成您的类型化数据集代码。这应该可以解决所有这些问题。
试试这个:
关闭所有 windows 并打开 Dataset1.xsd
(设计器)。在设计器表面上做一些事情,迫使它重新生成代码。大多数时候,甚至只是稍微移动其中一张桌子就可以解决问题;但如果它不只是右键单击并添加一个虚拟适配器,则保存然后删除它并再次保存。 (目的是让它重新生成自动生成的代码)
对您可能拥有的任何更多类型化数据集重复该过程。 (我在屏幕截图中看到一个名为 RMSDatabase2Dataset 的 xsd)。
最后保存所有内容并完全重建项目。
如果您只想在 UI 中显示前导零,您可以使用字符串格式进行绑定,也可以使用转换器。
但是如果你需要在数据库中保存前导零的值,那么最好将类型更改为varchar。
其次,您使用的是 Datasets 还是 LINQ to SQL 类?示例代码似乎都有,我假设您正在使用 DataClassesDataContext.AgentAccount 属性.
中的适配器获取数据
确保查询 returns 数据,否则您将无法获得异常,因为没有任何对象可以转换。
在简单数据集中执行相同的步骤时,一切正常,因为当您修改 Dataset.ContactNo 并保存文件时,它会反映在所有相关位置。
编辑
在广泛检查您的代码后,这里没有显示,有两个地方有问题。
一个是数据注释,另一个仍在 xaml.cs
中转换为 longint
像这样更改数据类型时,它可能非常繁琐,我们需要遍历代码中处理该字段的每个文件。
很高兴你解决了问题,我们都理解碰壁的挫败感:)
这可能是由 MSSERVER 中的设置引起的:
转到选项并取消勾选 防止保存需要table 重新创建的更改。因为您可能会在项目的某些部分更改 table,但更改不会保存在数据库中。所以会有一个转换异常,因为它正在寻找 bigint 而不是 varchar。
我有这个专栏 ContactNo
和其他类似的内容,例如 FaxNo
等等
问题出在 MSSQL 中,这些列被定义为 bigint,我在 MSSQL 中使用 Management Studio 将它们更改为 varchar:
我想将它从 int 更改为 varchar/string 的唯一原因是我可以在开始时使用“0”。与在 int 中一样,我不能在开头输入“0”。
我想我还需要更改数据集,所以我也更新了 WPF 中的数据集。在数据集中,将相同 table 的同一列从 System.Int64
更改为 System.String
但即使我仍然得到这个错误:
Specified Cast is not valid
如果我将类型改回它们之前的任何类型,它工作正常,但那些大的 int 类型不允许零。
当我调试时,看到这个黄色突出显示。之后直接跳转到异常error:
更新 1
根据您上传的 DataSet1.xsd
张图片,ContactNo
的 MaxLength
属性 是 -1
。
将 ContactNo
从 System.Int64
更改为 System.String
后,您还应该将 ContactNo
的 MaxLength
从 -1
更改为 30
.
我怀疑您在 AgentAccount 中有一个字段尚未更新为字符串,它仍然是一个 int。因此,演员表失败了。 Select AgentAccount 在代码中,按F12 跳转到定义,然后将字段更新为字符串。然后一切都应该工作。
由于您已经在基础数据库中进行了更改,您需要在程序中做的就是重新生成您的类型化数据集代码。这应该可以解决所有这些问题。
试试这个:
关闭所有 windows 并打开 Dataset1.xsd
(设计器)。在设计器表面上做一些事情,迫使它重新生成代码。大多数时候,甚至只是稍微移动其中一张桌子就可以解决问题;但如果它不只是右键单击并添加一个虚拟适配器,则保存然后删除它并再次保存。 (目的是让它重新生成自动生成的代码)
对您可能拥有的任何更多类型化数据集重复该过程。 (我在屏幕截图中看到一个名为 RMSDatabase2Dataset 的 xsd)。
最后保存所有内容并完全重建项目。
如果您只想在 UI 中显示前导零,您可以使用字符串格式进行绑定,也可以使用转换器。 但是如果你需要在数据库中保存前导零的值,那么最好将类型更改为varchar。
其次,您使用的是 Datasets 还是 LINQ to SQL 类?示例代码似乎都有,我假设您正在使用 DataClassesDataContext.AgentAccount 属性.
中的适配器获取数据确保查询 returns 数据,否则您将无法获得异常,因为没有任何对象可以转换。
在简单数据集中执行相同的步骤时,一切正常,因为当您修改 Dataset.ContactNo 并保存文件时,它会反映在所有相关位置。
编辑
在广泛检查您的代码后,这里没有显示,有两个地方有问题。
一个是数据注释,另一个仍在 xaml.cs
中转换为 longint像这样更改数据类型时,它可能非常繁琐,我们需要遍历代码中处理该字段的每个文件。
很高兴你解决了问题,我们都理解碰壁的挫败感:)
这可能是由 MSSERVER 中的设置引起的:
转到选项并取消勾选 防止保存需要table 重新创建的更改。因为您可能会在项目的某些部分更改 table,但更改不会保存在数据库中。所以会有一个转换异常,因为它正在寻找 bigint 而不是 varchar。