当我使用, 和另一个表名进行批量插入时出现此错误:select * from [table_name]
the locale id '0' of the source column 'PAT_NUM_ADT' and the locale id '1033'
of the destination column 'PAT_ID_OLD' do not match
我尝试重置我的数据库排序规则,但这没有帮助。
有没有人看到这个错误?
当我使用, 和另一个表名进行批量插入时出现此错误:select * from [table_name]
the locale id '0' of the source column 'PAT_NUM_ADT' and the locale id '1033'
of the destination column 'PAT_ID_OLD' do not match
我尝试重置我的数据库排序规则,但这没有帮助。
有没有人看到这个错误?
如果您要从一个表复制不到一组完整的字段到另一个,无论该表是在世界各地的另一个域中,还是并置在同一个数据库中,您只需按顺序选择它们。SqlBulkCopyColumnMappings 不起作用。是的,我试过了。我使用了所有四个可能的构造函数,并将它们都用作 SqlBulkCopyMapping 对象,并且只是通过向 SqlBulkCopy.ColumnMappings.Add 的 Add 方法提供相同的信息。
我的列名称相同。如果您使用不同的名称和不同的顺序,您可能会发现您实际上必须重命名列。祝你好运。
批量复制一些数据时,我刚刚收到此错误消息。虽然它可能与您遇到的问题不完全相同,但我遇到了同样的错误。
具体来说,我正在执行以下操作:SELECT NULL AS ColumnName ...
目标是一个可为空的 varchar(3)。
在这种情况下,我需要做的就是按如下方式更新我的选择语句:SELECT CONVERT(VARCHAR(3),NULL) AS ColumnName...
这工作得很好,错误消息消失了!
没错,当我们使用 SqlBulkCopy 时,有时它会出错,这是使用 SqlBulkCopy 时映射列的最佳方式。
我以前的代码:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak; Pooling=true; Max pool size=200; Min pool size=0");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name,Class,Section,RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer; Pooling=true; Max pool size=200; Min pool size=0");
sbc.DestinationTableName = "StudentTrans";
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
代码给我的错误是:源列“RollNo”的区域设置 ID“0”和目标列“部分”的区域设置 ID“1033”不匹配。
现在在列映射后我的代码运行成功。
我的修改代码是:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak;");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name,Class,Section,RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer;");
sbc.DestinationTableName = "StudentTrans";
sbc.ColumnMappings.Add("Name", "Name");
sbc.ColumnMappings.Add("Class", "Class");
sbc.ColumnMappings.Add("Section", "Section");
sbc.ColumnMappings.Add("RollNo", "RollNo");
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
此代码运行成功。
萨尔的回答
如果您要从一个表复制不到一组完整的字段到另一个,无论该表是在世界各地的另一个域中,还是并置在同一个数据库中,您只需按顺序选择它们。SqlBulkCopyColumnMappings 不起作用。
根据我的工作是绝对正确的!感谢您发布它。一切都必须相同 - 数据类型等。每次发现不匹配时,它都会抛出神秘的 Locale Id 错误 - 有趣但令人沮丧的是 h###。
我遇到了同样的错误,结果我正在从 DataTable 中的 VARCHAR 列复制到 INT。
在我更改数据类型后,它完美无缺。我成功复制了字段子集,指定了正确的字段映射(映射由字段名称或序列号工作)。
因此,请确保您的数据类型正确。
我会检查您的默认语言环境设置是什么。此外,您需要使用 sp_help 检查两个表的语言环境,以验证它们是否相同。如果不是,您需要将其转换为正确的语言环境
当您更改数据库的排序规则时,表列会保留旧的排序规则,因此您需要删除表并重新创建它们。
非常感谢 Deepak Dwivedi 的帮助。这里有更多关于COLLATE DATABASE_DEFAULT的技巧,它最终为我解决了问题:
SqlConnectionStringBuilder cb = new SqlConnectionStringBuilder("Data Source=ServerName;User Id=userid;Password=****;Initial Catalog=Deepak;");
SqlConnection con = new SqlConnection(cb.ConnectionString);
SqlCommand cmd = new SqlCommand("select Name COLLATE DATABASE_DEFAULT Name ,Class COLLATE DATABASE_DEFAULT Class ,Section COLLATE DATABASE_DEFAULT Section ,RollNo COLLATE DATABASE_DEFAULT RollNo from Student", con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
SqlBulkCopy sbc = new SqlBulkCopy("Data Source=DestinationServer;User Id=destinationserveruserid;Password=******;Initial Catalog=DeepakTransfer;");
sbc.DestinationTableName = "StudentTrans";
sbc.ColumnMappings.Add("Name", "Name");
sbc.ColumnMappings.Add("Class", "Class");
sbc.ColumnMappings.Add("Section", "Section");
sbc.ColumnMappings.Add("RollNo", "RollNo");
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
调试此问题的一个好方法是将 SqlBulkCopy 中使用的 sql 查询作为选择输入在管理工作室中运行,例如,更改select * from [table_name]
为select * into newTable from [table_name]
,然后查看“newTable”与“table_name”的可空性和数据类型'。如果有任何差异,那么您很可能最终会遇到这种误导性错误。调整查询或目标表直到它们匹配,然后您的命令将起作用。